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

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


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

Здравствуйте!

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

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

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

Попытаемся решить эту проблему.
Для начала добавим поле в таблицу cms_menu:
Код SQL:
  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 переменную для названия опции
Код PHP:
  1. $_LANG['AD_ONLY_CHILD_ITEM'] = 'Только для дочерних ссылок';
открываем файл /admin/applets/menu.php

Добавляем нужный нам чекбокс
перед строкой
Код HTML:
  1. {/tabs}
добавляем
Код HTML:
  1. <table width="100%" cellpadding="0" cellspacing="0" border="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>
Получаем и записываем в базу значение опции
после строки (встречается 2 раза)
Код PHP:
  1. $is_public = cmsCore::request('is_public', 'int', '');
добавляем
Код PHP:
  1. $is_lax = cmsCore::request('is_lax', 'int', 0);
после строки в запросе (встречается 2 раза)
Код PHP:
  1. access_list='$access_list',
добавляем
Код PHP:
  1. is_lax='$is_lax',
Добавляем логику в ядро
открываем файл /core/cms.php
в методе checkMenuAccess после строки
Код PHP:
  1. $access_list = $this->menu_item['access_list'];
добавить
Код PHP:
  1. if($this->isMenuIdStrict() && $this->menu_item['is_lax']){
  2. return true;
  3. }
И заключительный этап, это внесение изменений в тело модуля меню:
открываем файл /modules/mod_menu/module.php
Есть два блока перебора (foreach) всех меню, в них есть условия отбора, сейчас внимание:
меняем
Код PHP:
  1. cmsCore::checkContentAccess($item['access_list'])
на
Код PHP:
  1. ($item['is_lax'] || cmsCore::checkContentAccess($item['access_list']))
На этом данное неудобство мы исправили.

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

Эту доработку я подробно описывать не буду, т.к. смысл правок я показал выше, однако вопрос миграции освещу.
Код PHP:
  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.
Внимание! Не забываем про бекапы.

Надеюсь кому-то кроме меня это понадобится)
Обновление плагина "Авторизация Loginza" | Плагин логирование авторизаций
Комментарии (19)
scanread 21 июня 2014 в 19:45 0
small user social cms
Сталкивался со вторым вопросом. В главном меню активный пункт подсвечивается. Если выводить этот же пункт меню в дополнительное, то оно подсвечивается только в нем, в главном уже нет. Думал, так задумано, хотя от части это не логично. Если я правильно понял - это как раз и пофиксили. Спасибо. Сегодня протестирую.
Max 21 июня 2014 в 21:27 0
small user social cms
Пол года назад при создании сайта на iCMS первым делом встретился с вопросом №2, но т. к. не был зареган на форуме, спросить как решается данная проблема не получилось. Пришлось убрать боковое меню... Думаю сейчас жизнь наладится, осталось обновиться до 1.10.4...
Кирилл Эдуардович (Странник) 22 июня 2014 в 10:30 +1
small user social cms
А почему бы сразу это в 1.10.4 не включить? scratch
Fuze 22 июня 2014 в 12:11 +1
small user social cms
А почему бы сразу это в 1.10.4 не включить?
Потому что я это сделал уже после релиза. Включим в 1.10.5.
Крот 23 июня 2014 в 18:29 0
small user social cms
а можно сразу сделать (но уже для позиций модуля):
- при выборе позиций модуля предусмотреть "показывать на этих пунктах меню", "а на этих исключить показ" или/и
- при выборе позиций сделать анализатор router.php всех компонент - и предлагать выбор (показать-скрыть) или/и
- сделать выбор позиций по аналогии с 2.0

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

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

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

извиняюсь за такой тон - наболело
Крот 23 июня 2014 в 18:31 0
small user social cms
не могу не признать что система проходит модернизацию и усовершенствование - за это огромное спасибо Fuze

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

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

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

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

вообщем, попробую сам нарисовать, если будет удачно - выложу
scanread 23 июня 2014 в 18:45 0
small user social cms
Раз уж поднялся вопрос в общем о меню, хотелось бы узнать, возможна ли будет его небольшая переработка в плане из простого меню которое есть сейчас в мегаменю - с отображением дополнительных меню в подпункты в 1 ряд и несколько колонок, или в несколько рядов и несколько колонок? Большинство же используют данную систему для городских порталов, и на них - такое меню является одним из ключевых моментов. Было бы хорошо в 10.5 его увидеть, если у Вас будет время на него и возможность.
Крот 23 июня 2014 в 18:49 0
small user social cms
это Вам лучше на заказ попросить... тут спецов много)
scanread 23 июня 2014 в 19:22 0
small user social cms
Я думаю это лучше чтобы было в коробке, чем отдельно в каком-то дополнении. На заказ написать - напишут. А обновлять, вдруг чего, кто потом будет? Не раз сталкивался с такими моментами, когда исполнитель сдал работу, еще месяц-два-три был в сети, и пропадал в никуда. Может что в реале случилось, может что изменилось и т.п. А обновить то надо. Другие разработчики чужой код не особо любят перебирать - это факт. Потому - коробочное решение было бы весьма кстати, притом что оно большинству просто необходимо. Правда, это лично мое имхо.
Крот 23 июня 2014 в 20:41 +1
small user social cms
согласен что в коробке лучше
но
1) cms превратиться в тяжелого неповоротливого монстра с кучей фич
2) разработчик (Fuze) должен будет делать кучу бесплатной работы - а оно ему надо?

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

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

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

Более того, если использовать опцию модуля меню "режим подменю", то можно так же неплохо все разнообразить. Так что все есть, просто видимо не очень хочется разбираться.
scanread 23 июня 2014 в 21:44 0
small user social cms
Вы писали это дополнение, и Вам лучше видно, как и что можно реализовать. Мне, как тому, кто только вчера начал его осваивать - еще не все везде понятно. Спасибо за подсказку, постараюсь разобраться. Может действительно выйдет разнообразить до неузнаваемости)
Олег Васильевич я 23 июня 2014 в 22:06 +2
small user social cms
это можно вполне сделать и сейчас, если хорошенько подумать и проявить смекалку:
Спойлер
Fuze 23 июня 2014 в 22:33 +6
small user social cms
бесплатный компонент "Смекалка"
а так же:
"InstantТелепат"
"InstantСделайтеЧтобВсеРаботало"
"Автоматическая подстройка CSS по мановению руки"
"InstantБабло"

ну и т.д.
Авто Москва 23 июня 2014 в 22:51 +1
small user social cms
да-да, и их тоже laugh