Zend Regex, маршрут обратный с пагинатором

У меня есть следующий маршрут регулярных выражений, который позволяет мне использовать разбиение на страницы - для анализа URL, а также построить его:

; route "product-{brand}"
product.type = "Zend_Controller_Router_Route_Regex"
product.route = "product-([a-z\-]+)(?:/page/(\d+)/?)?"
product.defaults.module = "default"
product.defaults.controller = "products"
product.defaults.action = "product"
product.defaults.page = "1"
product.map.1 = "brand"
product.map.2 = "page"
product.reverse = "product-%s/page/%d"

Все работает нормально, однако мне нужно избавиться от страницы по умолчанию. В настоящее время мы переносим старую сеть в Zend, и нам нужно сохранить старые ссылки из-за текущих позиций в Google и т. Д.

По умолчанию "страница", я всегда получаю /page/1, без него Zend "не может собрать" URL. Как не отображать страницу 1 в URL?

1 ответ

Наконец, мне удалось этого добиться, но только переписав метод сборки Regex. Я просто переопределяю два метода.

Расширение класса:

class Utils_Router_Regex extends Zend_Controller_Router_Route_Regex
{

    // instantiate 
    public static function getInstance(Zend_Config $config)
    { 
        $defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array();
        $map = ($config->map instanceof Zend_Config) ? $config->map->toArray() : array();
        $reverse = (isset($config->reverse)) ? $config->reverse : null;

        return new self($config->route, $defs, $map, $reverse);
    }


// in this case, we are using $this->_reverse as array from config
    public function assemble($data = array(), $reset = false, $encode = false, $partial = false)
    {     
        //// EXTENSION PART !!!
        if( !isset( $data[(string) $this->_reverse->pagemap]) ) { // if not set url helper
            $reverse = $this->_reverse->base;
        } else { // if set in url helper
            $reverse = $this->_reverse->paginator;
        }


        /// end of extension part


        if ($reverse === null) {

            require_once 'Zend/Controller/Router/Exception.php';
            throw new Zend_Controller_Router_Exception('Cannot assemble. Reversed route is not specified.');
        }

        $defaultValuesMapped  = $this->_getMappedValues($this->_defaults, true, false);
        $matchedValuesMapped  = $this->_getMappedValues($this->_values, true, false);
        $dataValuesMapped     = $this->_getMappedValues($data, true, false);

        // handle resets, if so requested (By null value) to do so
        if (($resetKeys = array_search(null, $dataValuesMapped, true)) !== false) {
            foreach ((array) $resetKeys as $resetKey) {
                if (isset($matchedValuesMapped[$resetKey])) {
                    unset($matchedValuesMapped[$resetKey]);
                    unset($dataValuesMapped[$resetKey]);
                }
            }
        }

        // merge all the data together, first defaults, then values matched, then supplied
        $mergedData = $defaultValuesMapped;
        $mergedData = $this->_arrayMergeNumericKeys($mergedData, $matchedValuesMapped);
        $mergedData = $this->_arrayMergeNumericKeys($mergedData, $dataValuesMapped);

        if ($encode) {
            foreach ($mergedData as $key => &$value) {
                $value = urlencode($value);
            }
        }

        ksort($mergedData);

        $return = @vsprintf($reverse, $mergedData);

        if ($return === false) {
            require_once 'Zend/Controller/Router/Exception.php';
            throw new Zend_Controller_Router_Exception('Cannot assemble. Too few arguments?');
        }

        return $return;

    }

}

Затем вы можете определить, какую строку sprintf использовать:

hodinky.type = "Utils_Router_Regex"
hodinky.route = "hodinky-([a-z\-]+)(?:/page/(\d+)/?)?"
hodinky.defaults.module = "default"
hodinky.defaults.controller = "products"
hodinky.defaults.action = "hodinky"
hodinky.map.1 = "znacka"
hodinky.map.2 = "page"
hodinky.reverse.paginator = "hodinky-%s/page/%d" ; assebmly with paginator
hodinky.reverse.base = "hodinky-%s/" ; assebmly without paginator
hodinky.reverse.pagemap = "page" ; "page" map key

Если у вас есть лучшее решение, пожалуйста, дайте мне знать.

Другие вопросы по тегам