Skip to content

Commit

Permalink
Merge pull request #7871 from Tomoya185-miyawaki/remove-paginator-com…
Browse files Browse the repository at this point in the history
…ponent

[5.x]Fix paginator component(ja)
  • Loading branch information
markstory authored Jun 16, 2024
2 parents 45c136d + c984d70 commit ad70c75
Show file tree
Hide file tree
Showing 7 changed files with 52 additions and 91 deletions.
2 changes: 1 addition & 1 deletion ja/contents.rst
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
core-libraries/internationalization-and-localization
core-libraries/logging
core-libraries/form
controllers/components/pagination
controllers/pagination
plugins
development/rest
security
Expand Down
2 changes: 1 addition & 1 deletion ja/controllers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,7 @@ CakePHP のコントローラーに紐づけることができます。 ::
このメソッドはモデルから取得した結果をページ分けするために使われます。
ページサイズやモデルの検索条件などを指定できます。
`paginate()` のより詳しい使い方は :doc:`ページネーション <controllers/components/pagination>`
`paginate()` のより詳しい使い方は :doc:`ページネーション <controllers/pagination>`
の章を参照してください。

``$paginate`` 属性は ``paginate()`` がどうふるまうかを簡単にカスタマイズする方法を提供します。 ::
Expand Down
1 change: 0 additions & 1 deletion ja/controllers/components.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ CakePHP の中に含まれるコンポーネントの詳細については、各
/controllers/components/authentication
/controllers/components/flash
/controllers/components/security
/controllers/components/pagination
/controllers/components/request-handling
/controllers/components/form-protection
/controllers/components/check-http-cache
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
ページネーション
#################

.. php:namespace:: Cake\Controller\Component
.. php:class:: PaginatorComponent
フレキシブルでかつユーザーフレンドリーなウェブアプリケーションを作成する際の主たる障害の
一つとなるのが、直感的なユーザーインターフェイスです。多くのアプリケーションはすぐに巨大となり
かつ複雑になり、デザイナーやプログラマーは、何百件、何千件ものレコードが表示されることに
Expand All @@ -23,17 +19,6 @@ CakePHP におけるページネーションは、コントローラーにおけ
基本的な使用方法
================

クエリをページ分割するには、まず ``PaginatorComponent`` をロードする必要があります。 ::

class ArticlesController extends AppController
{
public function initialize(): void
{
parent::initialize();
$this->loadComponent('Paginator');
}
}

一度ロードされれば、ORMテーブルクラスや ``Query`` オブジェクトをページ分割することができます。 ::

public function index()
Expand All @@ -42,41 +27,39 @@ CakePHP におけるページネーションは、コントローラーにおけ
$this->set('articles', $this->paginate($this->Articles));

// 部分的に完了したクエリをページ分割する
$query = $this->Articles->find('published');
$query = $this->Articles->find('published')->contain('Comments');
$this->set('articles', $this->paginate($query));
}

高度な使用方法
==============

``PaginatorComponent`` は、 ``$paginate`` のコントローラプロパティや ``paginate()`` の引数
``$paginate`` のコントローラプロパティや ``paginate()`` の引数
``$settings`` として設定することで、より複雑なユースケースをサポートしています。
これらの条件はページ分割クエリの基礎となります。
これらの条件は URLから渡される ``sort``, ``direction``, ``limit``, ``page``
のパラメータによって拡張されます。 ::

class ArticlesController extends AppController
{
public $paginate = [
protected array $paginate = [
'limit' => 25,
'order' => [
'Articles.title' => 'asc'
]
'Articles.title' => 'asc',
],
];
}

.. tip::
デフォルトの ``order`` オプションは配列として定義されていなければなりません。

:php:meth:`~Cake\\ORM\\Table::find()` でサポートされているオプションのいずれかを
ページ分割の設定に含めることができます。
ページネーションオプションを :ref:`custom-find-methods` にバンドルする方が
すっきりしていてシンプルです。
``finder`` オプションを使用することで、ページ分割の際にファインダーを使用することができます。 ::

