Files
VITEC-website/packages/evo_megamenu_json/Configuration/TCA/tx_evomegamenujson_entry.php
T
orascheandClaude Fable 5 8497dad06a Megamenu follow-ups: nav_hide honoured, entries insertable, page tiles
- getMenu() treats hidden/time/fe_group as enable fields but NOT
  nav_hide - the treeColumns doc comment claimed otherwise, and the
  news detail page ("article") stayed in the new spotlight rail after
  the editor hid it in menus. All three getMenu() calls (spotlight nav,
  pagetree columns and their items) now pass 'AND nav_hide = 0';
  verified live (6 rail items)
- all four tx_evomegamenujson_* tables get
  security.ignorePageTypeRestriction: they are inline children of the
  menu plugin and live on whatever page the plugin sits on - creating
  a new entry on the standard page failed with "table is not allowed"
- new vitec:attach-page-media --root=<slug> (dry-run by default):
  attaches the numbered placeholder pages/<pid>-08.png (slot 08 = page
  media / menu tile, the number doubles as the image wish list) as page
  media to every child page without one; existing media is never
  touched. Run for /support (8 pages) so the planned Support menu entry
  renders as two 4-tile rows via the pagetree layout's column images

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-10-27 12:08:26 +01:00

197 lines
7.9 KiB
PHP

