libro
www.tuyano.com
初心者のためのCakePHP3 プログラミング入門

ページネーション (3/5)

作成:2015-10-10 09:31
更新:2015-10-10 09:38

■$paginateによるページネーション設定

なぜ、全エンティティが表示されてしまったのか。それは、「1ページ当たり、何件を表示するか」といったページネーションのための設定がなされていなかったからです。

Paginatorは、$paginateという変数を読み込んでページネーションのための設定を行います。コントローラー内にあらかじめこの変数(プロパティ)を用意しておくことで、思い通りにページネーションを行えるようになります。この変数は、以下のような形をしています。
public $paginate = [
    設定名 => 値,
    設定名 => 値,
    ……
];

$pagenateは、連想配列です。設定の項目をキーにしてその値を指定します。用意できる設定としては、とりあえず以下の様なものだけ覚えておけばよいでしょう。
limit => 数字
1ページ当たりのエンティティ数を指定します。これにより、paginateメソッドで指定した数だけエンティティが取り出されるようになります。
order => [ フィールド => 'asc' または 'disc', フィールド => ……]
並び順を設定するためのものです。これは連想配列になっており、並び替えの基準となるフィールド名に'asc'または'disc'のいずれかの値を指定します。
fields => [ フィールド1, フィールド2,……]
取得するフィールドを指定するためのものです。findメソッドなどではフィールド名の配列を用意することで特定のフィールドの値だけを抜き出せますが、あれと同様の働きをPaginatorに持たせることができます。

では、先ほどのPersonControllerを下のリストのように修正しましょう。これで、全エンティティではなく、最初の5つのエンティティだけが取り出され、表示されるようになります。ページ分けが機能していることがわかりますね。

ここでは、クラスに$paginateプロパティを用意して、以下のような設定を行っています。
'limit' => 5
これで、1ページあたりの表示数を「5」に設定しています。
'order' => [
    'Persons.name' => 'asc'
]
これで、nameフィールドを使って昇順にエンティティを並べ替えます。orderのフィールド名は、単に「name」ではなく、Persons.nameというように「クラス.プロパティ」という形で記述しましょう。これで、指定の項目を使ってエンティティを並べ替え、そこから必要なエンティティを取り出し表示できます。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

use App\Controller\AppController;
use Cake\Datasource\ConnectionManager;

class PersonsController extends AppController
{
    public $paginate = [
        'limit' => 5,
        'order' => [
            'Persons.name' => 'asc'
        ]
    ];
    
     public function initialize()
    {
        parent::initialize();
        $this->loadComponent('Paginator');
    }

    public function index()
    {
        $this->set('persons', $this->paginate());
    }

}

※関連コンテンツ

「初心者のためのCakePHP3 プログラミング入門」に戻る