---
title: "Updating and managing records"
manual: "LLM Foundation"
version: "main"
permalink: "https://docs.typo3.org/permalink/netresearch/nr-llm:updating-and-managing-records@main"
source: "Administration/StructuralTools.rst"
rendered: "2026-11-12T15:41:35+00:00"
---

# Updating and managing records {#updating-and-managing-records}

-   **`update_content_element`**

    Changes fields of one existing content element ([ADR-198](https://docs.typo3.org/permalink/netresearch/nr-llm:adr-198@main)).
    The field set is the one `create_content_element_draft` offers for a new
    element of the same type — the scalar columns of the type's form, header and
    body text included — checked by the same rules ([ADR-196](https://docs.typo3.org/permalink/netresearch/nr-llm:adr-196@main)): a
    value outside a select's items, a number outside its range, a column the
    page's TSconfig hides or makes read-only is refused, and the refusal names
    the columns the type offers. An element whose type the exclusion rule leaves
    out — raw HTML, plugins, menus, shortcuts, a form holding a FlexForm or
    inline children — is refused whole; relations and the identity, position,
    visibility, publication, audience and translation columns are never fields. A
    column a translation takes from its default-language element (\``l10n_mode =
    exclude`\`) is refused and the element to change named. The approval card
    shows every column's change, bound to the whole value. Where some columns
    take and others do not, the answer says which. Authorised by content-edit
    rights on the page, the record-level rights and the field-level grant for
    every column.

-   **`publish_record`**

    Clears the hidden flag of one page or content element — the step after a
    human has reviewed a draft — and changes nothing else. Start and stop
    times and access groups stay as they are; the approval card names them,
    and a hidden default-language record behind a translation, where they still
    keep the record from visitors. A record that is not hidden is not written.
    Needs page-edit rights on a page or content-edit rights on an element's
    page, and the field-level grant for the hidden column.

-   **`delete_record`**

    Deletes one page or content element with core's delete command. The row is
    flagged `deleted` and stays recoverable from the recycler. What core
    deletes with it is counted on the approval card first: the translations of a
    default-language record, and for a page its subpages (their uids, ten and
    then "and N more"), their translations, and the records stored on the pages
    table by table. The counts include records the acting user cannot see; they
    are counts only, never titles. A page with subpages is refused unless the
    call sets `include_subpages`; a branch of more than 50 pages is refused
    outright, and a site root is never deleted. The card also counts the records
    the reference index says still point at the record — links and shortcuts that
    will break. Needs delete rights on a page (and on every page of its branch),
    content-edit rights for an element, and the right to edit every translation
    that goes along; for a page, also `tables_modify` for every table with
    records on it and the languages of the content on it. A delete that would
    take a workspace draft along is refused: core discards the versions and
    new workspace translations of what it deletes for good, and strands the
    other drafts on a deleted page. Publish or discard them in their workspace
    first. In a draft workspace the record and its translations are marked for
    deletion there and deleted live when the workspace is published; the drafts
    of other workspaces still stop the call, a record new or moved in the run's
    workspace is refused before the card ([ADR-266](https://docs.typo3.org/permalink/netresearch/nr-llm:adr-266@main)).

-   **`copy_record`**

    Copies one content element to a page and column, or one page under a
    parent, with core's copy command ([ADR-199](https://docs.typo3.org/permalink/netresearch/nr-llm:adr-199@main)). The copy and
    every translation copied with it are **always hidden**, whatever core's
    `hideAtCopy`, the user's preferences and page TSconfig say, and a page is
    **always copied without its subpages**: core would hide only the top page
    of a copied branch. What happens to the translations of a
    default-language record depends on the TYPO3 release and the target's
    **site**: TYPO3 14 and 13.4.25 or later copy none outside a site and,
    inside one, a translation only where the site has its language (for an
    element, where the target page is translated into it); one core refuses
    fails the copy, which is then taken back. 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 card states
    the rule of the running core. The answer says how many were copied. A
    page's content is copied with the page. A translation is refused by
    itself, as are a page translation as target, a site root, and a
    standalone element beside connected translations on the target page
    ([ADR-193](https://docs.typo3.org/permalink/netresearch/nr-llm:adr-193@main)).

-   **`move_page`**

    Moves one default-language page to a new parent or directly after a
    sibling. Its content, translations and subpages move with it, and it keeps
    its uid and its URL path — core does not regenerate the slug on a move.
    The approval card says so, counts the subpages that move along, and warns
    when the page moves into another site, into a site or out of every site.
    Asks the permissions core asks: delete rights on the page and new-page
    rights on the new parent for a new parent, edit rights within the same
    parent. A site root, a translation, a page translation as parent and a
    target inside the page's own branch are refused.

-   **`replace_file_reference`**

    Points one existing file reference on a content element's `image`,
    `assets` or `media` field at another **existing** file, or removes the
    reference; `attach_file_to_content_element` only appends. A replacement
    takes the old reference's position, and nothing of the old reference is
    carried over — its title, alternative text, description and crop described
    the old file; the card says which texts the new reference will show. The
    file itself is never changed, and the new file must lie in a permitted
    storage inside the acting user's file mounts and carry an extension the
    field accepts. Core deletes the translated references of the old one with
    it: the card names them, the call is refused where the acting user may
    not change the translated element they sit on, and afterwards each
    translated element's reference count is set and read back. Where the
    element is itself an inline child (an extension such as EXT:news holds
    content elements that way), every record that holds it, up the chain,
    must pass the table, page and record-level checks as well
    ([ADR-230](https://docs.typo3.org/permalink/netresearch/nr-llm:adr-230@main)); otherwise the call is refused in the neutral
    words. A grid container holding the element as a `tt_content` child is
    not asked, because the page module edits its children on their own.

-   **`set_file_reference_alternative_text`**

    Sets the alternative text of **one use** of an image: the `alternative`
    column of one existing `sys_file_reference`, identified by its uid, in
    place ([ADR-230](https://docs.typo3.org/permalink/netresearch/nr-llm:adr-230@main)). The reference may sit on a content
    element, on a page's own file field or on a record of any other table in a
    `type => file` column. It writes that one column and nothing else — not
    the file's own alternative text (`set_file_alternative_text` writes that,
    and every use without a text of its own shows it), not the record, and not
    the reference's translations. A translated reference is written in its own
    language.

    Rights are checked before the write: content-edit rights on the record's
    page, and for a page's own file field page-edit rights as well (the
    DataHandler asks for content-edit rights on a reference's page even when
    the reference belongs to the page); for a non-admin, a page without an
    edit lock; `tables_modify` for `sys_file_reference`; the record-level
    rights (`tables_modify` on the record's table, its language, the content
    type, the record's own edit lock); access to the reference's language; and
    the field-level grants for `sys_file_reference:alternative` and for the
    record's file field. Where the record is an inline child — a carousel item
    inside a content element — every record that holds it, up the chain, must
    pass the same table, page and record-level checks: an edit lock or a
    content type the user may not edit on the outer element stops the call. A
    container of the same table — a grid element holding content elements —
    is not asked, because the page module edits its children on their own. A
    reference that does not exist, is deleted, is a workspace version or sits
    outside a file field, an inline child whose owner is gone, and a record,
    owner or page the user may not edit, are refused in the same words; a
    page's file field without content-edit rights and a page edit lock are
    refused by name.

    Two things worth knowing before enabling it:

    -   **An empty text is refused**, a text of spaces too. Unlike
        `set_file_alternative_text`, an empty string does not mark the image
        as decorative here: whether an image is decorative is a separate
        decision, and an empty alternative text reads like a forgotten one.
    -   **In the run's workspace** ([ADR-262](https://docs.typo3.org/permalink/netresearch/nr-llm:adr-262@main)). An image use
        that exists only in another draft workspace is not there for this tool.

    The approval card names the record, its page, the language, the field and
    the file, and shows the reference's own text next to the proposed one;
    where the reference has no text of its own, the card says that the file's
    text applies today. To read a reference's current text, `read_records`
    on `sys_file_reference` returns its `alternative` column.
