_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(); } }