Как я могу написать URL Zend Framework, в которых есть теги привязки в теле? - PullRequest
11 голосов
/ 01 января 2009

Используя стандартную 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 ]

13 голосов
/ 02 января 2009

одна из возможностей - переопределить хелпер 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 helper, проблема в том, что вы не можете использовать параметр под названием 'anchor', потому что он будет заменен на anchor в URL.

вы назовете это как в вашем примере

<?= $this->url(array(
    'controller'=>'my.controller',
    'action'=>'my.action',
    'anchor'=>'#myanchor'
));

Надеюсь, это поможет

7 голосов
/ 24 января 2009

Существует несколько способов реализовать идентификатор фрагмента в ваших 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 класс (Extreme)

В качестве третьего варианта вы можете написать собственную версию класса (ов) Zend_Controller_Router_Route, в частности, метода assemble($data, $reset, $encode) (метод match($path) по умолчанию игнорирует идентификаторы фрагментов).

Использование этого метода может быть довольно сложным, но очень полезным, особенно если его использование ограничено только конкретными маршрутами (этот метод можно использовать для определения идентификатора фрагмента любой переменной).

Протест

Некоторые соображения необходимо учитывать при использовании идентификаторов фрагментов. Например, строки запроса должны предшествовать идентификатору фрагмента в URI, в противном случае строка запроса игнорируется PHP. Тем не менее, большинство приложений ZF, как правило, избегают использования строк запроса, поэтому это может не быть проблемой.

5 голосов
/ 30 июля 2014

Помощник вида URL принимает ключ фрагмента для третьей опции:

url('[route]',array([params]),array('fragment'=>'anchor'));

это автоматически завершит URL # якорем.

-Спасибо Exlord

0 голосов
/ 24 февраля 2009

Я думаю, что метод Extreme для написания пользовательского класса маршрута лучше, потому что другие помощники будут иметь то же поведение (например, помощник действий перенаправителя).

...