Подмена ссылок на пункты меню

Внимание! Работает режим премодерации. Все сообщения публикуются после проверки!
Страницы: 1
Ответить
RSS
Подмена ссылок на пункты меню
Столкнулся с задачей. В меню есть пункты, оба выпадающие. В одном из пунктов подключается .left.menu_ext.php (из разделов инфоблока) в другом просто .left.menu.php (на пару элементов). Сложность в том, что в обоих случаях ссылки на подменю имеют вид /services/service_name/, т.е. положить в одну папку services оба меню мы не можем, т.к. они будут выводится вместе. Притом один из пунктов верхнего уровня надо сделать неактивным (тот для которого подключается .left.menu_ext.php)

Можно, конечно, не использовать $aMenuLinks = array_merge($aMenuLinks ?? [], $aMenuLinksExt);, но как добиться раздельного вывода.

Применим небольшой костыль через JS. У нас будет два пункта меню верхнего уровня.
Код
Array(
    "Приём лома",
    "/services/",
    Array(),
    Array(),
    ""
),
Array(
    "Услуги",
    "/priem/",
    Array(),
    Array(),
    ""
),

У первого пункта будет выводиться содержимое из разделов (.left.menu_ext.php) м сам пункт будет неактивным, у другого элементы (.left.menu.php).

.left.menu_ext.php кладем в папку services, а .left.menu.php кладем в папку priem.

Далее в шаблон компонента меню добавим JS код

Код
<script>
    document.addEventListener('DOMContentLoaded', function () {
        const nav = document.getElementById('hmenu');
        if (!nav) return;

        // 1. Найдём пункт "Приём лома" — он ведёт на /services/
        const priemLomaLink = nav.querySelector('a[href="/services/"]');
        if (priemLomaLink && priemLomaLink.textContent.trim() === 'Приём лома') {
            // Заменяем <a> на <span> с теми же классами и текстом
            const span = document.createElement('span');
            span.className = priemLomaLink.className;
            span.textContent = priemLomaLink.textContent;
            // Добавляем стиль при наведении через CSS-класс или инлайн (лучше через класс)
            span.classList.add('nav-link-non-clickable');
            priemLomaLink.parentNode.replaceChild(span, priemLomaLink);
        }

        // 2. Найдём пункт "Услуги" — он ведёт на /priem/
        const uslugiLink = nav.querySelector('a[href="/priem/"]');
        if (uslugiLink && uslugiLink.textContent.trim() === 'Услуги') {
            uslugiLink.href = '/services/';
        }
    });
</script>

Этот JavaScript-код выполняется после полной загрузки страницы и делает следующее:

1. Находит пункт меню «Приём лома», который ведёт на `/services/`, и заменяет его ссылку (`<a>`) на нерабочий элемент (`<span>`) — то есть делает его неактивным (некликабельным), сохраняя внешний вид.

2. Находит пункт меню «Услуги», который изначально ведёт на `/priem/`, и меняет его ссылку на `/services/` — то есть перенаправляет этот пункт на ту же страницу, что и «Приём лома».

Цель кода:  
Поменять местами или скорректировать поведение двух пунктов меню — сделать «Приём лома» статичной надписью, а «Услуги» — активной ссылкой на `/services/`.
Изменено: Валерий Макеев - 22.10.2025 14:02:36
Страницы: 1
Ответить
Форма ответов
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить картинки
 

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Перенос сайтов на «1С-Битрикс»

сайты на платформе «1С-Битрикс» — это удобство, надежность и высокая посещаемость

от 12 000 рублей
Перенос сайтов с любых CMS и статичных страниц на платформу «1С-Битрикс», с учетом дизайна, верстки и урл-адресов. С сохранением всей информации и структуры сайта.

* зависит от объема выполняемых работ.

Техническая поддержка

сайтов на CMS 1C-Битрикс

от 20 000 рублей/месяц
Оптимизация производительности действующих интернет-проектов, наполнение и сопровождение, полная техническая поддержка и продвижение в поисковых сетях.

* стоимость зависит от объема и сложности выполняемых работ

Аутсорсинг

готов помочь, если нет времени

договорная

Могу взять на себя работы по full-stack

* на основе готовой верстки