Более гибкое управление меню для iCMS 1.10.4

+37
72.25K
Иллюстрация

Иллюстрация
Здравствуйте!

Возникла у меня необходимость в работе над одним сайтом (1.10.4) и я столкнулся с рядом неудобств, не знаю почему никто с этим не сталкивался ранее 😊

Пост пишется не для того, чтобы взяли готовое и заменили, а для того, чтобы поняли как подходить к решению задачи.

Иногда возникает ситуация, когда необходимо сделать пункт меню недоступным для определенных групп пользователей. Эта задача решается средствами настроек доступа к пункту меню в админке, однако если мы захотим показывать "главную страницу" пункта меню, а вложенные не показывать — сделать этого не сможем. Это первое неудобство.

Попытаемся решить эту проблему.
Для начала добавим поле в таблицу cms_menu:
  1. ALTER TABLE `cms_menu` ADD `is_lax` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `parent_id`
Теперь добавим опцию в админке:
открываем файл /languages/ru/admin/applets/applet_menu.php
последней строкой добавляем lang переменную для названия опции
  1. $_LANG['AD_ONLY_CHILD_ITEM'] = 'Только для дочерних ссылок';
открываем файл /admin/applets/menu.php

Добавляем нужный нам чекбокс
перед строкой
  1. {/tabs}
добавляем
  1. <table width="100%" cellpadding="0" cellspacing="0" class="checklist" style="margin-top:5px">
  2. <tr>
  3. <td width="20">
  4. <input name="is_lax" type="checkbox" id="is_lax" value="1" <?php if(@$mod['is_lax']) {?>checked="checked"<?php } ?> />
  5. </td>
  6. <td><label for="is_lax"><strong><?php echo $_LANG['AD_ONLY_CHILD_ITEM']; ?></strong></label></td>
  7. </tr>
  8. </table>
Получаем и записываем в базу значение опции
после строки (встречается 2 раза)
  1. $is_public = cmsCore::request('is_public', 'int', '');
добавляем
  1. $is_lax = cmsCore::request('is_lax', 'int', 0);
после строки в запросе (встречается 2 раза)
  1. access_list='$access_list',
добавляем
  1. is_lax='$is_lax',
Добавляем логику в ядро
открываем файл /core/cms.php
в методе checkMenuAccess после строки
  1. $access_list = $this->menu_item['access_list'];
добавить
  1. if($this->isMenuIdStrict() && $this->menu_item['is_lax']){
  2. return true;
  3. }
И заключительный этап, это внесение изменений в тело модуля меню:
открываем файл /modules/mod_menu/module.php
Есть два блока перебора (foreach) всех меню, в них есть условия отбора, сейчас внимание:
меняем
  1. cmsCore::checkContentAccess($item['access_list'])
на
  1. ($item['is_lax'] || cmsCore::checkContentAccess($item['access_list']))
На этом данное неудобство мы исправили.

Второе из неудобств, с которым я столкнулся, это некорректная работа показа пунктов меню при выводе их в разных модулях и соответственно при разных назначенных меню для показа. Суть некорректной работы заключается в том, если, например, у меня есть пункт меню "Контакты" и я хочу его выводить в разных модулях меню, где в каждом модуле выводятся свои пункты согласно опции "меню для показа", то вывести его не удастся, только если создавать еще один такой же пункт меню. И если я все же так сделаю, то "подсвечиваться активным" будет только пункт меню, в последнем выводимом модуле. В общем, я решил, что пункт меню должен быть один, а вот меню для показа должно выбираться множественно. Как должно получиться в итоге смотрите на первом скрине.

Эту доработку я подробно описывать не буду, т.к. смысл правок я показал выше, однако вопрос миграции освещу.
  1. $result = $inDB->query("SELECT id, menu FROM cms_menu");
  2. $inDB->query("ALTER TABLE `cms_menu` CHANGE `menu` `menu` TINYTEXT NOT NULL");
  3. if ($inDB->num_rows($result)){
  4. while ($item = $inDB->fetch_assoc($result)){
  5. $item['menu'] = cmsCore::arrayToYaml(array($item['menu']));
  6. $inDB->query("UPDATE cms_menu SET menu = '{$item['menu']}' WHERE id = '{$item['id']}'");
  7. }
  8. }
Мы получаем все пункты меню, после их получения, меняем тип поля на TINYTEXT и перебираем, делая текущее значение поля массивом с одним элементом, переводим в yaml и обновляем эту запись в таблице.

Как все это проще всего поставить себе на сайт?

