0

次の正規表現ルートがあります。これにより、ページネーションを使用して、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"

すべて正常に動作していますが、デフォルト ページを削除する必要があります。現在、古い Web を Zend に移行しており、現在の Google の位置などにより、古いリンクを保持する必要があります。

デフォルトの「ページ」では、常に /page/1 を取得しています。これがないと、Zend は URL を「アセンブルできません」。URL にページ 1 を表示しない方法は?

4

1 に答える 1

0

最後に、これを達成することができましたが、正規表現のアセンブル メソッドを書き直すことによってのみです。私は単に2つのメソッドをオーバーライドしています。

クラス拡張:

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

より良い解決策がある場合は、お知らせください。

于 2013-06-25T16:06:44.937 に答える