最近の Drupal プロジェクトで、非常に奇妙な問題に遭遇しました。検索結果ページのレコードの総数とページの総数が常に間違った固定数になります。この非常に混乱した幻想により、私たちはさまざまな間違った方向に問題の答えを模索することになり、何も進歩しませんでしたが、問題の本当の原因を突き止めたとき、その結果は衝撃的であると言えます。
まず、すべてのカスタム開発部分を無効にしました。テーマを drupal のデフォルトのフロントエンド テーマ Bartik に戻し、すべての自己開発モジュールを無効にしてから、それらを少しずつ再インストールしました。テストの結果、問題は次のとおりであることがわかりました。テーマ部分。
しかし、次のステップはさらに混乱します。第一に、私たちのテーマはデフォルトの検索結果をいくつかの非常に小さなオーバーライドを行うだけですが、これは問題を引き起こすほどではありません。第二に、Zen などの他のテーマに切り替えるときも同様です。同じ問題が発生します。したがって、問題はテーマ部分にあるというこれまでの結論は覆されました。
次に、異常なデータ、キーワードのインデックス作成、キャッシュなどの問題を探しました。これも無駄だったので、コード部分に戻って関数の実行パスを 1 つずつたどったところ、あるブロックがレンダリングされた後にレコードの総数が変更されていることがわかりました。ビュー モジュールによって生成されたページ分割されたビュー。
これは Views の Pager ID の問題に違いないことに突然気づき、以前にもこの問題に遭遇したことがあり、今後は注意するように自分に言い聞かせましたが、今回はまだ無視しているとは予想していませんでした。 。
そう、下の写真の場所です
ほとんどの場合、デフォルト設定のままで問題ないため、この小さな設定は多くの人に無視されることがよくあります。ただし、ページ上に複数のページネータがある場合、この設定は重要になることに注意してください (これは通常、ビューによって生成されたページ分割されたビューがブロックとしてページに埋め込まれている場合に発生します)。同じページ上の各ポケットベルには異なる ID が必要であり、この ID はここのオプションで設定されるためです。
それでは、この Pager ID とは一体何なのでしょうか? プロジェクトの問題を解決しながら、drupal のコア コードの一部も詳しく調べて、Pager ID についてさらに深く理解しました。
Drupal では、私たちが目にするすべてのページャーは、次の 4 つのグローバル配列変数に基づいて生成されていることがわかりました。
global $pager_page_array; // 現在のページ番号を保存しますglobal $pager_total; // 総ページ数を格納します
global $pager_total_items; // レコードの総数を格納します
global $pager_limits; // ページごとのレコード数を保存します
各変数は配列であるため、drupal は異なる配列添字を使用して複数のページネーターを区別できます。この添字、つまりインデックスは、前述のポケットベル ID です。
一般的に、ページャーを表示するために必要なモジュールは、基本的にEntityとその派生モジュールです。エンティティ モジュールは、ポケットベル ID をインクリメントすることで複数のポケットベルを自動的に区別するため、複数のポケットベルが同じページに表示される場合、それらは互いに平和に共存します。
ただし、Views モジュールがページャーを生成するとき、デフォルトではページャー ID は 0 なので、ページ上に複数のページャーがある場合、そのページャーは 0 のページャー ID で上書きされます。これは私たちがプロジェクトで遭遇したことです。検索結果ページのページャーが、ビューによって生成されたブロック ページャーによって上書きされました。この場合、ポケットベル ID を手動で設定する必要があります。 Pager ID はどのような設定が適切ですか? 実際には、区別できる限り、一般的には大きな番号に設定する方が安全です。