Все изменения визуально можно увидеть в этом коммите, туда правда попали и другие правки, смотрите изменения файлов:
/admin/applets/menu.php
/core/cms.php
/modules/mod_menu/module.php
/languages/ru/admin/applets/applet_menu.php

Готовый мигратор для этих правок доступен тут.

Ну а кому совсем лень, могут просто скачать готовый архив, распаковать с заменой в корень и запустить мигратор, перейдя по адресу /migrate.
Внимание! Архив предназначен для версии СТРОГО 1.10.4.
Внимание! Не забываем про бекапы.

Надеюсь кому-то кроме меня это понадобится)
0
scanread scanread 10 лет назад #
Сталкивался со вторым вопросом. В главном меню активный пункт подсвечивается. Если выводить этот же пункт меню в дополнительное, то оно подсвечивается только в нем, в главном уже нет. Думал, так задумано, хотя от части это не логично. Если я правильно понял - это как раз и пофиксили. Спасибо. Сегодня протестирую.
0
Max Max 10 лет назад #
Пол года назад при создании сайта на iCMS первым делом встретился с вопросом №2, но т. к. не был зареган на форуме, спросить как решается данная проблема не получилось. Пришлось убрать боковое меню... Думаю сейчас жизнь наладится, осталось обновиться до 1.10.4...
+1
Странник Странник 10 лет назад #
А почему бы сразу это в 1.10.4 не включить? scratch
+1
Fuze Fuze 10 лет назад #
А почему бы сразу это в 1.10.4 не включить?
Потому что я это сделал уже после релиза. Включим в 1.10.5.
0
Крот Крот 10 лет назад #
а можно сразу сделать (но уже для позиций модуля):
- при выборе позиций модуля предусмотреть "показывать на этих пунктах меню", "а на этих исключить показ" или/и
- при выборе позиций сделать анализатор router.php всех компонент - и предлагать выбор (показать-скрыть) или/и
- сделать выбор позиций по аналогии с 2.0

также, сделать кнопки (выделить все пункты меню, снять выделение, установить модуль в определенную позицию во всех пунктах меню - вот это вообще неудобно, если например нужно поставить только на 99% пунктах меню, восстановить предыдущее состояние позиций)

мелочь, а уже с 1.8 версии ничего в этом плане не меняется (я тут с 1.8)

у меня каждый раз
Возникла у меня необходимость в работе над одним сайтом (1.x.x) и я столкнулся с рядом неудобств
костыль, костыль и поскакали

извиняюсь за такой тон - наболело
0
Крот Крот 10 лет назад #
не могу не признать что система проходит модернизацию и усовершенствование - за это огромное спасибо Fuze

но реально неудобно!
+1
Fuze Fuze 10 лет назад #
- при выборе позиций модуля предусмотреть "показывать на этих пунктах меню", "а на этих исключить показ"
http://trac.instantcms.ru/changeset/1420
костыль, костыль и поскакали
давно бы предложили решение, если есть готовое.
наболело
а у меня наболело, что 95% просто потребители. есть же на этом сайте девелоперы, что мешает взять и поделиться решениями всяких неудобств, если они есть тем более.
по аналогии с 2.0
2.0 и есть развитие InstantCMS. Делать постепенно из 1.10.X вторую ветку как минимум глупо. Нравятся решения в 2.0 - так используйте ее, это самое разумное решение.
0
Крот Крот 10 лет назад #
вот за это большущее спасибо

давно бы предложили решение, если есть готовое.
я и так периодически предлагаю

2.0 и есть развитие InstantCMS. Делать постепенно из 1.10.X вторую ветку как минимум глупо. Нравятся решения в 2.0 - так используйте ее, это самое разумное решение.

мне почему-то показалось, что в 1.10.x потихоньку внедряются некоторые вещи из 2-ки, т.е. чтобы в дальнейшем удачно на ходу перепрыгнуть с 1-ки на 2-ку.
но 2-ка пока не нравится... первая ветка более гибкая по-моему

