Items belong to a menu and are managed from the menu detail page (e.g. /admin/menus/{id}). The detail page displays items in tree order — root items first, then their children in position order — giving you a visual representation of the rendered menu hierarchy.
Item types
Every item has a type that controls how it is rendered in the frontend menu:
| Type | Description |
|---|
| Link | A clickable item. Set a route name (with optional route parameters) or a direct URL. |
| Section | A label-only item, not a link. Used as a group header. Can still have children with a collapse toggle when nested_collapsible is enabled on the menu. |
Creating an item
Open the new item form
Click Add item on the menu detail page. The form opens in a modal.
Fill in the definition fields
The creation form shows the definition panel (pencil):| Field | Description |
|---|
| Type | Link or Section. |
| Label | Default label for the item. |
| Per-locale labels | Translation fields for each locale configured in locales. |
| Icon | Optional icon identifier, e.g. bootstrap-icons:gear. |
| Position | Integer sort order among siblings. Lower values appear first. |
| Parent | The parent item, or ”— Root —” for a top-level item. |
Save
Click Save. New items are appended at the end of their sibling group if no explicit position is given.
After saving, you can edit the item’s configuration (gear panel) to set the permission key, link settings, and parent.
Adding a child item
You can add a child directly from any existing item row using the Add child button. The child form is a simplified modal that:
- Fixes the item type to Link.
- Shows only the label and per-locale translation fields (no icon or position fields).
- Pre-sets the parent to the item you clicked.
This is the fastest way to build a hierarchy without navigating away from the detail page.
Editing an item
Two edit buttons are available on each item row:
Definition (pencil)
Edits the identity fields:
- Label and per-locale translations
- Icon
- Type (Link or Section)
Configuration (gear)
Edits the structural and link fields:
| Field | Description |
|---|
| Parent | Move the item to a different parent or to root. |
| Position | Integer ordering among siblings. Items are sorted ascending. |
| Permission key | Optional string checked by the permission checker to decide visibility. |
| Link type | Route name + params, or direct URL (Link items only). |
| Route name | Symfony route name for internal links. |
| Route params | JSON object of route parameters, e.g. {"id": 42}. |
| URL | Direct URL for external links. |
| Open in new tab | Whether the link opens with target="_blank". |
When you change the parent in the configuration panel and save, the item is appended at the end of its new sibling group automatically.
Hierarchy and depth
Any item can be a parent — there is no hard limit on nesting depth in the database. The depth limit set on the menu controls how many levels are rendered in the frontend, not how many can be stored.
The dashboard table shows items in depth-first tree order: a parent is followed immediately by all its children (and their children), before the next sibling appears.
Reordering items
Use the Move up and Move down arrow buttons on each item row to swap its position with the adjacent sibling. Position values are swapped in the database.
You can also set position values directly via the configuration (gear) panel.
Deleting an item
Click Delete on an item row. A confirmation modal is shown. Deleting an item removes it and all its descendants from the database (cascade delete).
Deletion is permanent. Descendants are removed together with the parent — there is no automatic re-parenting.