<?php
declare(strict_types=1);
/**
* One item in the main navigation bar - the thing a visitor hovers.
*
* `link` is a real target: the bar item stays clickable and leads to the
* overview page, the panel only opens on hover. `layout` decides which of
* the two panel shapes renders - a column grid, or a small link column
* next to teaser cards.
*/
$ll = 'LLL:EXT:evo_megamenu_json/Resources/Private/Language/locallang_db.xlf:tx_evomegamenujson_entry.';
return [
'ctrl' => [
'title' => 'LLL:EXT:evo_megamenu_json/Resources/Private/Language/locallang_db.xlf:tx_evomegamenujson_entry',
'label' => 'title',
'label_alt' => 'layout',
'label_alt_force' => true,
'tstamp' => 'tstamp',
'crdate' => 'crdate',
'delete' => 'deleted',
'sortby' => 'sorting',
'hideTable' => true,
'security' => [
// inline children of the menu plugin - they live on whatever
// page the plugin sits on, not only on sysfolders
'ignorePageTypeRestriction' => true,
],
'versioningWS' => true,
'languageField' => 'sys_language_uid',
'transOrigPointerField' => 'l10n_parent',
'transOrigDiffSourceField' => 'l10n_diffsource',
'enablecolumns' => [
'disabled' => 'hidden',
],
'iconfile' => 'EXT:evo_megamenu_json/Resources/Public/Icons/entry.svg',
'searchFields' => 'title',
],
'types' => [
'1' => [
'showitem' => '
--div--;' . $ll . 'tab.general,
hidden, title, link, layout,
--div--;' . $ll . 'tab.columns,
menu_columns,
--div--;' . $ll . 'tab.teasers,
menu_teasers,
--div--;' . $ll . 'tab.featured,
featured_enable, featured_kicker, featured_title, featured_text, featured_link, featured_image,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language,
sys_language_uid, l10n_parent
',
],
],
'columns' => [
'sys_language_uid' => [
'exclude' => true,
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.language',
'config' => ['type' => 'language'],
],
'l10n_parent' => [
'displayCond' => 'FIELD:sys_language_uid:>:0',
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.l18n_parent',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'default' => 0,
'items' => [['label' => '', 'value' => 0]],
'foreign_table' => 'tx_evomegamenujson_entry',
'foreign_table_where' => 'AND {#tx_evomegamenujson_entry}.{#pid}=###CURRENT_PID### AND {#tx_evomegamenujson_entry}.{#sys_language_uid} IN (-1,0)',
],
],
'l10n_diffsource' => ['config' => ['type' => 'passthrough']],
'hidden' => [
'exclude' => true,
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.hidden',
'config' => ['type' => 'check', 'renderType' => 'checkboxToggle', 'default' => 0],
],
'parentid' => ['config' => ['type' => 'passthrough']],
'parenttable' => ['config' => ['type' => 'passthrough']],
'title' => [
'label' => $ll . 'title',
'description' => $ll . 'title.description',
'config' => ['type' => 'input', 'size' => 40, 'eval' => 'trim', 'required' => true],
],
'link' => [
'label' => $ll . 'link',
'description' => $ll . 'link.description',
'config' => [
'type' => 'link',
'allowedTypes' => ['page', 'url', 'record'],
'size' => 40,
],
],
'layout' => [
'label' => $ll . 'layout',
'description' => $ll . 'layout.description',
// the teaser cards field depends on the layout (displayCond) -
// reload so it appears right away, without saving first
'onChange' => 'reload',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'default' => 'columns',
'items' => [
['label' => $ll . 'layout.columns', 'value' => 'columns'],
['label' => $ll . 'layout.teasers', 'value' => 'teasers'],
['label' => $ll . 'layout.catalog', 'value' => 'catalog'],
['label' => $ll . 'layout.pagetree', 'value' => 'pagetree'],
['label' => $ll . 'layout.spotlight', 'value' => 'spotlight'],
],
],
],
'menu_columns' => [
'label' => $ll . 'menu_columns',
'description' => $ll . 'menu_columns.description',
'config' => [
'type' => 'inline',
'foreign_table' => 'tx_evomegamenujson_column',
'foreign_field' => 'parentid',
'foreign_sortby' => 'sorting',
'maxitems' => 12,
'appearance' => [
'collapseAll' => true,
'expandSingle' => true,
'useSortable' => true,
'showSynchronizationLink' => false,
'showAllLocalizationLink' => false,
'showPossibleLocalizationRecords' => false,
'newRecordLinkAddTitle' => true,
'levelLinksPosition' => 'top',
],
],
],
'menu_teasers' => [
// catalog: the cards are the featured tiles of the left column
'displayCond' => 'FIELD:layout:IN:teasers,catalog',
'label' => $ll . 'menu_teasers',
'description' => $ll . 'menu_teasers.description',
'config' => [
'type' => 'inline',
'foreign_table' => 'tx_evomegamenujson_teaser',
'foreign_field' => 'parentid',
'foreign_sortby' => 'sorting',
'maxitems' => 8,
'appearance' => [
'collapseAll' => true,
'expandSingle' => true,
'useSortable' => true,
'newRecordLinkAddTitle' => true,
'levelLinksPosition' => 'top',
],
],
],
'featured_enable' => [
'label' => $ll . 'featured_enable',
'description' => $ll . 'featured_enable.description',
'config' => ['type' => 'check', 'renderType' => 'checkboxToggle', 'default' => 0],
],
'featured_kicker' => [
'displayCond' => 'FIELD:featured_enable:=:1',
'label' => $ll . 'featured_kicker',
'config' => ['type' => 'input', 'size' => 30, 'eval' => 'trim', 'max' => 60],
],
'featured_title' => [
'displayCond' => 'FIELD:featured_enable:=:1',
'label' => $ll . 'featured_title',
'config' => ['type' => 'input', 'size' => 40, 'eval' => 'trim'],
],
'featured_text' => [
'displayCond' => 'FIELD:featured_enable:=:1',
'label' => $ll . 'featured_text',
'config' => ['type' => 'text', 'cols' => 40, 'rows' => 3],
],
'featured_link' => [
'displayCond' => 'FIELD:featured_enable:=:1',
'label' => $ll . 'featured_link',
'config' => ['type' => 'link', 'allowedTypes' => ['page', 'url', 'record', 'file'], 'size' => 40],
],
'featured_image' => [
'displayCond' => 'FIELD:featured_enable:=:1',
'label' => $ll . 'featured_image',
'config' => [
'type' => 'file',
'maxitems' => 1,
'allowed' => 'common-image-types',
],
],
],
];