Розробка системи управління меню сайту

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.
Розробка та обслуговування будь-яких видів сайтів:
Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Розробка системи управління меню сайту
Середня
~2-3 робочих дні
Часті питання
Наші компетенції:
Етапи розробки
Останні роботи
  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Розробка системи управління меню сайту

Система управління меню дозволяє адміністраторам сайту змінювати структуру навігації без участі розробників. Важлива для сайтів з динамічним контентом: нові розділи, сезонні зміни, A/B-тестування навігації.

Модель даних

menus (
  id, name, slug, locale
  -- 'main_menu', 'footer_menu', 'mobile_menu'
)

menu_items (
  id, menu_id, parent_id, order,
  type: link | page | category | custom,
  label, url,
  page_id,     -- якщо type=page
  category_id, -- якщо type=category
  target: _self | _blank,
  icon,
  is_visible, css_class,
  attributes (jsonb)  -- data-атрибути, id
)

Інтерфейс Drag-and-drop

Для управління вкладеною структурою — бібліотека @dnd-kit/sortable або react-sortable-tree:

import { DndContext, closestCenter } from '@dnd-kit/core';
import { SortableContext, arrayMove, verticalListSortingStrategy } from '@dnd-kit/sortable';

function MenuEditor({ items, onReorder }) {
    const [treeItems, setTreeItems] = useState(buildTree(items));

    const handleDragEnd = ({ active, over }) => {
        if (!over || active.id === over.id) return;
        const oldIndex = treeItems.findIndex(i => i.id === active.id);
        const newIndex = treeItems.findIndex(i => i.id === over.id);
        const reordered = arrayMove(treeItems, oldIndex, newIndex);
        setTreeItems(reordered);
        onReorder(reordered.map(({ id }, order) => ({ id, order })));
    };

    return (
        <DndContext collisionDetection={closestCenter} onDragEnd={handleDragEnd}>
            <SortableContext items={treeItems} strategy={verticalListSortingStrategy}>
                {treeItems.map(item => (
                    <SortableMenuItem key={item.id} item={item} />
                ))}
            </SortableContext>
        </DndContext>
    );
}

Серверна частина: отримання меню з кешуванням

class MenuService
{
    public function getMenu(string $slug, string $locale): array
    {
        return Cache::remember("menu:{$slug}:{$locale}", 3600, function () use ($slug, $locale) {
            $menu = Menu::where('slug', $slug)->where('locale', $locale)->first();
            if (!$menu) return [];

            return $this->buildTree(
                $menu->items()
                    ->where('is_visible', true)
                    ->orderBy('order')
                    ->get()
                    ->toArray()
            );
        });
    }

    private function buildTree(array $items, ?int $parentId = null): array
    {
        return collect($items)
            ->where('parent_id', $parentId)
            ->map(fn($item) => array_merge($item, [
                'children' => $this->buildTree($items, $item['id'])
            ]))
            ->values()
            ->toArray();
    }
}

Інвалідація кешу

При будь-якій зміні меню — скинути кеш:

Menu::observe(MenuObserver::class);

class MenuObserver
{
    public function saved(Menu $menu): void
    {
        Cache::forget("menu:{$menu->slug}:{$menu->locale}");
    }
}

Типи пунктів меню

Тип Описання
link Довільний URL, вводиться вручну
page Вибір зі списку сторінок CMS
category Вибір категорії каталогу
custom Якірна ссилка (#section) або JS-дія

Для типів page та category URL генерується автоматично при зміні slug сторінки/категорії.

Термін розробки: 2–3 дні для системи з drag-and-drop та кількома типами пунктів.