Редактируемая навигационная цепочка для динамических страниц

Ищете лучшее решение Breadcrumb для проекта Zend Framework.

В настоящее время у меня есть navigation.xml, например

<?xml version="1.0" encoding="UTF-8"?>
<configdata>
    <nav>
        <home>
            <label>Home</label>
            <module>default</module>
            <controller>index</controller>
            <action>index</action>
            <pages>
                <countryurl>
                    <label>Spain</label>
                    <module>default</module>
                    <controller>country</controller>
                    <action>index</action>
                    <route>country_url</route>
                    <params>
                        <country>spain</country>
                    </params>
                    <pages>
                        <provinceurl>
                            <label>Madrid</label>
                            <module>default</module>
                            <controller>country</controller>
                            <action>province</action>
                            <route>province_url</route>
                            <params>
                                <country>spain</country>
                                <province>madrid</province>
                            </params>
                            <pages>
                                <cityurl>
                                    <label>City</label>
                                    <module>default</module>
                                    <controller>country</controller>
                                    <action>city</action>
                                    <route>city_url</route>
                                    <params>
                                        <country>spain</country>
                                        <province>madrid</province>
                                        <city>madrid</city>
                                    </params>
                                    <pages>
                                        <producturl>
                                            <label>Product</label>
                                            <module>default</module>
                                            <controller>country</controller>
                                            <action>product</action>
                                            <route>product_url</route>
                                            <params>
                                                <country>spain</country>
                                                <province>madrid</province>
                                                <city>madrid</city>
                                                <product>product</product>
                                            </params>
                                        </producturl>
                                    </pages>
                                </cityurl>
                            </pages>
                        </provinceurl>
                    </pages>
                </countryurl>
            </pages>
        </home>
    </nav>
</configdata>

и такие маршруты

$router->addRoute(
    'product_url',
    new Zend_Controller_Router_Route(':lang/:country/:province/:city/:product', array(
        'controller' => 'country',
        'action' => 'product'
    ))
);

$router->addRoute(
    'city_url',
    new Zend_Controller_Router_Route(':lang/:country/:province/:city', array(
        'controller' => 'country',
        'action' => 'city'
    ))
);

$router->addRoute(
    'province_url',
    new Zend_Controller_Router_Route(':lang/:country/:province', array(
        'controller' => 'country',
        'action' => 'province'
    ))
);

$router->addRoute(
    'country_url',
    new Zend_Controller_Router_Route(':lang/:country', array(
        'controller' => 'country',
        'action' => 'index'
    ))
);

Я столкнулся с некоторыми проблемами / ищу некоторые предложения. Создание хлебных крошек с помощью Zend_Navigation

$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
$container = new Zend_Navigation($config);
$view->navigation($container);

1 ) Запрос на http://example.com/en/spain/madrid/madrid/product показывает хлебную крошку с помощью

$this->navigation()
    ->breadcrumbs()
    ->setMinDepth(0)
    ->setLinkLast(true)
    ->setSeparator(" > ");

as Home > Spain > Madrid > City > Product

Но все ссылки, указывающие на Испанию, Мадрид, Сити, ведут на http://example.com. Что должно быть http://example.com/en/spain , http://example.com/en/spain/madrid , http://example.com/en/spain/madrid/madrid соответственно.

2 ) В настоящее время, когда запрос на http://example.com/en/spain

хлебная крошка покажет Home >> Spain

<label>Spain</label>
<module>default</module>
<controller>country</controller>
<action>index</action>
<route>country_url</route>
<params>
    <country>spain</country>
</params>

Но вы можете видеть, что param country различается в зависимости от страны. Итак, мы хотим добавить ярлыки для всех стран?

http://example.com/en/spain

Home >> Spain

http://example.com/en/india

Home >> India

У меня есть провинции, города и продукты, какие-нибудь предложения, как я могу построить для них?

Кроме того, это многоязычный веб-сайт, поэтому как мы можем внести необходимые изменения в этикетку? Я думаю, если мы используем Zend_Translate, он внесет необходимые изменения.


