如何使用Zend2 / Doctrine组合分页(使用Doctrine提供的分页器适配器)?

时间:2013-06-28 06:12:54

标签: doctrine-orm zend-framework2

我一直在寻找关于如何做我问的例子/指南。

我找到了几个例子,我发现的“最好的”是这个=> http://blog.loftdigital.com/blog/doctrine-plus-zf2-tips-pagination

2个问题

  1. 我不确定我的paginator对象是否包含正确数量的记录(我将其限制为适配器对象上的5条记录)

  2. 我不知道如何遍历视图文件中的paginator对象。它似乎非常复杂。我在包含事物的对象上做了一个print_r在一个预HTML标签中,它在我的文本编辑器上很容易20 + K行(复制/粘贴后)

  3. 你能帮忙吗?

    非常感谢


    我的控制器代码基于示例(不是真的有效但没有zend / doctrine错误。问题是它给了我所有记录而不是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;
        }
    }
    

1 个答案:

答案 0 :(得分: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时,如果没有传递任何页面参数,它将自动默认为第一页。

在视图中使用分页器更复杂。首先,您需要实现一个呈现分页器的视图脚本。 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>')); ?>

Paginator类型可以是:All,Elastic,Jumping,Sliding,并确定在分页器控件上显示的页码和页码。滑动是默认设置,很可能是最佳选择。