<?php
|
|
namespace SparkLib\Application;
|
|
|
|
use \SparkLib\HTML;
|
|
use \SparkLib\Application\Action;
|
|
|
|
/**
|
|
* A class to model links within Applications. Used by
|
|
* Application&link(), etc.
|
|
*/
|
|
class Link extends HTML implements Action {
|
|
|
|
protected $_controller;
|
|
protected $_id;
|
|
protected $_action;
|
|
protected $_url;
|
|
protected $_anchor;
|
|
protected $_params;
|
|
protected $_title;
|
|
protected $_type = '';
|
|
protected $_target = '';
|
|
|
|
protected $_redirectStatus = 302;
|
|
|
|
/**
|
|
* Make a new link.
|
|
*
|
|
* @param string base URL to link
|
|
* @param string controller to link
|
|
*/
|
|
public function __construct ($url, $controller)
|
|
{
|
|
$this->_url = $url;
|
|
$this->_controller = $controller;
|
|
}
|
|
|
|
/**
|
|
* get the controller
|
|
*
|
|
* @return string controller
|
|
*/
|
|
public function getController ()
|
|
{
|
|
return $this->_controller;
|
|
}
|
|
|
|
/**
|
|
* Set an id
|
|
*
|
|
* @param integer id
|
|
* @return Link
|
|
*/
|
|
public function id ($id)
|
|
{
|
|
$this->_id = $id;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set an action
|
|
*
|
|
* @param string action
|
|
* @return Link
|
|
*/
|
|
public function action ($action)
|
|
{
|
|
$this->_action = $action;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* get the action
|
|
*
|
|
* @return string action
|
|
*/
|
|
public function getAction ()
|
|
{
|
|
return $this->_action;
|
|
}
|
|
|
|
/**
|
|
* Set a target anchor.
|
|
*
|
|
* @param string name of target anchor
|
|
* @return Link
|
|
*/
|
|
public function anchor ($target)
|
|
{
|
|
$this->_anchor = (0 === strpos($target, '#') ? $target : '#' . $target);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set the target attribute.
|
|
*
|
|
* @param string name of the target type
|
|
* @return Link
|
|
*/
|
|
public function target ($target)
|
|
{
|
|
$this->_target = $target;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set a target type (html, json, csv, etc.)
|
|
*
|
|
* @param string name of type
|
|
* @return Link
|
|
*/
|
|
public function type ($type)
|
|
{
|
|
$this->_type = $type;
|
|
return $this;
|
|
}
|
|
|
|
protected function renderType ()
|
|
{
|
|
if ($this->_type)
|
|
return '.' . $this->_type;
|
|
else
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Set request parameters, eg: link/id?foo=bar&baz=bat
|
|
*
|
|
* @param mixed params can be an array or string of parameters
|
|
* @return Link
|
|
*/
|
|
public function params ($params)
|
|
{
|
|
if(is_array($params))
|
|
$this->_params = '?' . http_build_query($params);
|
|
elseif(is_string($params))
|
|
$this->_params = (0 === strpos($params, '?') ? $params : '?' . $params);
|
|
else
|
|
throw new \Exception('Unknown param type in Link');
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set a human-readable title.
|
|
*
|
|
* @param string $title
|
|
* @return Link
|
|
*/
|
|
public function title ($title)
|
|
{
|
|
$this->_title = $title;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set an HTTP status code in case we generate a Redirect later in
|
|
* redirect().
|
|
*
|
|
* @param integer $status
|
|
* @return Link
|
|
*/
|
|
public function redirectStatus ($status)
|
|
{
|
|
$this->_redirectStatus = $status;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the currently set title.
|
|
*
|
|
* @return string title, null if not set
|
|
*/
|
|
public function getTitle ()
|
|
{
|
|
return $this->_title;
|
|
}
|
|
|
|
/**
|
|
* Stringify the current link
|
|
*
|
|
* @return string current path
|
|
*/
|
|
public function __toString ()
|
|
{
|
|
return $this->path();
|
|
}
|
|
|
|
/**
|
|
* Return a link tag for the current link.
|
|
*
|
|
* @param string optional text for link
|
|
* @param array optional attributes for a tag
|
|
* @return string link tag
|
|
*/
|
|
public function a ($linktext = null, array $attribs = array())
|
|
{
|
|
// If we didn't get any link text, come up with a default
|
|
if (! isset($linktext))
|
|
$linktext = $this->_controller . ' ' . $this->_action . ' ' . $this->_id;
|
|
|
|
$attribs['href'] = $this->path();
|
|
if (isset($this->_title))
|
|
$attribs['title'] = $this->_title;
|
|
|
|
if( $this->_target != '' )
|
|
$attribs['target'] = $this->_target;
|
|
|
|
return $this->makeTag('a', $attribs, $linktext);
|
|
}
|
|
|
|
/**
|
|
* Kind of a silly utility function. Maybe we should make this more magical
|
|
* and shiny in future.
|
|
*/
|
|
public function a_titled ($linktext = null, array $attribs = array())
|
|
{
|
|
$title = mb_strtolower($linktext ? $linktext : $this->path());
|
|
return $this->a($linktext, array('title' => $title));
|
|
}
|
|
|
|
/**
|
|
* @return string path for current link
|
|
*/
|
|
public function path ()
|
|
{
|
|
$path = array();
|
|
$target = '';
|
|
if (isset($this->_controller)) $path[] = $this->_controller;
|
|
if (isset($this->_id)) $path[] = $this->_id;
|
|
if (isset($this->_action)) $path[] = $this->_action;
|
|
|
|
$base = rtrim($this->_url, '/');
|
|
return $base . '/' . implode('/', $path) . $this->renderType() . $this->_params . $this->_anchor;
|
|
}
|
|
|
|
/**
|
|
* @return \SparkLib\Application\Redirect for current link
|
|
*/
|
|
public function redirect ($status = null)
|
|
{
|
|
if (isset($status))
|
|
$this->redirectStatus($status);
|
|
|
|
return new Redirect($this->path(), $this->_redirectStatus);
|
|
}
|
|
|
|
/**
|
|
* If this is used as an Action, returned from a Controller action method
|
|
* (yes I know the terminology overlaps confusingly), redirect.
|
|
*
|
|
* So basically you can say:
|
|
*
|
|
* $this->respondTo()->html = function () {
|
|
* return $this->app()->link('orders');
|
|
* };
|
|
*
|
|
* ...and it'll infer the ->redirect() call.
|
|
*/
|
|
public function fire ()
|
|
{
|
|
$this->redirect()->fire();
|
|
}
|
|
|
|
}
|