person Hari K T    schedule 10.02.2012    source источник
comment
Во-первых, похоже, вам понадобится динамическая навигация (инициализация в начальной загрузке, получение всех ваших стран, провинций, городов; или, если вы используете навигацию только для создания хлебных крошек, то вы можете сделать это позже, после routeShutdown() , так что вы можете добавить только нужный вам путь к стране/области/городу). Но это все еще не решает вашу основную проблему: кажется, что навигационные/хлебные крошки собирают URL-адреса, используя неправильный маршрут.   -  person David Weinraub    schedule 13.02.2012
comment
Спасибо, Дэвид Вайнрауб, в настоящее время я ищу только Breadcrumb, а Bootstrap.php немного отличается. Это вообще не класс, это действительно устаревший проект, написанный на 1.6, который я только что обновил до 1.11, чтобы использовать Breadcrumb и некоторые вещи.   -  person Hari K T    schedule 13.02.2012


Ответы (1)


Вы можете создать свой собственный класс страницы, который обрабатывает параметры, начинающиеся с :, как динамические. Вы можете ссылаться на него в конфигурации навигации, например

...
<countryurl>
    <label>:country</label> <!-- dynamic -->
    <module>default</module>
    <controller>index</controller>
    <action>index</action>
    <route>country_url</route>
    <type>DynamicNavPage</type> <!-- page classname -->
    <params>
        <country>:country</country> <!-- dynamic -->
    </params>
        <pages>
    ...

и например

<?php

class DynamicNavPage extends Zend_Navigation_Page_Mvc {

    /**
    * Params with ":" are read from request
    * 
    * @param array $params
    * @return Zend_Navigation_Page_Mvc
    */
    public function setParams(array $params = null) {
        $requestParams = Zend_Controller_Front::getInstance()
                        ->getRequest()->getParams();

        //searching for dynamic params (begining with :)
        foreach ($params as $paramKey => $param) {
            if (substr($param, 0, 1) == ':' &&
                    array_key_exists(substr($param, 1), $requestParams)) {
                $params[$paramKey] = $requestParams[substr($param, 1)];
            }
        }

        return parent::setParams($params);
    }

    /**
    * If label begining with : manipulate (for example with Zend_Tanslate)
    */
    public function setLabel($label) {
        if (substr($label, 0, 1) == ':') {
            //label modifications go here
            //as an example reading it from page params and capitalizing
            //can use Zend_Translate here
            $requestParams = Zend_Controller_Front::getInstance()
                            ->getRequest()->getParams();
            $labelParamKey = substr($label, 1);

            if (array_key_exists($labelParamKey, $requestParams)) {
                $label = ucfirst($requestParams[$labelParamKey]);
            }
        }

        return parent::setLabel($label);
    }

}
person Weltschmerz    schedule 17.02.2012
comment
Спасибо за ответ. Мне нужно время, чтобы протестировать его, занят разными вещами. Я сделаю это как правильно, если все работает. Я чувствую, что это должно сработать :). Еще раз спасибо и за ваше терпение. - person Hari K T; 21.02.2012
comment
проблема, с которой я сталкиваюсь, заключается в том, что я не получаю объект запроса, поэтому он вызывает вызов функции-члена getParams() для не-объекта. $requestParams = Zend_Controller_Front::getInstance()->getRequest()->getParams() . Интересно, почему так :( , у вас есть идеи? Объект запроса здесь нулевой Zend_Controller_Front::getInstance()->getRequest() - person Hari K T; 24.02.2012
comment
Я не знаю вашей настройки, одно из предложений состоит в том, чтобы переопределить метод маршрутизатора route(Zend_Controller_Request_Abstract $request) и установить, что родительский маршрут () возвращает как статическое поле. Таким образом, вместо того, чтобы запрашивать запрос у фронт-контроллера, вы можете сделать: MyRouterClass::$routedRequest->getParams(); например: public function route(Zend_Controller_Request_Abstract $request){ self::$routedRequest = parent::route($request); return $request; } Попробуйте. - person Weltschmerz; 24.02.2012
comment
Я использовал тот же способ, что и быстрый старт, и использовал маршрутизатор в Bootstrap. Маршруты следующие: stackoverflow.com/a/9128784/487878 . Я попробую ваше предложение. Спасибо. - person Hari K T; 25.02.2012
comment
Хорошо, теперь я понимаю, проблема в том, что вы пытаетесь настроить навигацию, зависящую от запроса, до завершения процесса маршрутизации - возможно, в Bootstrap. Правильный способ сделать это — зарегистрировать плагин (в Bootstrap) и настроить навигацию с помощью метода routeShutdow(). Объект запроса там точно готов. Мой предыдущий комментарий неверен, не обращайте на него внимания. - person Weltschmerz; 25.02.2012