2013-06-25 9 views
0

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

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

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

ответ

0

И, наконец, мне удалось достичь этого, но только путем перезаписи метода сборки 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 

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