.. include:: /Includes.rst.txt
.. _template-requirements:
=====================
Template requirements
=====================
The extension has exactly **one** requirement of your templates: every content
element must be identifiable in the rendered HTML.
.. _c-id:
The content element ID
======================
Each content element needs a "c-id" — its UID prefixed with ``c`` — on the
element that wraps it:
.. code-block:: html
:caption: Rendered HTML of a content element
...
This is how the injected JavaScript maps a DOM node to a database record. No
c-id means no edit button for that element.
.. tabs::
.. group-tab:: fluid_styled_content
Nothing to do. ``fluid_styled_content`` renders the c-id out of the box,
so the extension works immediately after :ref:`installation`.
.. group-tab:: Custom templates
Add the UID to the wrapping element yourself:
.. code-block:: html
:caption: EXT:my_sitepackage/Resources/Private/Templates/Content/Default.html
...
.. group-tab:: EXT:container
`container `__
templates do not render the c-id by default:
.. code-block:: html
:caption: Container template
{record.renderedContent}
.. group-tab:: EXT:dce
`DCE `__ elements need the
c-id added to the
`DCE template `__:
.. code-block:: html
:caption: DCE template
Your template goes here...
.. note::
Styling problems may occur with nested content elements, because the
injected UI is positioned relative to the wrapping element.
.. _data-frontend-edit-attribute:
Alternative: the ``data-frontend-edit`` attribute
==================================================
For templates that cannot carry the c-id anchor - dynamic content element
extensions (DCE), other custom Fluid templates - a second matching channel
exists: a ``data-frontend-edit="tt_content:{uid}"`` attribute on the content
element's own wrapping HTML element.
.. code-block:: html
:caption: Example HTML output using the data attribute instead
...
The bundled ``xfe:editable`` ViewHelper renders this attribute for you:
.. code-block:: html
:caption: Custom Fluid Template
{namespace xfe=Xima\XimaTypo3FrontendEdit\ViewHelpers}
...
The ViewHelper renders only the attribute, so it goes inside the opening tag
in inline notation. The tag notation ``>``
renders the same output, but it is not valid HTML and breaks IDEs, formatters
and linters.
Both patterns can be mixed freely on the same page; an element only needs one
of them. Unlike the c-id anchor pattern, a ``data-frontend-edit`` element is
always treated as the content element itself - no sibling resolution is
attempted.
.. _render-markers:
Alternative: render markers (experimental)
==========================================
Templates you cannot or do not want to change, e.g. Content Blocks without the
``fluid_styled_content`` layout, can be detected through the site setting
:confval:`frontendEdit.markerBasedDetection`.
While it is active, every rendered content element is wrapped in a pair of HTML
comments:
.. code-block:: html
:caption: Rendered HTML with render markers
...
The markers are an addition to the other two patterns. An element that
already has a c-id or a ``data-frontend-edit`` attribute keeps using it.
The output of the content element needs exactly **one** root element. With
several root elements, or with loose text next to the root element, the
markers cannot point at a single element and are ignored. The element's own
empty anchor is not counted, so the anchor pattern
``...
`` works.
Two features still rely on the c-id and do not work for elements that are only
detected through markers or the ``data-frontend-edit`` attribute:
* Jumping back to the element after saving
(:confval:`frontendEdit.enableScrollToElement`), which uses the fragment
``#c{uid}`` of the return URL.
* :ref:`drag-and-drop`, which collects the movable elements of a column by
their c-id.
:ref:`setup-render-markers` lists the operational limits, such as caching,
minifiers and non-HTML output.
.. _editing-foreign-records:
Editing foreign records (news, addresses, ...)
================================================
The ``data-frontend-edit`` attribute also works for records from **any other
table** - not just ``tt_content`` - by adding a ``table`` prefix:
``data-frontend-edit="{table}:{uid}"``. This covers the classic case of
editing foreign records displayed on a detail page, e.g. a news detail page
rendered by EXT:news:
.. code-block:: html
:caption: News detail template (Detail.html)
{namespace xfe=Xima\XimaTypo3FrontendEdit\ViewHelpers}
{newsItem.title}
...
``record`` takes a record array such as ``{data}`` or an object with a
``getUid()`` method, such as an Extbase model or a core Record object.
Alternatively, pass the ``uid`` directly.
This is deliberately thin: the menu offers exactly **edit, info and
history** - no hide, delete or move, since those are meaningful only for
tables this extension understands specifically (``tt_content``, ``pages``).
Permissions are checked the same way as everywhere else in the extension (the
backend user's actual edit rights on that record); a table the current user
cannot edit - or that TYPO3 does not know at all - never gets a menu.
Translated records resolve to the current frontend language automatically,
the same way ``tt_content`` does.
Extend the menu the same way as for content elements, via the
:ref:`FrontendEditDropdownModifyEvent ` - the record row carries a
``_table`` key so a listener can tell it apart from a ``tt_content`` row.
.. _template-requirements-optional:
Optional markers
================
Two features need additional markers in your templates. Both are opt-in — omit
them and the corresponding feature simply does not appear.
.. list-table::
:header-rows: 1
:widths: 30 70
* - Marker
- Needed for
* - :ref:`ColumnTargetViewHelper `
- "Create new content" buttons per column, and
:ref:`drag-and-drop` (drop targets cannot be resolved without it)
* - :ref:`Data ViewHelper `
- Edit links for related records inside a plugin, e.g. single news
items in a list
.. _template-requirements-scope:
What cannot be edited
=====================
Only content elements belonging to the **current page** receive a menu.
Inherited content — a shared footer pulled in from another page, for example —
cannot be edited from the inheriting page. Use the
:ref:`toolbar ` to jump to the page that owns the record.
.. seealso::
* :ref:`how-it-works` — what happens on page load
* :ref:`faq` — troubleshooting when no menu appears