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 Petrovo\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>
JavaScript inicializace:
import './menuSortable.js';
Backend endpoint pro přesuny
URL: /ADMIN/RUN/menuMoveNode
Datová struktura:
{
"fromId": 123,
"toId": 456,
"reorder": false
}
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 Petrovo\Menu\MenuNode;
// 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 = MenuNode::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 Petrovo\Menu\Menu;
$result = Menu::duplicate(5);
if ($result) {
echo "Nové menu: " . $result['name'];
echo "ID: " . $result['new_menu_id'];
}
Užitečné dotazy
Kontrola existence uzlu
$exists = DB::var("SELECT id FROM menu_node WHERE id = ?", [$nodeId]);
Počet položek v menu
$count = DB::var("SELECT COUNT(*)-1 FROM menu_node WHERE menu_id = ?", [$menuId]);
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.