2013-06-28 27 views
2

我一直在尋找如何做我問的例子/指南。如何使用Zend2/Doctrine組合(使用Doctrine提供的分頁器適配器)進行分頁?

我發現了幾個例子,「最好」,我還沒有發現這是一個=>http://blog.loftdigital.com/blog/doctrine-plus-zf2-tips-pagination

2問題

  1. 我真的不知道,如果我的分頁程序對象包含正確的記錄數(我將它限制在我的適配器對象上的5條記錄)

  2. 我不知道如何在我的視圖文件中遍歷paginator對象。看來很複雜。我做了一個預HTML標籤包圍的事在對象上的print_r和它很容易20條+ K線在我的文本編輯器(複製/粘貼後)

能否請你幫忙嗎?

非常感謝你

從例如基於

我控制器代碼(不是真正的工作,但沒有的Zend /學說的錯誤了。問題是,它給了我所有的記錄,而不只是10)

$directory->populate($form->getData()); 
$adapter = new DoctrineAdapter(new ORMPaginator($directoryDao->searchStaffDirectory($this->getEntityManager()->createQueryBuilder(), $directory))); 
$adapter->getItems(0, 5); 
//var_dump($adapter->getItems(0, 5)); **//display the corrent number of records** 

$paginator = new Paginator($adapter); 
$paginator->setDefaultItemCountPerPage(5); 
$page = (int)$this->params()->fromQuery("page"); 
if($page) $paginator->setCurrentPageNumber($page); 

return array('staffList' => $paginator); 

我DirectoryDAO類(相關部分)

public function searchStaffDirectory(QueryBuilder $queryBuilder, DirectoryModel $directory) { 
    $conditions = new Andx; 

    $queryBuilder 
      ->select('directory') 
      ->from('Directory\Model\DirectoryModel', 'directory'); 
    if (strlen($directory->surnameSearch)) { 
     $conditions->add($queryBuilder->expr()->like('directory.surnameSearch', "'".preg_replace('/\s+/', '', $directory->surnameSearch)."%'")); 
    } 
    if (strlen($directory->surnameSoundsSearch)) { 
     $conditions->add($queryBuilder->expr()->like('directory.surnameSoundsSearch', preg_replace('/\s+/', '', $directory->surnameSoundsSearch))); 
    } 
    if (strlen($directory->firstnameSearch)) { 
     $conditions->add($queryBuilder->expr()->like('directory.firsnameSearch', preg_replace('/\s+/', '', $directory->firstnameSearch))); 
    } 
    if (strlen($directory->telephoneNumber)) { 
     $conditions->add($queryBuilder->expr()->like('directory.telephoneNumber', preg_replace('/\s+/', '', $directory->telephoneNumber))); 
    } 
    if (strlen($directory->departmentSearch)) { 
     $conditions->add($queryBuilder->expr()->like('directory.departmentSearch', preg_replace('/\s+/', '', $directory->departmentSearch))); 
    } 
    if (strlen($directory->roleSearch)) { 
     $conditions->add($queryBuilder->expr()->like('directory.roleSearch', preg_replace('/\s+/', '', $directory->roleSearch))); 
    } 
    if ($conditions->count()) { 
      $queryBuilder->andWhere($conditions); 
    } 
    $queryBuilder 
      ->orderBy('directory.surname'); 

    return $queryBuilder->getQuery(); 
} 

我DirectoryModel類

<?php 

namespace Directory\Model; 

use Doctrine\ORM\Mapping; 

use Zend\InputFilter\Factory; 
use Zend\InputFilter\InputFilter; 
use Zend\InputFilter\InputFilterAwareInterface; 
use Zend\InputFilter\InputFilterInterface; 

/** 
* @Mapping\Entity 
* @Mapping\Table(name="staffdirectory_vw") 
*/ 
class DirectoryModel { 
    /** 
    * 
    * @Mapping\Id 
    * @Mapping\Column(name="mytable_pk", type="integer", unique=true) 
    */ 
    protected $pk; 

    /** 
    * 
    * @Mapping\Column(name="mytable_id", type="string") 
    */ 
    protected $id; 

    /** 
    * 
    * @Mapping\Column(name="mytable_parent_id", type="string") 
    */ 
    protected $parentId; 

    /** 
    * 
    * @Mapping\Column(name="mytable_auth_code", type="string") 
    */ 
    protected $fan; 

    /** 
    * 
    * @Mapping\Column(name="mytable_full_name", type="string") 
    */ 
    protected $fullname; 

    /** 
    * 
    * @Mapping\Column(name="mytable_name_title", type="string") 
    */ 
    protected $title; 

    /** 
    * 
    * @Mapping\Column(name="mytable_first_pref_name", type="string") 
    */ 
    protected $firstname; 

    /** 
    * 
    * @Mapping\Column(name="mytable_surname", type="string") 
    */ 
    protected $surname; 

    /** 
    * 
    * @Mapping\Column(name="mytable_bldg_long_desc", type="string") 
    */ 
    protected $building; 

