2013-03-14 63 views
1

我正在使用Zend Framework应用程序,并且我刚刚在http://tfountain.co.uk/blog/2010/9/9/vanity-urls-zend-framework/上使用指南工作,但我的分页不起作用,并且没有虚空网址指南,已经能够找到它的触摸。Zend Framework虚荣网址分页无法正常工作

我的虚荣心路线设置为/:username/:filter/:pag',其中最后2个参数是可选的。该页面正确显示,'/ jaimerump/badges/2'将进入徽章的第二页,但分页程序不工作,因为它似乎无法确定下一页的网址应该是什么。我在这里使用标准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()?我一直无法在Zend Paginator中找到url函数。我假设它正在调用路由类中的某个函数来尝试获取下一页的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

很高兴你得到它的工作。仅供参考,'$ this-> url()'调用标准的ZF URL助手,该助手又调用相关路由的汇编。这个函数可以返回任何你想要的,所以你可以很容易地修改你的解决方案,只提供过滤器和页面参数。 – 2013-03-14 15:54:21

+0

@TimFountain在这种情况下,'$ this'是指什么?从被调用的所有其他函数和属性看来,它似乎必须是分页器。分页程序是否在您尝试调用它没有的函数时自动检查所有帮助程序? – jaimerump 2013-03-14 16:39:35

+0

'$ this'将是'Zend_View'实例。分页程序会在尝试渲染部分时将所有其他变量分配给视图(可能通过部分助手)。 – 2013-03-14 16:55:47