Как я могу писать 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-адресе пользователя, который я бы предпочтел.

Ответ 1

одна из возможностей заключается в переопределении помощника 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", потому что он будет изменен на якорь в URL-адресе.

вы назовете его как в своем примере

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

Я надеюсь, что это поможет

Ответ 2

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

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

Caveat

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

Ответ 3

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

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

это автоматически закончит URL с помощью #anchor.

- Спасибо Exlord

Ответ 4

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