    /** 
    * 
    * @Mapping\Column(name="mytable_display_department", type="string") 
    */ 
    protected $department; 

    /** 
    * 
    * @Mapping\Column(name="mytable_alias", type="string") 
    */ 
    protected $email; 

    /** 
    * 
    * @Mapping\Column(name="mytable_alias_list", type="string") 
    */ 
    protected $emailList; 

    /** 
    * 
    * @Mapping\Column(name="mytable_entity_type", type="string") 
    */ 
    protected $entityType; 

    /** 
    * 
    * @Mapping\Column(name="mytable_org_heirarchy", type="string") 
    */ 
    protected $organisationalHeirarchy; 

    /** 
    * 
    * @Mapping\Column(name="mytable_role", type="string") 
    */ 
    protected $role; 

    /** 
    * 
    * @Mapping\Column(name="mytable_room", type="string") 
    */ 
    protected $room; 

    /** 
    * 
    * @Mapping\Column(name="mytable_tele_number", type="string") 
    */ 
    protected $telephoneNumber; 

    /** 
    * 
    * @Mapping\Column(name="mytable_tele_number_formats", type="string") 
    */ 
    protected $telephoneNumberFormats; 

    /** 
    * 
    * @Mapping\Column(name="mytable_tele_rank", type="string") 
    */ 
    protected $teleRank; 

    /** 
    * 
    * @Mapping\Column(name="mytable_url", type="string") 
    */ 
    protected $url; 

    /** 
    * 
    * @Mapping\Column(name="mytable_search_surname", type="string") 
    */ 
    protected $surnameSearch; 

    /** 
    * 
    * @Mapping\Column(name="mytable_surname_soundex", type="string") 
    */ 
    protected $surnameSoundsSearch; 

    /** 
    * 
    * @Mapping\Column(name="mytable_search_first_name", type="string") 
    */ 
    protected $firstnameSearch; 

    /** 
    * 
    * @Mapping\Column(name="mytable_search_department", type="string") 
    */ 
    protected $departmentSearch; 

    /** 
    * 
    * @Mapping\Column(name="mytable_search_role", type="string") 
    */ 
    protected $roleSearch; 

    /** 
    * 
    * @Mapping\Column(name="mytable_tele_directory", type="string") 
    */ 
    protected $teleDirectory; 

    protected $inputFilter; 

    /** 
    * Magic getter to expose protected properties. 
    * 
    * @param string $property 
    * @return mixed 
    */ 
    public function __get($property) { 
     return $this->$property; 
    } 

    /** 
    * 
    * Magic setter to save protected properties. 
    * 
    * @param string $property 
    * @param mixed $value 
    */ 
    public function __set($property, $value) { 
     $this->$property = $value; 
    } 

    /** 
    * Convert the object to an array. 
    * 
    * @return array 
    */ 
    public function getArrayCopy() { 
     return get_object_vars($this); 
    } 

    /** 
    * Populate from an array. 
    * 
    * @param array $data 
    */ 
    public function populate($data = array()) { 
     $this->pk = isset($data['pk']) ? $data['pk'] : null; 
     $this->id = isset($data['id']) ? $data['id'] : null; 
     $this->fan = isset($data['fan']) ? $data['fan'] : null; 
     $this->fullname = isset($data['fullname']) ? $data['fullname'] : null; 
     $this->surname = isset($data['surname']) ? $data['surname'] : null; 
     $this->building = isset($data['building']) ? $data['building'] : null; 
     $this->department = isset($data['department']) ? $data['department'] : null; 
     $this->email = isset($data['email']) ? $data['email'] : null; 
     $this->emailList = isset($data['emailList']) ? $data['emailList'] : null; 
     $this->entityType = isset($data['entityType']) ? $data['entityType'] : null; 
     $this->organisationalHeirarchy = isset($data['organisationalHeirarchy']) ? $data['organisationalHeirarchy'] : null; 
     $this->role = isset($data['role']) ? $data['role'] : null; 
     $this->room = isset($data['room']) ? $data['room'] : null; 
     $this->telephoneNumber = isset($data['telephoneNumber']) ? $data['telephoneNumber'] : null; 
     $this->telephoneNumberFormats = isset($data['telephoneNumberFormats']) ? $data['telephoneNumberFormats'] : null; 
     $this->teleRank = isset($data['teleRank']) ? $data['teleRank'] : null; 
     $this->url = isset($data['url']) ? $data['url'] : null; 
     $this->surnameSearch = isset($data['surnameSearch']) ? $data['surnameSearch'] : null; 
     $this->surnameSoundsSearch = isset($data['surnameSoundsSearch']) ? $data['surnameSoundsSearch'] : null; 
     $this->firstnameSearch = isset($data['firstnameSearch']) ? $data['firstnameSearch'] : null; 
     $this->departmentSearch = isset($data['departmentSearch']) ? $data['departmentSearch'] : null; 
     $this->roleSearch = isset($data['roleSearch']) ? $data['roleSearch'] : null; 
     $this->teleDirectory = isset($data['teleDirectory']) ? $data['teleDirectory'] : null; 
    } 

