ADR-199: A copy is a hidden draft, and a page is copied without its branch
- Status
-
Accepted
- Date
-
2026-09-23
- Amends
-
ADR-180 (its one-record rule, for the rows core's copy command brings along)
- Authors
-
Netresearch DTT GmbH
Context
ADR-180 held that one call creates one record, so an approver
judges one thing. copy_ (ADR-198) runs core's copy
command, and that command is more than one row: it copies the translations of a
default-language record — since 13.4.25 only where the target site carries their
language — the file references and inline children of every copied row, and for
a page the records stored on it — for a non-admin, those of the tables in
tables_. It can also copy a page's whole branch, and it hides only
what it copies FIRST: hide applies to the top record, unless the
user's never preference switches even that off.
Decision
- The copy is core's copy. The rows it brings along are the ones the page module's copy would bring; the tool does not pick among them, and the approval card counts them — the translations, and for a page the content elements on it.
- The copy is hidden, whatever core and the user's preferences say — and
so is every translation copied with it. The hidden column is set in the
paste
updateof the same command, which reaches the copy only; the copied translations get it from core'shide, which the user preferenceAt Copy never(pinned to 0 for the call) and page TSconfigHide At Copy disableswitch off, so the tool sets it on every copied translation that came out visible, in a second write of the same call. Readback checks the main record'sHide At Copy pid,hiddenandcoland returned translations. A failing checked record is deleted again with its translations, and the answer says whether that worked. Between the copy and the second write a copied translation can be visible for the duration of one request. This workflow does not guarantee invisibility at every intermediate instant. Inline children, page content and other core-copied records are not all read back; the hidden main copy may survive a core complaint about those records, with a warning about incomplete copying.Pos - A page is copied without its subpages, always. Core would hide only
the top page of a copied branch and leave every copied subpage as visible
as its original — reachable under a hidden parent, with a new URL. The
depth is pinned to 0 for the call: TYPO3 14 reads it from the acting
user's
copypreference, which the tool sets for the call and puts back without saving it; TYPO3 13 reads the DataHandler'sLevels copy, which is 0 unless set.Tree - Translations follow core. A translation is never copied by itself.
In TYPO3 14 and 13.4.25 or later no translation is copied outside a
site; inside one, a translation is copied where the site has its
language (for an element, where the target page is translated into it),
and core complaints are reported. A complaint does not always remove a
valid hidden main copy; rollback follows the explicit readback checks
(
Data). Before 13.4.25 core asks no site: it copies every page translation, and drops an element translation the target page is not translated into without an error. The tool adds no rule of its own; the card states the running core's rule, and the answer counts the translations that were placed. A page translation is no target.Handler:: copy L10n Overlay Records ()
Consequences
✓ The one-record rule becomes "one record the approver named, and what core copies with it, counted on the card" — the rule a human applies in the page module.
✕ A branch is copied page by page, one approval each. That is slower than core's recursive copy and is the price of every copied page being hidden.
Revisit when
A branch copy is wanted often enough that one approval per page is a burden; the rule then needs every copied page hidden in the same command, which core's copy does not offer.