Как я могу написать URL Zend Framework, в которых есть теги привязки в теле?
Используя стандартный MVC, настроенный в Zend Framework, я хочу иметь возможность отображать страницы, которые имеют привязки повсюду. Прямо сейчас я просто добавляю бессмысленный параметр с "#anchor", который мне нужен, внутри файла.phtml.
<?= $this->url(array(
'controller'=>'my.controller',
'action'=>'my.action',
'anchor'=>'#myanchor'
));
Это устанавливает URL, чтобы выглядеть как /my.controller/my.action/anchor/#myanchor
Есть ли лучший способ сделать это? После перехода по ссылке привязки в URL пользователя устанавливается дополнительный параметр элемента, чего я бы не хотел.
4 ответа
Одна из возможностей - переопределить хелпер url или создать новый.
class My_View_Helper_Url extends Zend_View_Helper_Url
{
public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true)
{
if (isset($urlOptions['anchor']) && !empty($urlOptions['anchor']))
{
$anchor = $urlOptions['anchor'];
unset($urlOptions['anchor']);
}
else
{
$anchor = '';
}
return parent::url($urlOptions, $name, $reset, $encode).$anchor;
}
}
Этот хелпер переопределяет URL-хелпер, проблема в том, что вы не можете использовать параметр под названием 'anchor', потому что он будет заменен на anchor в url.
вы будете называть это как в вашем примере
<?= $this->url(array(
'controller'=>'my.controller',
'action'=>'my.action',
'anchor'=>'#myanchor'
));
Я надеюсь, что это помогает
Существует несколько способов внедрения идентификатора фрагмента в ваши URL-адреса. Ниже приведены некоторые варианты, а также некоторые плюсы и минусы для каждого.
Прямое добавление
Вы можете просто добавить "#$fragment_id"
после вашего url()
вызов. Не элегантный, но простой. Если вы не используете якоря страниц (например, одну или две страницы), это путь.
Написать кастом url()
помощник
Вы можете написать собственную версию url()
добавление необязательного 5-го аргумента для идентификатора фрагмента:
class My_View_Helper_Url extends Zend_View_Helper_Url
{
public function url(array $urlOptions = array(), $name = null,
$reset = false, $encode = true,
$fragment_id = null)
{
$uri = parent::url($urlOptions, $name, $reset, $encode);
if(!is_null($fragment_id)) {
$uri .= "#$fragment_id";
}
return $uri;
}
}
Таким образом, информация привязки (и идентификатора привязки / фрагмента) хранится строго в пределах области просмотра. Это хорошо для общего использования, но может стать немного громоздким для маршрута по умолчанию. Кроме того, это все еще слишком жестко для некоторых целей.
Написать кастом Route
класс (экстрим)
В качестве третьего варианта вы можете написать собственную версию Zend_Controller_Router_Route
класс (ы), в частности, assemble($data, $reset, $encode)
метод (match($path)
по умолчанию метод игнорирует идентификаторы фрагментов).
Использование этого метода может быть довольно сложным, но очень полезным, особенно если его использование ограничено только конкретными маршрутами (этот метод может использоваться, чтобы основать идентификатор фрагмента любой переменной).
Предостережение
Определенные соображения должны быть приняты во внимание при использовании идентификаторов фрагментов. Например, строки запроса должны предшествовать идентификатору фрагмента в URI, в противном случае строка запроса игнорируется PHP. Однако большинство приложений ZF, как правило, избегают использования строк запроса, поэтому это может не быть проблемой.
Помощник вида url принимает ключ фрагмента для третьего варианта:
url('[route]',array([params]),array('fragment'=>'anchor'));
это автоматически завершит URL с #anchor.
-Спасибо Exlord
Я думаю, что метод Extreme для написания пользовательского класса маршрута лучше, потому что другие помощники будут иметь то же поведение (например, помощник действий перенаправителя).