    public function setInputFilter(InputFilterInterface $inputFilter) { 
     throw new \Exception("Not used"); 
    } 

    public function getInputFilter() { 
     if (!$this->inputFilter) { 
      $inputFilter = new InputFilter(); 
      $factory = new Factory(); 

      $inputFilter->add($factory->createInput(array(
        'name'  => 'surnameSearch', 
        'required' => false, 
        'filters' => array(
          array('name' => 'StripTags'), 
          array('name' => 'StringToUpper'), 
          array('name' => 'StringTrim'), 
        ), 
        'validators' => array(
          array(
            'name' => 'StringLength', 
            'options' => array(
              'encoding' => 'UTF-8', 
              'min'  => 1, 
              'max'  => 30, 
            ), 
          ), 
        ), 
      ))); 
      $inputFilter->add($factory->createInput(array(
        'name'  => 'surnameSoundsSearch', 
        'required' => false, 
        'filters' => array(
          array('name' => 'StripTags'), 
          array('name' => 'StringToUpper'), 
          array('name' => 'StringTrim'), 
        ), 
        'validators' => array(
          array(
            'name' => 'StringLength', 
            'options' => array(
              'encoding' => 'UTF-8', 
              'min'  => 1, 
              'max'  => 30, 
            ), 
          ), 
        ), 
      ))); 
      $inputFilter->add($factory->createInput(array(
        'name'  => 'firstnameSearch', 
        'required' => false, 
        'filters' => array(
          array('name' => 'StripTags'), 
          array('name' => 'StringToUpper'), 
          array('name' => 'StringTrim'), 
        ), 
        'validators' => array(
          array(
            'name' => 'StringLength', 
            'options' => array(
              'encoding' => 'UTF-8', 
              'min'  => 1, 
              'max'  => 30, 
            ), 
          ), 
        ), 
      ))); 
      $inputFilter->add($factory->createInput(array(
        'name'  => 'telephoneNumberSearch', 
        'required' => false, 
        'filters' => array(
          array('name' => 'Int'), 
        ), 
      ))); 
      $inputFilter->add($factory->createInput(array(
        'name'  => 'departmentSearch', 
        'required' => false, 
        'filters' => array(
          array('name' => 'StripTags'), 
          array('name' => 'StringToUpper'), 
          array('name' => 'StringTrim'), 
        ), 
        'validators' => array(
          array(
            'name' => 'StringLength', 
            'options' => array(
              'encoding' => 'UTF-8', 
              'min'  => 1, 
              'max'  => 30, 
            ), 
          ), 
        ), 
      ))); 
      $inputFilter->add($factory->createInput(array(
        'name'  => 'roleeSearch', 
        'required' => false, 
        'filters' => array(
          array('name' => 'StripTags'), 
          array('name' => 'StringToUpper'), 
          array('name' => 'StringTrim'), 
        ), 
        'validators' => array(
          array(
            'name' => 'StringLength', 
            'options' => array(
              'encoding' => 'UTF-8', 
              'min'  => 1, 
              'max'  => 30, 
            ), 
          ), 
        ), 
      ))); 

      $this->inputFilter = $inputFilter; 
     } 

     return $this->inputFilter; 
    } 
} 

回答

2

我認爲DoctrineAdapter實際上是DoctrineORMModule\Paginator\Adapter\DoctrinePaginator只是你用不同的名稱導入它。如果不是,那麼這是你應該使用的課程。

你的控制器應是:

$directory->populate($form->getData()); 
$adapter = new DoctrineAdapter(new ORMPaginator($directoryDao->searchStaffDirectory($this->getEntityManager()->createQueryBuilder(), $directory))); 

$paginator = new Paginator($adapter); 
$paginator->setItemCountPerPage(5); 
$page = (int)$this->params()->fromQuery("page"); 
$paginator->setCurrentPageNumber($page); 

return array('staffList' => $paginator); 

無需調用getItems,當你施放$page爲int那麼如果沒有頁面參數傳遞它會自動默認爲第一頁。

在視圖中使用paginator更復雜。首先你需要實現一個呈現paginator的視圖腳本。還有的ZF2文檔中的一些示例腳本的,你可以直接使用或立足自己的分頁程序關閉:

http://framework.zend.com/manual/2.2/en/modules/zend.paginator.usage.html#example-pagination-controls

要在實際視圖中使用分頁程序,你可以遍歷它像任何其他查詢結果顯示相關商品:

<?php foreach($staffList as $staff): ?> 

    Firstname: <?php echo $staff->firstname; ?> 

    etc. 

<?php endforeach; ?> 

這將只顯示當前項目當前頁的分頁程序是,這是你想要的。

要顯示分頁程序控件:

<?php echo $this->paginationControl($staffList, '<paginator type>', '<my paginator view script>', array('route' => '<route name>')); ?> 

分頁程序類型可以是:全部,橡筋,跳,滑動和決定如何以及什麼頁碼顯示在分頁程序控件。滑動是默認設置,很可能是最佳選擇。

+0

謝謝!這很好地工作。 :) – mrjayviper