Menu systém - Praktické použití¶
Stručný přehled nejčastějších způsobů použití Menu systému v praxi.
Frontend - zobrazení menu¶
Základní načtení menu pro zobrazení¶
use Core\Database\DB;
// Načte kompletní menu pro český jazyk (pouze viditelné položky)
$menuId = 1;
$baseNodeId = DB::var("SELECT base_node_id FROM menu WHERE id = ?", [$menuId]);
$menuItems = DB::results("CALL menu_get_tree(?, 'cs')", [$baseNodeId]);
foreach ($menuItems as $item) {
echo str_repeat(' ', $item->level) . $item->name . '<br>';
}
HTML výstup s odkazy¶
echo '<ul>';
foreach ($menuItems as $item) {
$data = json_decode($item->data ?? '{}', true);
$href = $data['href'] ?? '#';
echo '<li><a href="' . htmlspecialchars($href) . '">' . htmlspecialchars($item->name) . '</a></li>';
}
echo '</ul>';
Administrace - sortable drag & drop¶
JavaScript drag & drop přeřazování¶
Menu systém podporuje interaktivní přeřazování pomocí drag & drop v administraci.
HTML struktura:
<table class="menuSortable">
<tr draggable="true" data-id="123" data-parent="45" data-name="Položka menu">
<td>Název položky</td>
</tr>
</table>
Backend endpoint pro přesuny¶
URL: /ADMIN/RUN/menuMoveNode
Datová struktura:
PHP zpracování (moveNode.php):$data = json_decode(file_get_contents('php://input'), true);
$oldParentId = (int)$data['fromId'] ?? 0;
$newParentId = (int)$data['toId'] ?? 0;
$onlyReorder = (bool)$data['reorder'] ?? false;
if ($onlyReorder) {
// Pouze změna pořadí ve stejné úrovni
$newOrder = MenuNode::getCurrentOrder($newParentId);
MenuNode::changeOrder($oldParentId, $newOrder);
} else {
// Přesun mezi různými rodiči
$sql = "CALL menu_move_node(?, ?)";
DB::query($sql, [$oldParentId, $newParentId]);
MenuNode::reorderSiblings($oldParentId);
MenuNode::reorderSiblings($newParentId);
}
Základní CRUD operace¶
Vytvoření nového menu¶
use App\Modules\Menus\MenuNodeService;
// 1. Vytvoř menu záznam
$sql = "INSERT INTO menu (web_id, name) VALUES (?, ?)";
DB::query($sql, [1, 'Hlavní menu']);
$menuId = DB::$insertId;
// 2. Vytvoř base node
$baseNodeId = MenuNodeService::create($menuId, null);
// 3. Propoj menu s base node
$sql = "UPDATE menu SET base_node_id = ? WHERE id = ?";
DB::query($sql, [$baseNodeId, $menuId]);
Přidání položky do menu¶
$langData = [
'cs' => [
'name' => 'O nás',
'is_hide' => false,
'data' => [
'href' => '/o-nas',
'title' => 'Informace o společnosti'
]
]
];
$nodeId = MenuNode::create($menuId, $baseNodeId, $langData);
Duplikace celého menu¶
use App\Modules\Menus\MenuService;
$result = MenuService::duplicate(5);
if ($result) {
echo "Nové menu: " . $result['name'];
echo "ID: " . $result['new_menu_id'];
}
Užitečné dotazy¶
Kontrola existence uzlu¶
Počet položek v menu¶
Načtení breadcrumbs¶
$breadcrumbs = DB::results(
"SELECT l.name FROM menu_node_path p
JOIN menu_node_lang l ON p.ancestor_id = l.node_id
WHERE p.descendant_id = ? AND l.lang = 'cs'
ORDER BY p.path_length DESC",
[$nodeId]
);
Sortable logika¶
Dvě možnosti přesunutí:¶
- Reorder - změna pořadí ve stejné úrovni (sourozenci)
- Move - přesun pod jiného rodiče
Dialog v administraci:¶
- OK = Přesun pod nový uzel (změna parent_id)
- Cancel = Pouze změna pořadí (reorder)
Automatické přeřazení:¶
Po každém přesunu se automaticky volá MenuNode::reorderSiblings() pro vyčištění mezer v číslování pořadí.
Tato dokumentace pokrývá nejčastější scénáře použití Menu systému v běžné praxi.