diff options
author | Frederic Guillot <fred@kanboard.net> | 2015-05-24 16:02:25 -0400 |
---|---|---|
committer | Frederic Guillot <fred@kanboard.net> | 2015-05-24 16:02:25 -0400 |
commit | eeac2329baab1fdae7cbf6c707ed2ffd8beb4c1b (patch) | |
tree | 511c2fe47f8fbb1ea90e59e7a7a7f5e3530aa9ed /app/Core | |
parent | 65e9e5d1bed9f88ecfd43eb2c1e780a7c22c151f (diff) |
Helpers refactoring
Diffstat (limited to 'app/Core')
-rw-r--r-- | app/Core/Base.php | 110 | ||||
-rw-r--r-- | app/Core/FileCache.php | 41 | ||||
-rw-r--r-- | app/Core/Helper.php | 786 | ||||
-rw-r--r-- | app/Core/Markdown.php | 14 | ||||
-rw-r--r-- | app/Core/Paginator.php | 6 |
5 files changed, 145 insertions, 812 deletions
diff --git a/app/Core/Base.php b/app/Core/Base.php new file mode 100644 index 00000000..cb8e4487 --- /dev/null +++ b/app/Core/Base.php @@ -0,0 +1,110 @@ +<?php + +namespace Core; + +use Pimple\Container; + +/** + * Base class + * + * @package core + * @author Frederic Guillot + * + * @property \Core\Helper $helper + * @property \Core\HttpClient $httpClient + * @property \Core\Paginator $paginator + * @property \Core\Request $request + * @property \Core\Session $session + * @property \Core\Template $template + * @property \Integration\BitbucketWebhook $bitbucketWebhook + * @property \Integration\GithubWebhook $githubWebhook + * @property \Integration\GitlabWebhook $gitlabWebhook + * @property \Integration\HipchatWebhook $hipchatWebhook + * @property \Integration\Jabber $jabber + * @property \Integration\MailgunWebhook $mailgunWebhook + * @property \Integration\PostmarkWebhook $postmarkWebhook + * @property \Integration\SendgridWebhook $sendgridWebhook + * @property \Integration\SlackWebhook $slackWebhook + * @property \Model\Acl $acl + * @property \Model\Action $action + * @property \Model\Authentication $authentication + * @property \Model\Board $board + * @property \Model\Budget $budget + * @property \Model\Category $category + * @property \Model\Color $color + * @property \Model\Comment $comment + * @property \Model\Config $config + * @property \Model\Currency $currency + * @property \Model\DateParser $dateParser + * @property \Model\File $file + * @property \Model\HourlyRate $hourlyRate + * @property \Model\LastLogin $lastLogin + * @property \Model\Link $link + * @property \Model\Notification $notification + * @property \Model\Project $project + * @property \Model\ProjectActivity $projectActivity + * @property \Model\ProjectAnalytic $projectAnalytic + * @property \Model\ProjectDuplication $projectDuplication + * @property \Model\ProjectDailySummary $projectDailySummary + * @property \Model\ProjectIntegration $projectIntegration + * @property \Model\ProjectPermission $projectPermission + * @property \Model\Subtask $subtask + * @property \Model\SubtaskExport $subtaskExport + * @property \Model\SubtaskForecast $subtaskForecast + * @property \Model\SubtaskTimeTracking $subtaskTimeTracking + * @property \Model\Swimlane $swimlane + * @property \Model\Task $task + * @property \Model\TaskCreation $taskCreation + * @property \Model\TaskDuplication $taskDuplication + * @property \Model\TaskExport $taskExport + * @property \Model\TaskFinder $taskFinder + * @property \Model\TaskFilter $taskFilter + * @property \Model\TaskLink $taskLink + * @property \Model\TaskModification $taskModification + * @property \Model\TaskPermission $taskPermission + * @property \Model\TaskPosition $taskPosition + * @property \Model\TaskStatus $taskStatus + * @property \Model\TaskValidator $taskValidator + * @property \Model\Timetable $timetable + * @property \Model\TimetableDay $timetableDay + * @property \Model\TimetableExtra $timetableExtra + * @property \Model\TimetableOff $timetableOff + * @property \Model\TimetableWeek $timetableWeek + * @property \Model\Transition $transition + * @property \Model\User $user + * @property \Model\UserSession $userSession + * @property \Model\Webhook $webhook + */ +abstract class Base +{ + /** + * Container instance + * + * @access protected + * @var \Pimple\Container + */ + protected $container; + + /** + * Constructor + * + * @access public + * @param \Pimple\Container $container + */ + public function __construct(Container $container) + { + $this->container = $container; + } + + /** + * Load automatically models + * + * @access public + * @param string $name Model name + * @return mixed + */ + public function __get($name) + { + return $this->container[$name]; + } +} diff --git a/app/Core/FileCache.php b/app/Core/FileCache.php deleted file mode 100644 index 2037f271..00000000 --- a/app/Core/FileCache.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php - -namespace Core; - -class FileCache extends Cache -{ - const CACHE_FOLDER = 'data/cache/'; - - public function init() - { - if (! is_dir(self::CACHE_FOLDER)) { - mkdir(self::CACHE_FOLDER); - } - } - - public function set($key, $value) - { - file_put_contents(self::CACHE_FOLDER.$key, json_encode($value)); - } - - public function get($key) - { - if (file_exists(self::CACHE_FOLDER.$key)) { - return json_decode(file_get_contents(self::CACHE_FOLDER.$key), true); - } - - return null; - } - - public function flush() - { - foreach (glob(self::CACHE_FOLDER.'*') as $filename) { - @unlink($filename); - } - } - - public function remove($key) - { - @unlink(self::CACHE_FOLDER.$key); - } -} diff --git a/app/Core/Helper.php b/app/Core/Helper.php index 12557e45..53084a7e 100644 --- a/app/Core/Helper.php +++ b/app/Core/Helper.php @@ -2,105 +2,49 @@ namespace Core; -use Pimple\Container; - /** - * Template helpers + * Helper base class * * @package core * @author Frederic Guillot * - * @property \Core\Session $session - * @property \Model\Acl $acl - * @property \Model\Config $config - * @property \Model\User $user - * @property \Model\UserSession $userSession + * @property \Helper\App $app + * @property \Helper\Asset $asset + * @property \Helper\Datetime $datetime + * @property \Helper\File $file + * @property \Helper\Form $form + * @property \Helper\Subtask $subtask + * @property \Helper\Task $task + * @property \Helper\Text $text + * @property \Helper\Url $url + * @property \Helper\User $user */ -class Helper +class Helper extends Base { /** - * Container instance - * - * @access protected - * @var \Pimple\Container - */ - protected $container; - - /** - * Constructor + * Helper instances * - * @access public - * @param \Pimple\Container $container + * @static + * @access private + * @var array */ - public function __construct(Container $container) - { - $this->container = $container; - } + private static $helpers = array(); /** - * Load automatically models + * Load automatically helpers * * @access public - * @param string $name Model name + * @param string $name Helper name * @return mixed */ public function __get($name) { - return $this->container[$name]; - } - - /** - * Get the age of an item in quasi human readable format. - * It's in this format: <1h , NNh, NNd - * - * @access public - * @param integer $timestamp Unix timestamp of the artifact for which age will be calculated - * @param integer $now Compare with this timestamp (Default value is the current unix timestamp) - * @return string - */ - public function getTaskAge($timestamp, $now = null) - { - if ($now === null) { - $now = time(); - } - - $diff = $now - $timestamp; - - if ($diff < 3600) { - return t('<1h'); - } - else if ($diff < 86400) { - return t('%dh', $diff / 3600); + if (! isset(self::$helpers[$name])) { + $class = '\Helper\\'.ucfirst($name); + self::$helpers[$name] = new $class($this->container); } - return t('%dd', ($now - $timestamp) / 86400); - } - - /** - * Proxy cache helper for acl::isManagerActionAllowed() - * - * @access public - * @param integer $project_id - * @return boolean - */ - public function isManager($project_id) - { - if ($this->userSession->isAdmin()) { - return true; - } - - return $this->container['memoryCache']->proxy('acl', 'isManagerActionAllowed', $project_id); - } - - /** - * Return the user full name - * - * @param array $user User properties - * @return string - */ - public function getFullname(array $user = array()) - { - return $this->user->getFullname(empty($user) ? $_SESSION['user'] : $user); + return self::$helpers[$name]; } /** @@ -113,688 +57,4 @@ class Helper { return htmlspecialchars($value, ENT_QUOTES, 'UTF-8', false); } - - /** - * Add a Javascript asset - * - * @param string $filename Filename - * @return string - */ - public function js($filename) - { - return '<script type="text/javascript" src="'.$filename.'?'.filemtime($filename).'"></script>'; - } - - /** - * Add a stylesheet asset - * - * @param string $filename Filename - * @param boolean $is_file Add file timestamp - * @param string $media Media - * @return string - */ - public function css($filename, $is_file = true, $media = 'screen') - { - return '<link rel="stylesheet" href="'.$filename.($is_file ? '?'.filemtime($filename) : '').'" media="'.$media.'">'; - } - - /** - * Display the form error class - * - * @param array $errors Error list - * @param string $name Field name - * @return string - */ - public function errorClass(array $errors, $name) - { - return ! isset($errors[$name]) ? '' : ' form-error'; - } - - /** - * Display a list of form errors - * - * @param array $errors List of errors - * @param string $name Field name - * @return string - */ - public function errorList(array $errors, $name) - { - $html = ''; - - if (isset($errors[$name])) { - - $html .= '<ul class="form-errors">'; - - foreach ($errors[$name] as $error) { - $html .= '<li>'.$this->e($error).'</li>'; - } - - $html .= '</ul>'; - } - - return $html; - } - - /** - * Get an escaped form value - * - * @param mixed $values Values - * @param string $name Field name - * @return string - */ - public function formValue($values, $name) - { - if (isset($values->$name)) { - return 'value="'.$this->e($values->$name).'"'; - } - - return isset($values[$name]) ? 'value="'.$this->e($values[$name]).'"' : ''; - } - - /** - * Hidden CSRF token field - * - * @return string - */ - public function formCsrf() - { - return '<input type="hidden" name="csrf_token" value="'.Security::getCSRFToken().'"/>'; - } - - /** - * Display a hidden form field - * - * @param string $name Field name - * @param array $values Form values - * @return string - */ - public function formHidden($name, array $values = array()) - { - return '<input type="hidden" name="'.$name.'" id="form-'.$name.'" '.$this->formValue($values, $name).'/>'; - } - - /** - * Display a select field - * - * @param string $name Field name - * @param array $options Options - * @param array $values Form values - * @param array $errors Form errors - * @param string $class CSS class - * @return string - */ - public function formSelect($name, array $options, array $values = array(), array $errors = array(), array $attributes = array(), $class = '') - { - $html = '<select name="'.$name.'" id="form-'.$name.'" class="'.$class.'" '.implode(' ', $attributes).'>'; - - foreach ($options as $id => $value) { - - $html .= '<option value="'.$this->e($id).'"'; - - if (isset($values->$name) && $id == $values->$name) $html .= ' selected="selected"'; - if (isset($values[$name]) && $id == $values[$name]) $html .= ' selected="selected"'; - - $html .= '>'.$this->e($value).'</option>'; - } - - $html .= '</select>'; - $html .= $this->errorList($errors, $name); - - return $html; - } - - /** - * Display a radio field group - * - * @param string $name Field name - * @param array $options Options - * @param array $values Form values - * @return string - */ - public function formRadios($name, array $options, array $values = array()) - { - $html = ''; - - foreach ($options as $value => $label) { - $html .= $this->formRadio($name, $label, $value, isset($values[$name]) && $values[$name] == $value); - } - - return $html; - } - - /** - * Display a radio field - * - * @param string $name Field name - * @param string $label Form label - * @param string $value Form value - * @param boolean $selected Field selected or not - * @param string $class CSS class - * @return string - */ - public function formRadio($name, $label, $value, $selected = false, $class = '') - { - return '<label><input type="radio" name="'.$name.'" class="'.$class.'" value="'.$this->e($value).'" '.($selected ? 'checked="checked"' : '').'> '.$this->e($label).'</label>'; - } - - /** - * Display a checkbox field - * - * @param string $name Field name - * @param string $label Form label - * @param string $value Form value - * @param boolean $checked Field selected or not - * @param string $class CSS class - * @return string - */ - public function formCheckbox($name, $label, $value, $checked = false, $class = '') - { - return '<label><input type="checkbox" name="'.$name.'" class="'.$class.'" value="'.$this->e($value).'" '.($checked ? 'checked="checked"' : '').'> '.$this->e($label).'</label>'; - } - - /** - * Display a form label - * - * @param string $name Field name - * @param string $label Form label - * @param array $attributes HTML attributes - * @return string - */ - public function formLabel($label, $name, array $attributes = array()) - { - return '<label for="form-'.$name.'" '.implode(' ', $attributes).'>'.$this->e($label).'</label>'; - } - - /** - * Display a textarea - * - * @param string $name Field name - * @param array $values Form values - * @param array $errors Form errors - * @param array $attributes HTML attributes - * @param string $class CSS class - * @return string - */ - public function formTextarea($name, $values = array(), array $errors = array(), array $attributes = array(), $class = '') - { - $class .= $this->errorClass($errors, $name); - - $html = '<textarea name="'.$name.'" id="form-'.$name.'" class="'.$class.'" '; - $html .= implode(' ', $attributes).'>'; - $html .= isset($values->$name) ? $this->e($values->$name) : isset($values[$name]) ? $values[$name] : ''; - $html .= '</textarea>'; - $html .= $this->errorList($errors, $name); - - return $html; - } - - /** - * Display a input field - * - * @param string $type HMTL input tag type - * @param string $name Field name - * @param array $values Form values - * @param array $errors Form errors - * @param array $attributes HTML attributes - * @param string $class CSS class - * @return string - */ - public function formInput($type, $name, $values = array(), array $errors = array(), array $attributes = array(), $class = '') - { - $class .= $this->errorClass($errors, $name); - - $html = '<input type="'.$type.'" name="'.$name.'" id="form-'.$name.'" '.$this->formValue($values, $name).' class="'.$class.'" '; - $html .= implode(' ', $attributes).'/>'; - if (in_array('required', $attributes)) $html .= '<span class="form-required">*</span>'; - $html .= $this->errorList($errors, $name); - - return $html; - } - - /** - * Display a text field - * - * @param string $name Field name - * @param array $values Form values - * @param array $errors Form errors - * @param array $attributes HTML attributes - * @param string $class CSS class - * @return string - */ - public function formText($name, $values = array(), array $errors = array(), array $attributes = array(), $class = '') - { - return $this->formInput('text', $name, $values, $errors, $attributes, $class); - } - - /** - * Display a password field - * - * @param string $name Field name - * @param array $values Form values - * @param array $errors Form errors - * @param array $attributes HTML attributes - * @param string $class CSS class - * @return string - */ - public function formPassword($name, $values = array(), array $errors = array(), array $attributes = array(), $class = '') - { - return $this->formInput('password', $name, $values, $errors, $attributes, $class); - } - - /** - * Display an email field - * - * @param string $name Field name - * @param array $values Form values - * @param array $errors Form errors - * @param array $attributes HTML attributes - * @param string $class CSS class - * @return string - */ - public function formEmail($name, $values = array(), array $errors = array(), array $attributes = array(), $class = '') - { - return $this->formInput('email', $name, $values, $errors, $attributes, $class); - } - - /** - * Display a number field - * - * @param string $name Field name - * @param array $values Form values - * @param array $errors Form errors - * @param array $attributes HTML attributes - * @param string $class CSS class - * @return string - */ - public function formNumber($name, $values = array(), array $errors = array(), array $attributes = array(), $class = '') - { - return $this->formInput('number', $name, $values, $errors, $attributes, $class); - } - - /** - * Display a numeric field (allow decimal number) - * - * @param string $name Field name - * @param array $values Form values - * @param array $errors Form errors - * @param array $attributes HTML attributes - * @param string $class CSS class - * @return string - */ - public function formNumeric($name, $values = array(), array $errors = array(), array $attributes = array(), $class = '') - { - return $this->formInput('text', $name, $values, $errors, $attributes, $class.' form-numeric'); - } - - /** - * Link - * - * a('link', 'task', 'show', array('task_id' => $task_id)) - * - * @param string $label Link label - * @param string $controller Controller name - * @param string $action Action name - * @param array $params Url parameters - * @param boolean $csrf Add a CSRF token - * @param string $class CSS class attribute - * @param boolean $new_tab Open the link in a new tab - * @return string - */ - public function a($label, $controller, $action, array $params = array(), $csrf = false, $class = '', $title = '', $new_tab = false) - { - return '<a href="'.$this->u($controller, $action, $params, $csrf).'" class="'.$class.'" title="'.$title.'" '.($new_tab ? 'target="_blank"' : '').'>'.$label.'</a>'; - } - - /** - * Generate controller/action url for templates - * - * u('task', 'show', array('task_id' => $task_id)) - * - * @param string $controller Controller name - * @param string $action Action name - * @param array $params Url parameters - * @param boolean $csrf Add a CSRF token - * @return string - */ - public function u($controller, $action, array $params = array(), $csrf = false) - { - $values = array( - 'controller' => $controller, - 'action' => $action, - ); - - if ($csrf) { - $params['csrf_token'] = Security::getCSRFToken(); - } - - $values += $params; - - return '?'.http_build_query($values, '', '&'); - } - - /** - * Generate controller/action url - * - * l('task', 'show', array('task_id' => $task_id)) - * - * @param string $controller Controller name - * @param string $action Action name - * @param array $params Url parameters - * @return string - */ - public function url($controller, $action, array $params = array()) - { - $values = array( - 'controller' => $controller, - 'action' => $action, - ); - - $values += $params; - - return '?'.http_build_query($values); - } - - /** - * Markdown transformation - * - * @param string $text Markdown content - * @param array $link Link parameters for replacement - * @return string - */ - public function markdown($text, array $link = array()) - { - $parser = new Markdown($link, $this); - $parser->setMarkupEscaped(MARKDOWN_ESCAPE_HTML); - return $parser->text($text); - } - - /** - * Get the current URL without the querystring - * - * @return string - */ - public function getCurrentBaseUrl() - { - $application_url = $this->config->get('application_url'); - - if (! empty($application_url)) { - return $application_url; - } - - $self = str_replace('\\', '/', dirname($_SERVER['PHP_SELF'])); - - $url = Request::isHTTPS() ? 'https://' : 'http://'; - $url .= $_SERVER['SERVER_NAME']; - $url .= $_SERVER['SERVER_PORT'] == 80 || $_SERVER['SERVER_PORT'] == 443 ? '' : ':'.$_SERVER['SERVER_PORT']; - $url .= $self !== '/' ? $self.'/' : '/'; - - return $url; - } - - /** - * Dispplay the flash session message - * - * @param string $html HTML wrapper - * @return string - */ - public function flash($html) - { - return $this->flashMessage('flash_message', $html); - } - - /** - * Display the flash session error message - * - * @param string $html HTML wrapper - * @return string - */ - public function flashError($html) - { - return $this->flashMessage('flash_error_message', $html); - } - - /** - * Fetch and remove a flash session message - * - * @access private - * @param string $name Message name - * @param string $html HTML wrapper - * @return string - */ - private function flashMessage($name, $html) - { - $data = ''; - - if (isset($this->session[$name])) { - $data = sprintf($html, $this->e($this->session[$name])); - unset($this->session[$name]); - } - - return $data; - } - - /** - * Format a file size - * - * @param integer $size Size in bytes - * @param integer $precision Precision - * @return string - */ - public function formatBytes($size, $precision = 2) - { - $base = log($size) / log(1024); - $suffixes = array('', 'k', 'M', 'G', 'T'); - - return round(pow(1024, $base - floor($base)), $precision).$suffixes[(int)floor($base)]; - } - - /** - * Truncate a long text - * - * @param string $value Text - * @param integer $max_length Max Length - * @param string $end Text end - * @return string - */ - public function summary($value, $max_length = 85, $end = '[...]') - { - $length = strlen($value); - - if ($length > $max_length) { - return substr($value, 0, $max_length).' '.$end; - } - - return $value; - } - - /** - * Return true if needle is contained in the haystack - * - * @param string $haystack Haystack - * @param string $needle Needle - * @return boolean - */ - public function contains($haystack, $needle) - { - return strpos($haystack, $needle) !== false; - } - - /** - * Return a value from a dictionary - * - * @param mixed $id Key - * @param array $listing Dictionary - * @param string $default_value Value displayed when the key doesn't exists - * @return string - */ - public function inList($id, array $listing, $default_value = '?') - { - if (isset($listing[$id])) { - return $this->e($listing[$id]); - } - - return $default_value; - } - - /** - * Get javascript language code - * - * @access public - * @return string - */ - public function jsLang() - { - return $this->config->getJsLanguageCode(); - } - - /** - * Get current timezone - * - * @access public - * @return string - */ - public function getTimezone() - { - return $this->config->getCurrentTimezone(); - } - - /** - * Get the link to toggle subtask status - * - * @access public - * @param array $subtask - * @param string $redirect - * @return string - */ - public function toggleSubtaskStatus(array $subtask, $redirect) - { - if ($subtask['status'] == 0 && isset($this->session['has_subtask_inprogress']) && $this->session['has_subtask_inprogress'] === true) { - - return $this->a( - trim($this->render('subtask/icons', array('subtask' => $subtask))) . $this->e($subtask['title']), - 'subtask', - 'subtaskRestriction', - array('task_id' => $subtask['task_id'], 'subtask_id' => $subtask['id'], 'redirect' => $redirect), - false, - 'popover task-board-popover' - ); - } - - return $this->a( - trim($this->render('subtask/icons', array('subtask' => $subtask))) . $this->e($subtask['title']), - 'subtask', - 'toggleStatus', - array('task_id' => $subtask['task_id'], 'subtask_id' => $subtask['id'], 'redirect' => $redirect) - ); - } - - /** - * Get all hours for day - * - * @access public - * @return array - */ - public function getDayHours() - { - $values = array(); - - foreach (range(0, 23) as $hour) { - foreach (array(0, 30) as $minute) { - $time = sprintf('%02d:%02d', $hour, $minute); - $values[$time] = $time; - } - } - - return $values; - } - - /** - * Get all days of a week - * - * @access public - * @return array - */ - public function getWeekDays() - { - $values = array(); - - foreach (range(1, 7) as $day) { - $values[$day] = $this->getWeekDay($day); - } - - return $values; - } - - /** - * Get the localized day name from the day number - * - * @access public - * @param integer $day Day number - * @return string - */ - public function getWeekDay($day) - { - return dt('%A', strtotime('next Monday +'.($day - 1).' days')); - } - - /** - * Get file icon - * - * @access public - * @param string $filename Filename - * @return string Font-Awesome-Icon-Name - */ - public function getFileIcon($filename){ - - $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); - - switch ($extension) { - case 'jpeg': - case 'jpg': - case 'png': - case 'gif': - return 'fa-file-image-o'; - case 'xls': - case 'xlsx': - return 'fa-file-excel-o'; - case 'doc': - case 'docx': - return 'fa-file-word-o'; - case 'ppt': - case 'pptx': - return 'fa-file-powerpoint-o'; - case 'zip': - case 'rar': - return 'fa-file-archive-o'; - case 'mp3': - return 'fa-audio-o'; - case 'avi': - return 'fa-video-o'; - case 'php': - case 'html': - case 'css': - return 'fa-code-o'; - case 'pdf': - return 'fa-file-pdf-o'; - } - - return 'fa-file-o'; - } - - /** - * Display gravatar image - * - * @access public - * @param string $email - * @param string $alt - * @return string - */ - public function avatar($email, $alt = '') - { - if (! empty($email) && $this->config->get('integration_gravatar') == 1) { - return '<img class="avatar" src="https://www.gravatar.com/avatar/'.md5(strtolower($email)).'?s=25" alt="'.$this->e($alt).'" title="'.$this->e($alt).'">'; - } - - return ''; - } } diff --git a/app/Core/Markdown.php b/app/Core/Markdown.php index 3dd98617..fa4e8080 100644 --- a/app/Core/Markdown.php +++ b/app/Core/Markdown.php @@ -3,6 +3,7 @@ namespace Core; use Parsedown; +use Helper\Url; /** * Specific Markdown rules for Kanboard @@ -15,8 +16,8 @@ class Markdown extends Parsedown { private $link; private $helper; - - public function __construct($link, Helper $helper) + + public function __construct($link, Url $helper) { $this->link = $link; $this->helper = $helper; @@ -29,9 +30,12 @@ class Markdown extends Parsedown // Replace task #123 by a link to the task if (! empty($this->link) && preg_match('!#(\d+)!i', $Excerpt['text'], $matches)) { - $url = $this->helper->u($this->link['controller'], - $this->link['action'], - $this->link['params'] + array('task_id' => $matches[1])); + $url = $this->helper->href( + $this->link['controller'], + $this->link['action'], + $this->link['params'] + array('task_id' => $matches[1]) + ); + return array( 'extent' => strlen($matches[0]), 'element' => array( diff --git a/app/Core/Paginator.php b/app/Core/Paginator.php index 4d4364dd..12cc05a1 100644 --- a/app/Core/Paginator.php +++ b/app/Core/Paginator.php @@ -349,7 +349,7 @@ class Paginator $html = '<span class="pagination-previous">'; if ($this->offset > 0) { - $html .= $this->container['helper']->a( + $html .= $this->container['helper']->url->link( '← '.t('Previous'), $this->controller, $this->action, @@ -376,7 +376,7 @@ class Paginator $html = '<span class="pagination-next">'; if (($this->total - $this->offset) > $this->limit) { - $html .= $this->container['helper']->a( + $html .= $this->container['helper']->url->link( t('Next').' →', $this->controller, $this->action, @@ -451,7 +451,7 @@ class Paginator $direction = $this->direction === 'DESC' ? 'ASC' : 'DESC'; } - return $prefix.$this->container['helper']->a( + return $prefix.$this->container['helper']->url->link( $label, $this->controller, $this->action, |