Skip to content

RepeaterPageArray::applySortOrder() change-detection is token-unsafe — substring match on loadOrder skips legitimate updates (72be1bfd) #2236

@adrianbj

Description

@adrianbj

Short description of the issue

Commit 72be1bfd added a sort-order change detector in RepeaterPageArray and FieldtypeRepeater that uses strpos("$value", $loadOrder) === 0 against the PageArray's __toString form (id1|id2|...). Because it's a substring prefix check rather than a token comparison, it false-matches on digit-prefix collisions between IDs.

Expected behavior

In-place ID substitutions or reorderings that change the effective sort sequence cause applySortOrder() to run.

Actual behavior

wire/modules/Fieldtype/FieldtypeRepeater/RepeaterPageArray.php:206 and FieldtypeRepeater.module:1590:

$loadOrder = $value->finderOptions('loadOrder');
if($loadOrder && strpos("$value", $loadOrder) !== 0) {
    // ... applySortOrder ...
}

Failure cases:

  • loadOrder = "1", current "10"strpos === 0 → applySortOrder skipped (ID 1 replaced with ID 10 in a single-item list).
  • loadOrder = "12|345", current "12|3456"strpos === 0 → skipped (item 345 removed, item 3456 added in same slot).

Optional: Suggestion for a possible fix

Compare as tokens or use full-string equality:

$current = (string) $value;
if($loadOrder && $loadOrder !== $current) {
    // ... applySortOrder ...
}

Setup/Environment

  • ProcessWire version: dev @ 15c749ed
  • Files: wire/modules/Fieldtype/FieldtypeRepeater/RepeaterPageArray.php:206 and FieldtypeRepeater.module:1590
  • Introduced in commit 72be1bfd

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions