Skip to content

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('&nbsp;&nbsp;', $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í:

  1. Reorder - změna pořadí ve stejné úrovni (sourozenci)
  2. 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.