2013-03-14 2 views
1

Я работаю над приложением Zend Framework, и я просто получил свою маршрутную работу, используя руководство по адресу http://tfountain.co.uk/blog/2010/9/9/vanity-urls-zend-framework/, но мое разбиение на страницы не работает, и ни один из правил тщеславия, мы смогли найти прикосновение к нему.Zend Framework Vanity Url Pagination не работает

Мой маршрут тщеславия настроен как /:username/:filter/:pag ', где последние 2 параметра являются необязательными. Страница отображается правильно: «/ jaimerump/badges/2» переместится на вторую страницу моих значков, но страница не работает, потому что она не может понять, какой должен быть URL-адрес следующей страницы. Я использую стандартный файл paginationControl.phtml из каждого Zend постраничного учебника, код здесь:

<?php if ($this->pageCount): ?> 
<div class="paginationControl" id="paginationControl"> 
<!-- Previous page link --> 
<?php if (isset($this->previous)): ?> 
    <a href="<?php echo $this->url(array('page' => $this->previous)); ?>" id="previous"> 
     &lt; Previous 
    </a> | 
<?php else: ?> 
    <span class="disabled">&lt; Previous</span> | 
<?php endif; ?> 

<!-- Infinite Scroll doesn't use numbered page links --> 

<!-- Next page link --> 
<?php if (isset($this->next)): ?> 
    <a id="next" href="<?php echo $this->url(array('page' => $this->next)); ?>" > 
    Next &gt; 
    </a> 
<?php else: ?> 
    <span class="disabled">Next &gt;</span> 
<?php endif; ?> 
</div> 
<?php endif; ?> 

Вместо возвращении '/ jaimerump/значков/3', $this->url() возвращает '/'. Я уверен, что это связано с моим собственным классом маршрута. Я изменил функцию соответствия из учебника Tim Fountain, и я изменил имя класса на VanityRouteUser и поместил его в папку с моими моделями, но кроме этого все идентично. Функция соответствия:

public function match($path, $partial = false) 
{ 
    /* User profile routes are of form /:username/:filter/:page 
    Where filter can be haves, wants, badges, etc. 
    */ 

    if ($path instanceof Zend_Controller_Request_Http) { 
     $path = $path->getPathInfo(); 
    } 

    $path = trim($path, $this->_urlDelimiter); 
    $pathBits = explode($this->_urlDelimiter, $path); 

    if (count($pathBits) < 1) { 
     return false; 
    } 

    // check database for this user 
    $result = DB::call()->fetchRow('SELECT user_id 
            FROM users 
            WHERE username = ?', $pathBits[0]); 
    if ($result) { 
     // user found 
     $values = $this->_defaults; 
     $values['username'] = $pathBits[0]; 
     $values['page'] = (empty($pathBits[2]))?1:$pathBits[2]; //if they didn't provide a page 

     // figure out which action based on second segment 
     $filter = $pathBits[1]; 
     if(empty($filter) || $filter == 'default' 
      || $filter == 'haves' || $filter == 'wants'){ 
      //Looking for user's haves, wants, or both 
      $values['action'] = 'index'; 
      $values['filter'] = (empty($filter))?'default':$filter; //To catch the blank 
     } 
     else if($filter == 'badges'){ 
      //Looking for user's badges 
      $values['action'] = 'badges'; 
     } 
     else if($filter == 'shelves'){ 
      //Looking for user's shelves 
      $values['action'] = 'shelves'; 
     } 
     else{ 
      //Must be a shelf id 
      $values['action'] = 'index'; 
      $values['filter'] = $filter; 
     } 

     return $values; 
    } 

    return false; 
} 

Что такое $this->url()? Я не смог найти функцию url в Zend Paginator. И я предполагаю, что он вызывает некоторую функцию в классе маршрута, чтобы попытаться получить URL-адрес следующей страницы. Какую функцию он вызывает, и мне нужно перегружать его?

ответ

0

Проблема была в сборе функции. Я пытался использовать функцию, представленную в учебнике Тима Фонтана, который был:

public function assemble($data = array(), $reset = false, $encode = false) 
{ 
    return $data['username']; 
} 

И я получаю «/» назад, потому что $data['username'] был неопределенным; маршрутизатор предоставлял только параметр страницы. При написании собственных классов маршрутов ваша функция сборки должна предоставлять значения по умолчанию для любых сегментов, которые не передаются в массиве данных. Исправлено:

public function assemble($data = array(), $reset = false, $encode = false) 
{ 
    //Check if username was provided 
    $username = ($data['username'])?$data['username']:$this->_defaults['username']; 

    //Check if filter was provided 
    $filter = ($data['filter'])?$data['filter']:$this->_defaults['filter']; 

    //Check if page was provided 
    $page = ($data['page'])?$data['page']:$this->_defaults['page']; 

    return $username.'/'.$filter.'/'.$page; 
} 
+0

Рад, что вы получили его работу. FYI '$ this-> url()' вызывает стандартный помощник URL-адреса ZF, который, в свою очередь, вызывает сборку для соответствующего маршрута. Эта функция может возвращать то, что вы хотите, поэтому вы можете легко изменить свое решение, чтобы включить только параметры фильтра и страницы, если они были предоставлены. –

+0

@TimFountain в этом случае, что означает '$ this'? Из всех других функций и свойств, которые называются, кажется, что это должно быть paginator. Указывает ли paginator автоматически проверять все помощники, когда вы пытаетесь вызвать функцию, которой у нее нет или что-то еще? – jaimerump

+0

'$ this' будет экземпляром' Zend_View'. В случае, когда он пытается отобразить частицу, paginator будет присваивать все остальные vars виду (предположительно через частичный помощник). –