2

アクションで $this->paginate が 1 回呼び出されたときにページネーションが正常に機能していますが、複数の呼び出しに対してはあまり適切にサポートされていないようです。これが私がやろうとしていることです...

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へのハック以外に、これらの各テーブルを個別にページ分割する方法は本当にありませんか?

すべてのデータを 1 つのテーブルに貼り付けてから、並べ替えを使用してステータスを区別できることは理解していますが、最初に何か不足していないかどうかを確認したかったのです。

4

2 に答える 2

2

これについてはあまり活動がなかったので、私は先に進み、合理的なことを行い、回避策を見つけました. 以下は私が思いついたものです:

コントローラ:

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>

elements/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(); 
?>
于 2012-09-06T14:31:37.597 に答える
0

私は同じ問題を抱えていて、 cakephp バージョン 2.5.3の次のクラスで問題を解決しました 。私のアプローチが古いバージョンでも機能するかどうかは確認していません。最初に、PaginationComponent と PaginationHelper を拡張し、いくつかのメソッドを上書きする Helper と Component クラスを作成しました。

/app/Controller/Component/_PaginatorComponent.php

<?php
/**
 * Filename:    _PaginatorComponent.php
 * User:        
 * 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:        
 * 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 のハックを望んでいないが、片側に複数のページネーションを持つ本当の可能性を望んでいない一部の人々を助けることができれば幸いです.

現時点では、'paramType' => 'named'のみを使用できます

私の意見では、PaginationComponent と PaginationHelper の元のコードは、読み取り、拡張、適応がひどいものです。

于 2014-01-18T23:36:43.267 に答える