Skip to content

ブログ記事一覧が1件しか表示されない不具合を修正 - #4503

Merged
ryuring merged 1 commit into
baserproject:5.4.xfrom
ryuring:fix/4501-blog-posts-limited
Aug 19, 2026
Merged

ブログ記事一覧が1件しか表示されない不具合を修正#4503
ryuring merged 1 commit into
baserproject:5.4.xfrom
ryuring:fix/4501-blog-posts-limited

Conversation

@ryuring

@ryuring ryuring commented Aug 18, 2026

Copy link
Copy Markdown
Collaborator

fix #4501

原因

BcArrayHelper::first()Query を受け取ると toArray() で実行していました。

CakePHP 5.2 の ResultSet はイテレータを共有するため、テンプレートの foreach が1件目を取り出した直後に first() が同じ ResultSet を最後まで読み切ってしまいます。結果として foreach に戻った時点で残りが消費済みとなり、2件目以降が描画されずループが終了していました。

foreach ($posts as $key => $post):
    if ($this->BcArray->first($posts, $key)):   // ここで Query が実行される

修正

Query の反復は 0 起点の連番キーとなるため、実行せずキーの比較のみで判定するようにしました。

if($array instanceof Query) {
    return $key === 0;
}

last()count() は件数取得用のクエリを別途発行し、反復中の ResultSet を消費しないため変更していません(意図が伝わるようコメントのみ追加)。

Issue の修正案との違い

Issue では恒久対応として BlogHelper::getPosts() での配列化が挙げられていますが、下記の理由から BcArrayHelper 側での修正としました。

  • 根本原因である「反復中のイテレータ消費」を1箇所で解消できる
  • getPosts() の戻り値の型(Query)を変えずに済む。getIndex(): Query との一貫性が保てる
  • テンプレートを修正しなくても直るため、サードパーティのテーマも救われる

テストについて

既存の testFirstWithQuery は、toArray()1起点のキー配列を返すモックを前提としていました。実際の Query の反復は 0 起点であり、モックが実態と異なっていたため本件を検出できていませんでした。

実データで反復キーが 0 起点であることを確認したうえで、「toArray() を呼ばないこと」と「0 起点で判定すること」を検証する形に改めています。修正前の実装に戻すとこのテストが失敗することも確認済みです。

動作確認

BcColumn テーマのトップページで、works / news / topics の各一覧が 1件 → 4件blogPosts(..., 4) の指定どおり)になることを確認しました。first / last のクラス付与も正しく機能しています。

BcArrayHelperTest は8件すべて成功します。

BcArrayHelper::first() が Query を受け取ると toArray() で実行しており、
呼び出し元が反復中の ResultSet を消費してしまっていた。
CakePHP 5.2 の ResultSet はイテレータを共有するため、foreach の1件目で
first() が呼ばれた時点で残りが読み切られ、2件目以降が描画されない。

Query の反復は 0 起点の連番キーとなるため、実行せずキーの比較のみで判定する。
last() の count() は件数取得用のクエリを別途発行し反復に影響しないため変更しない。

テストは toArray() の戻り値を1起点のキー配列とするモックを前提としており、
実際の反復キー(0起点)と異なっていたため本件を検出できていなかった。
Query を実行しないことを検証する形に改めた。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings August 18, 2026 10:15
@github-actions
github-actions Bot requested review from kaburk and katokaisya August 18, 2026 10:15

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

ブログ記事一覧テンプレートで Queryforeach 反復中に BcArrayHelper::first() を呼ぶと、ResultSet の共有イテレータが消費されて2件目以降が描画されない不具合(#4501)を、BcArrayHelper 側で解消するPRです。

Changes:

  • BcArrayHelper::first()Query を受け取った場合に toArray() で実行せず、反復キー(0起点)だけで先頭判定するよう変更
  • BcArrayHelper::last()Query->count() が反復中の ResultSet を消費しない旨のコメントを追加
  • BcArrayHelperTest::testFirstWithQuery() を「toArray() を呼ばないこと」と「0起点判定」を検証する形に修正

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
plugins/baser-core/src/View/Helper/BcArrayHelper.php Query を反復中に消費しないよう first() の実装を変更し、ブログ一覧の表示欠けを防止
plugins/baser-core/tests/TestCase/View/Helper/BcArrayHelperTest.php Query に対する first() の期待動作(未実行・0起点判定)へテストを更新

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread plugins/baser-core/src/View/Helper/BcArrayHelper.php
@ryuring
ryuring merged commit a232a79 into baserproject:5.4.x Aug 19, 2026
8 checks passed
@ryuring
ryuring deleted the fix/4501-blog-posts-limited branch August 19, 2026 01:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

【テーマ】ブログ記事一覧ヘルパー(posts())で、テーマ側の実装次第では2件目以降が表示されないことがある

4 participants