Как я могу написать URL-адреса Zend Framework с тегами привязки в теле?

StackOverflow https://stackoverflow.com/questions/405338

Вопрос

Используя стандартный MVC, настроенный в Zend Framework, я хочу иметь возможность отображать страницы, повсюду имеющие привязки.Прямо сейчас я просто добавляю бессмысленный параметр с «#anchor», который мне нужен, внутри файла .phtml.

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

Это приведет к тому, что URL-адрес будет выглядеть как /my.controller/my.action/anchor/#myanchor.

Есть ли лучший способ добиться этого?После перехода к ссылке привязки в URL-адресе пользователя устанавливается дополнительный параметр элемента, чего я бы не хотел.

Это было полезно?

Решение

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

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

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

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

Другие советы

Существует несколько способов реализации идентификатор фрагмента в ваши URL-адреса.Ниже приведены некоторые варианты, а также некоторые плюсы и минусы каждого.

Прямое добавление

Вы можете просто добавить "#$fragment_id" после твоего url() вызов.Неэлегантно, но просто.Если вы не часто используете привязки страниц (т.Всего одна-две страницы), так и надо.

Написать заказ url() помощник

Вы можете написать собственную версию url() добавление необязательного пятого аргумента для идентификатора фрагмента:

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.

-Спасибо Экслорду

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top