вообщем, попробую сам нарисовать, если будет удачно - выложу
0
scanread scanread 10 лет назад #
Раз уж поднялся вопрос в общем о меню, хотелось бы узнать, возможна ли будет его небольшая переработка в плане из простого меню которое есть сейчас в мегаменю - с отображением дополнительных меню в подпункты в 1 ряд и несколько колонок, или в несколько рядов и несколько колонок? Большинство же используют данную систему для городских порталов, и на них - такое меню является одним из ключевых моментов. Было бы хорошо в 10.5 его увидеть, если у Вас будет время на него и возможность.
0
Крот Крот 10 лет назад #
это Вам лучше на заказ попросить... тут спецов много)
0
scanread scanread 10 лет назад #
Я думаю это лучше чтобы было в коробке, чем отдельно в каком-то дополнении. На заказ написать - напишут. А обновлять, вдруг чего, кто потом будет? Не раз сталкивался с такими моментами, когда исполнитель сдал работу, еще месяц-два-три был в сети, и пропадал в никуда. Может что в реале случилось, может что изменилось и т.п. А обновить то надо. Другие разработчики чужой код не особо любят перебирать - это факт. Потому - коробочное решение было бы весьма кстати, притом что оно большинству просто необходимо. Правда, это лично мое имхо.
+1
Крот Крот 10 лет назад #
согласен что в коробке лучше
но
1) cms превратиться в тяжелого неповоротливого монстра с кучей фич
2) разработчик (Fuze) должен будет делать кучу бесплатной работы - а оно ему надо?

ИМХО в данном случае вам лучше всего убедить Fuze сделать вам это меню на заказ. Плюсы этого - гарантия качества, оплаченный труд разработчика, ну и разработчик не пропадет smile
0
scanread scanread 10 лет назад #
Чего то сразу куча фич? Каких? Меню используется практически на любом сайте. Без него никак. Одним хватает для небольших сайтов стандартного, которое есть, другим же - этого мало. Приходится создавать 3-4 уровня подменю, что создает неудобство для конечного пользователя.

В одной цмс видел очень хорошую настройку. От части, она вполне логическая. К примеру, редакторы. В настройках можно выбрать редактор для админки, и для комментариев. Можно разрешить в настройках пользователя выбор редактора или запретить (будет использоваться тот, который выбрал админ для всех пользователей).

Так же и здесь, можно дать возможность выбора в настройках: тип меню, простое или мега, в зависимости от требований сайта. Меню - это не видео компонент, не компонент кулинарной книги, не какой-то дополнительный модуль или плагин, это меню, которое используется практически на всех сайтах. Исходя из этого возникла такая вот просьба или идея, не знаю, как правильнее уже назвать.
1) cms превратиться в тяжелого неповоротливого монстра с кучей фич
Далеко не факт, что так будет или должно быть.
+1
Fuze Fuze 10 лет назад #
В одной цмс видел очень хорошую настройку. От части, она вполне логическая. К примеру, редакторы. В настройках можно выбрать редактор для админки, и для комментариев. Можно разрешить в настройках пользователя выбор редактора или запретить (будет использоваться тот, который выбрал админ для всех пользователей).
В других CMS много есть того, чего нет у нас. Однако стоит подчеркнуть, что у нас InstantCMS это open-source проект, где по идее должен быть вклад не только от нас, как от разработчиков. Но к сожалению, не все конечно, но в основном только потребители.
+1
Fuze Fuze 10 лет назад #
мегаменю - с отображением дополнительных меню в подпункты в 1 ряд и несколько колонок, или в несколько рядов и несколько колонок?
это можно вполне сделать и сейчас, если хорошенько подумать и проявить смекалку:
использовать "меню для отображения" у пункта меню;
использовать разные модули меню;
использовать разные шаблоны как для модуля меню, так и в настройках самого модуля меню.

Более того, если использовать опцию модуля меню "режим подменю", то можно так же неплохо все разнообразить. Так что все есть, просто видимо не очень хочется разбираться.
0
scanread scanread 10 лет назад #
Вы писали это дополнение, и Вам лучше видно, как и что можно реализовать. Мне, как тому, кто только вчера начал его осваивать - еще не все везде понятно. Спасибо за подсказку, постараюсь разобраться. Может действительно выйдет разнообразить до неузнаваемости)
Олег Васильевич я Олег Васильевич я 10 лет назад #
Комментарий удален
+6
Fuze Fuze 10 лет назад #
бесплатный компонент "Смекалка"
а так же:
"InstantТелепат"
"InstantСделайтеЧтобВсеРаботало"
"Автоматическая подстройка CSS по мановению руки"
"InstantБабло"

ну и т.д.
+1
Авто Москва Авто Москва 10 лет назад #
да-да, и их тоже laugh

Еще от автора

InstantCMS 2.17.0 релиз-кандидат
Тестируем релиз-кандидат InstantCMS 2.17.0. От того, как мы с вами выявим баги в новой версии, зависит стабильность релиза.
Как собрать обновление и релиз InstantCMS
Небольшой экскурс в сборку дистрибутива установки и обновления InstantCMS с GitHub.
InstantCMS 2.14.0 release candidate
Здравствуйте Тестируем релиз-кандидат InstantCMS 2.14.0. От того, как мы с вами выявим баги в новой версии, зависит стабильность релиза.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.