class ArticlesController extends AppController
{
public $paginate = [
protected array $paginate = [
'finder' => 'published',
];
}
Expand Down Expand Up @@ -114,7 +97,7 @@ CakePHP におけるページネーションは、コントローラーにおけ

class ArticlesController extends AppController
{
public $paginate = [
protected array $paginate = [
'Articles' => [],
'Authors' => [],
];
Expand All @@ -136,39 +119,16 @@ CakePHP におけるページネーションは、コントローラーにおけ
'Next' と 'Previous' リンクだけを表示したい場合は、カウントクエリを行わない
'simple' paginator を使うことができます。 ::

public function initialize(): void
class ArticlesController extends AppController
{
parent::initialize();

// Load the paginator component with the simple paginator strategy.
$this->loadComponent('Paginator', [
'paginator' => new \Cake\Datasource\SimplePaginator(),
]);
protected array $paginate = [
'className' => 'Simple', // Or use Cake\Datasource\Paging\SimplePaginator::class FQCN
];
}

``SimplePaginator`` を使っている場合、ページ番号やカウンターデータ、最後のページへのリンク、
総レコード数のコントロールを生成することはできません。

PaginatorComponent を直接使用する
=================================

他のコンポーネントからデータをページ分割する必要がある場合は
``PaginatorComponent`` を直接使うと良いでしょう。
``PaginatorComponent`` はコントローラメソッドと似たようなAPIを持っています。 ::

$articles = $this->Paginator->paginate($articleTable->find(), $config);

// または
$articles = $this->Paginator->paginate($articleTable, $config);

最初のパラメータは、ページ分割したいテーブルオブジェクトの検索結果からの
クエリオブジェクトでなければなりません。
オプションで、テーブルオブジェクトを渡してクエリを作成することもできます。
2番目のパラメータは、ページ分割に使用する設定の配列です。
この配列はコントローラの ``$paginate`` プロパティと同じ構造でなければなりません。
``Query`` オブジェクトをページ分割する際には、 ``finder`` オプションは無視されます。
これは、ページ分割したいクエリを渡していることを前提としています。

.. _paginating-multiple-queries:

複数のクエリのページ分割
Expand All @@ -179,7 +139,7 @@ PaginatorComponent を直接使用する
ページ分割することができます。 ::

// ページ分割するプロパティ
public $paginate = [
protected array $paginate = [
'Articles' => ['scope' => 'article'],
'Tags' => ['scope' => 'tag']
];
Expand Down Expand Up @@ -207,14 +167,14 @@ PaginatorComponent を直接使用する

// コントローラーアクションにおいて
$this->paginate = [
'ArticlesTable' => [
'Articles' => [
'scope' => 'published_articles',
'limit' => 10,
'order' => [
'id' => 'desc',
],
],
'UnpublishedArticlesTable' => [
'UnpublishedArticles' => [
'scope' => 'unpublished_articles',
'limit' => 10,
'order' => [
Expand All @@ -224,9 +184,8 @@ PaginatorComponent を直接使用する
];

$publishedArticles = $this->paginate(
$this->Articles->find('all', [
'scope' => 'published_articles'
])->where(['published' => true])
$this->Articles->find('all', scope: 'published_articles')
->where(['published' => true])
);

// ページ分割コンポーネントで差別化できるようにテーブルオブジェクトを追加登録します。
Expand All @@ -237,9 +196,8 @@ PaginatorComponent を直接使用する
]);

$unpublishedArticles = $this->paginate(
$unpublishedArticlesTable->find('all', [
'scope' => 'unpublished_articles'
])->where(['published' => false])
$unpublishedArticlesTable->find('all', scope: 'unpublished_articles')
->where(['published' => false])
);

.. _control-which-fields-used-for-ordering:
Expand All @@ -253,10 +211,10 @@ PaginatorComponent を直接使用する
ソートできるフィールドのホワイトリストを ``sortableFields`` オプションを使って設定することができます。
このオプションは関連するデータやページ分割クエリの一部である計算フィールドをソートしたい場合に必要です。 ::

public $paginate = [
protected array $paginate = [
'sortableFields' => [
'id', 'title', 'Users.username', 'created'
]
'id', 'title', 'Users.username', 'created',
],
];

ホワイトリストにないフィールドでソートしようとするリクエストは無視されます。
Expand All @@ -271,31 +229,17 @@ PaginatorComponent を直接使用する
もしこのデフォルト値がアプリケーションにとって適切でない場合は、
ページ分割オプションの一部として調整することができます。 ::

public $paginate = [
// 他のキーはこちら
protected array $paginate = [
// Other keys here.
'maxLimit' => 10
];

リクエストのリミットパラメータがこの値よりも大きければ、 ``maxLimit`` の値まで減らされます。

追加の関連付けへのジョイン
===============================

追加の関連付けをページ分割されたテーブルにロードするには、 ``contain`` パラメータを使用します。 ::

public function index()
{
$this->paginate = [
'contain' => ['Authors', 'Comments']
];

$this->set('articles', $this->paginate($this->Articles));
}

範囲外のページ要求
==================

PaginatorComponent は、存在しないページにアクセスしようとすると ``NotFoundException``` をスローします。
``Controller::paginate()`` は、存在しないページにアクセスしようとすると ``NotFoundException``` をスローします。

そのため、通常のエラーページをレンダリングさせるか、 try catch ブロックを使用して
``NotFoundException`` が発生した場合に適切な処理を行うことができます。 ::
Expand All @@ -308,17 +252,36 @@ PaginatorComponent は、存在しないページにアクセスしようとす
$this->paginate();
} catch (NotFoundException $e) {
// 最初のページや最後のページにリダイレクトするようにします。
// $this->request->getAttribute('page')を指定すると、必要な情報が得られます。
// $e->getPrevious()->getAttributes('pagingParams')を指定すると、必要な情報が得られます。
}
}

paginatorクラスを直接利用する
================================

paginatorクラスを直接利用することも可能です。 ::

// paginatorのインスタンスを生成する
$paginator = new \Cake\Datasource\Paginator\NumericPaginator();

// モデルをページネーションする
$results = $paginator->paginate(
// ページ分割が必要なクエリまたはテーブルインスタンス
$this->fetchTable('Articles'),
// リクエストパラメーター
$this->request->getQueryParams(),
// Config array having the same structure as options as Controller::$paginate
[
'finder' => 'latest',
]
);

ビューのページネーション
========================

ページネーションナビゲーションのリンクの作り方は、 :php:class:`~Cake\\View\\Helper\PaginatorHelper`
のドキュメントを確認してください。

..
meta::
.. meta::
:title lang=ja: ページネーション
:keywords lang=ja: order array,query conditions,php class,web applications,headaches,obstacles,complexity,programmers,parameters,paginate,designers,cakephp,satisfaction,developers
:keywords lang=ja: paginate,pagination,paging
2 changes: 1 addition & 1 deletion ja/topics.rst
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ CakePHP のすべての重要な部分の紹介
* :doc:`/development/sessions`
* :doc:`/development/rest`
* :doc:`/controllers/components/authentication`
* :doc:`/controllers/components/pagination`
* :doc:`/controllers/pagination`
* :ref:`csrf-middleware`
* :doc:`/core-libraries/email`
* :doc:`/views/helpers/form`
Expand Down
3 changes: 1 addition & 2 deletions ja/tutorials-and-examples/cms/articles-controller.rst
Original file line number Diff line number Diff line change
Expand Up @@ -182,13 +182,12 @@ view テンプレートの作成
{
parent::initialize();

$this->loadComponent('Paginator');
$this->loadComponent('Flash'); // FlashComponent をインクルード
}

public function index()
{
$articles = $this->Paginator->paginate($this->Articles->find());
$articles = $this->paginate($this->Articles->find());
$this->set(compact('articles'));
}

Expand Down
2 changes: 1 addition & 1 deletion ja/views/helpers/paginator.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ PaginatorHelper は、ページ番号や次ページへ/前ページへのリ
と連携して機能します。

ページ制御を組み込んだデータセットの作成や、ページ制御関連のクエリーについての詳細は
:doc:`/controllers/components/pagination` を参照してください。
:doc:`/controllers/pagination` を参照してください。

.. _paginator-templates:

Expand Down

0 comments on commit ad70c75

Please sign in to comment.