CakePHP的和分页多个结果集(Cakephp and paginating multiple r

2019-06-27 21:14发布

我有分页的时候$这个 - > PAGINATE是在动作调用一次工作正常,但它似乎没有成为多个呼叫很好的支持。 这里就是我希望做...

function admin_index() {

    $published = $this->pagination('Post', array('status'=>1));
    $unpublished = $this->pagination('Post', array('status'=>0));

    $this->set('published', $published);
    $this->set('unpublished', $unpublished);
}

我的观点的一个简化版本是:

<h1>Unpublished Posts</h1>
<?php echo $this->element('table', array('posts'=>$unpublished)); ?>
<h1>Published Posts</h1>
<?php echo $this->element('table', array('posts'=>$published)); ?>

简单,我可以重新使用相同的元件,以显示不同类型的数据。 是否真的有围绕每个分页表,这些分别比jQuery的表选机/黑客把CakePHP其他的没有办法?

我明白,我可以坚持所有的数据在一个表中,然后只用排序的状态来区分,但我想检查我第一次失去了一些东西。

Answer 1:

因为没有太多的活动在此,我继续做了合理的事情,并想出了一个解决方法。 下面是我想出了:

控制器:

function index() {
    $active = $this->paginate('Post', array('Post.status'=>1));     
    $activePaging = $this->request->params['paging']['Post'];

    $inactive = $this->paginate('Post', array('Post.status'=>0));
    $inActivePaging = $this->request->params['paging']['Post'];

    $this->set('active', $active);
    $this->set('inactive', $inactive);

    $this->request->params['paging']['Active'] = $activePaging;
    $this->request->params['paging']['InActive'] = $inActivePaging;
    unset($this->request->params['paging']['Post']);
}

public function paginate() {
    if ($this->request->is('ajax')) {
        $model = $this->request->params['named']['model'];
        $status = $model === 'Active' ? 1 : 0;

        $posts = $this->paginate('Post', array('Post.status'=>$status));
        $paging = $this->request->params['paging']['Post'];
        unset($this->request->params['paging']['Post']);
        $this->request->params['paging'][$model] = $paging;

        $this->set('posts', $posts);
        $this->set('model', $model);
        $this->render('/Posts/ajax_posts_paginated', 'ajax');
    }
}

查看:(简化的)

index.ctp

<h3>Inactive Posts</h3>
<div class="well" id="InActive">
<?php echo $this->element('posts_table_paginated', array('posts'=>$inactive, 'model'=>'InActive')); ?>
</div>

<h3>Active Posts</h3>
<div class="well" id="Active">
<?php echo $this->element('posts_table_paginated', array('posts'=>$active, 'model'=>'Active')); ?>
</div>

元件/ posts_table_paginated.ctp

<?php
$this->Paginator->options(array(
    'update' => '#'.$model,
    'evalScripts' => true,
    'url'=> array('controller'=>'posts', 'action'=>'paginate', 'model'=>$model)
));
?>
<table>
    <tr>
        <th><?php echo $this->Paginator->sort('id', 'ID', array('model'=>$model)); ?></th>
        <th><?php echo $this->Paginator->sort('title', 'Title', array('model'=>$model)); ?></th>
        <th><?php echo $this->Paginator->sort('created', 'Created', array('model'=>$model)); ?></th>
        <th>Created by</th>
    </tr>
    <?php 
    foreach ($posts as $post): 
    ?>
    <tr>
        <td><?php echo $post['Post']['id']; ?></td>
        <td><?php echo $post['Post']['title']; ?></td>
        <td><?php echo $post['Post']['created']; ?></td>
        <td><?php echo $post['User']['username']; ?></td>
    </tr>
    <?php 
    endforeach; 
    ?>
</table>
<?php
    if ($this->params['paging'][$model]['count'] > 0) {
?>
<div id="pagination">
    <ul id="paginate">
        <?php
            echo $this->Paginator->prev(__('previous'), array('tag' => 'li', 'model'=>$model), null, array('tag'=>'li', 'class'=>'prev off'));
            echo $this->Paginator->numbers(array('tag'=>'li', 'model'=>$model, 'separator' => false));
            echo $this->Paginator->next(__('next'), array('tag' => 'li', 'model'=>$model), null, array('tag'=>'li', 'class'=>'next off'));
        ?>
    </ul>
</div>

<?php 
    }
    echo $this->Js->writeBuffer(); 
?>


Answer 2:

我有同样的问题,并与CakePHP的版本2.5.3以下的课程我没有检查我的方法是否也适用于旧版本解决了这个问题。 首先,我创建延伸PaginationComponent和PaginationHelper一个助手和组件类,并重写了一些方法。

/app/Controller/Component/_PaginatorComponent.php

<?php
/**
 * Filename:    _PaginatorComponent.php
 * User:        Mitja Stelzner
 * Date:        18.01.14
 */
App::import('Component', 'Paginator');
class _PaginatorComponent extends PaginatorComponent{
    public function paginate($object = null, $scope = array(), $whitelist = array())
    {
        //Adopt from the beginning of parent::paginate
        if (is_array($object))
            $object = null;
        $object = $this->_getObject($object);

        $options = $this->mergeOptions($object->alias); //get options
        $params = $this->Controller->request->params; //get params

        //if custom page name is set
        if(isset($params['named'][$options['pageRequestName']]))
        {
            //get the page number and set it as 'page' in the request (for other methods in the Component)
            $page = $params['named'][$options['pageRequestName']];
            $this->Controller->request->params['named']['page'] =intval($page);
        }
        else
            $this->Controller->request->params['named']['page'] = 1; //else set the page number to 1

        $pageRequestName = null; //important for parent::paginate

        $results = parent::paginate($object, $scope, $whitelist); // TODO: Change the autogenerated stub
        unset($this->Controller->request->params['named']['page']); //remove the appended page number

        //get the options again
        $options = $this->mergeOptions($object->alias);
        //and add the pageRequestName to the paging array
        if(isset($options['pageRequestName']))
        $this->Controller->request['paging'] = array_merge_recursive(
            (array)$this->Controller->request['paging'],
            array($object->alias => array('pageRequestName'=>$options['pageRequestName']))
        );
        return $results;
    }

}

/app/View/Helper/_PaginatorHelper.php

<?php
/**
 * Filename:    _PaginatorHelper.php
 * User:        Mitja Stelzner
 * Date:        18.01.14
 */
App::uses('PaginatorHelper', 'View/Helper');
class _PaginatorHelper extends PaginatorHelper{
    public function link($title, $url = array(), $options = array()) {
        //change the page parameter 'page' to the custom pageRequestName
        if(isset($url['page']))
        {
            $params = $this->params($this->model);
            if(isset($params['pageRequestName']))
            {
                $url[$params['pageRequestName']] = $url['page'];
                unset($url['page']);
            }
        }
        return parent::link($title,$url,$options);
    }

    protected function _pagingLink($which, $title = null, $options = array(), $disabledTitle = null, $disabledOptions = array())
    {
        //Prevent the deletion of the variable model
        $disabledOptions['model'] = $options['model'];
        return parent::_pagingLink($which, $title, $options, $disabledTitle, $disabledOptions); // TODO: Change the autogenerated stub
    }

    private $model = null;
    public function numbers($options = array())
    {
        //Only to set the model again
        if(isset($options['model']))
            $this->model = $options['model'];
        return parent::numbers($options); // TODO: Change the autogenerated stub
    }


}

和视图元素迅速使用分页:

/app/View/Element/paging.ctp

<div class="paging">
    <?php
    $options = !isset($modelName)?array():array('model'=>$modelName);
    echo $this->Paginator->prev('< ' . __('zurück'), $options, null, array('class' => 'prev disabled'));
    echo $this->Paginator->numbers(array('separator' => '')+$options);
    echo $this->Paginator->next(__('vor') . ' >', $options, null, array('class' => 'next disabled'));
    ?>
</div>

您可以拨打寻呼元素在你看来是这样的:( 文档 )

<?php
echo $this->element('paging',array('modelName'=>'Customer'));
?>

如果你想使用新创建的分页程序,你不得不说CakePHP的使用你的类,而不是正常的分页程序。 在你的控制器,可以设置PaginatorHelper和PaginatorComponent这样的:(发现这里 )

public $helpers = array('Paginator' => array('className' => '_Paginator' ));
public $components = array('Paginator' => array('className' => '_Paginator' ));

您的控制器内的使用情况。 在$ PAGINATE都可归为Modelgroups:( 文档 )

public $paginate = array(
        'Customer' => array (
            'limit' => 25,
            'pageRequestName' => 'cpage'
        ),
        'Employer' => array (
            'limit' => 25,
            'pageRequestName' => 'erpage'
        ),
        'Employee' => array (
            'limit' => 25,
            'pageRequestName' => 'eepage'
        )
    );

我却用它在以下方面:

$this->Paginator->settings['Customer'] = array(
            'conditions'=>array(
                'OR'=>array(
                    array('name LIKE'=>'%'.$search_query.'%'),
                )
            ),
            'limit' => 5,
            'pageRequestName' => 'cpage'
        );
        $result = $this->Paginator->paginate('Customer');

我希望我能帮助一些人不希望JavaScript的黑客是谁,而是一种现实的可能性有一侧几个Paginations。

此刻的你只能用“paramType” =>“命名”

在我看来,在PaginationComponent和PaginationHelper原代码是可怕的阅读,扩展和适应。



文章来源: Cakephp and paginating multiple result sets