Здравствуйте!
Возникла у меня необходимость в работе над одним сайтом (1.10.4) и я столкнулся с рядом неудобств, не знаю почему никто с этим не сталкивался ранее 😊
Пост пишется не для того, чтобы взяли готовое и заменили, а для того, чтобы поняли как подходить к решению задачи.
Иногда возникает ситуация, когда необходимо сделать пункт меню недоступным для определенных групп пользователей. Эта задача решается средствами настроек доступа к пункту меню в админке, однако если мы захотим показывать "главную страницу" пункта меню, а вложенные не показывать — сделать этого не сможем. Это первое неудобство.
Попытаемся решить эту проблему.
Для начала добавим поле в таблицу cms_menu:
ALTER TABLE `cms_menu` ADD `is_lax` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `parent_id`
открываем файл /languages/ru/admin/applets/applet_menu.php
последней строкой добавляем lang переменную для названия опции
$_LANG['AD_ONLY_CHILD_ITEM'] = 'Только для дочерних ссылок';
Добавляем нужный нам чекбокс
перед строкой
{/tabs}
<table width="100%" cellpadding="0" cellspacing="0" class="checklist" style="margin-top:5px"> <tr> <td width="20"> <input name="is_lax" type="checkbox" id="is_lax" value="1" <?php if(@$mod['is_lax']) {?>checked="checked"<?php } ?> /> </td> <td><label for="is_lax"><strong><?php echo $_LANG['AD_ONLY_CHILD_ITEM']; ?></strong></label></td> </tr> </table>
после строки (встречается 2 раза)
$is_public = cmsCore::request('is_public', 'int', '');
$is_lax = cmsCore::request('is_lax', 'int', 0);
access_list='$access_list',
is_lax='$is_lax',
открываем файл /core/cms.php
в методе checkMenuAccess после строки
$access_list = $this->menu_item['access_list'];
if($this->isMenuIdStrict() && $this->menu_item['is_lax']){ return true; }
открываем файл /modules/mod_menu/module.php
Есть два блока перебора (foreach) всех меню, в них есть условия отбора, сейчас внимание:
меняем
cmsCore::checkContentAccess($item['access_list'])
($item['is_lax'] || cmsCore::checkContentAccess($item['access_list']))
Второе из неудобств, с которым я столкнулся, это некорректная работа показа пунктов меню при выводе их в разных модулях и соответственно при разных назначенных меню для показа. Суть некорректной работы заключается в том, если, например, у меня есть пункт меню "Контакты" и я хочу его выводить в разных модулях меню, где в каждом модуле выводятся свои пункты согласно опции "меню для показа", то вывести его не удастся, только если создавать еще один такой же пункт меню. И если я все же так сделаю, то "подсвечиваться активным" будет только пункт меню, в последнем выводимом модуле. В общем, я решил, что пункт меню должен быть один, а вот меню для показа должно выбираться множественно. Как должно получиться в итоге смотрите на первом скрине.
Эту доработку я подробно описывать не буду, т.к. смысл правок я показал выше, однако вопрос миграции освещу.
$result = $inDB->query("SELECT id, menu FROM cms_menu"); $inDB->query("ALTER TABLE `cms_menu` CHANGE `menu` `menu` TINYTEXT NOT NULL"); if ($inDB->num_rows($result)){ while ($item = $inDB->fetch_assoc($result)){ $inDB->query("UPDATE cms_menu SET menu = '{$item['menu']}' WHERE id = '{$item['id']}'"); } }
Как все это проще всего поставить себе на сайт?
Все изменения визуально можно увидеть в этом коммите, туда правда попали и другие правки, смотрите изменения файлов:/admin/applets/menu.php
/core/cms.php
/modules/mod_menu/module.php
/languages/ru/admin/applets/applet_menu.php
Готовый мигратор для этих правок доступен тут.
Ну а кому совсем лень, могут просто скачать готовый архив, распаковать с заменой в корень и запустить мигратор, перейдя по адресу /migrate.
Внимание! Архив предназначен для версии СТРОГО 1.10.4.
Внимание! Не забываем про бекапы.
Надеюсь кому-то кроме меня это понадобится)
Реклама #
scanread 10 лет назад #
Max 10 лет назад #
Странник 10 лет назад #
Fuze 10 лет назад #
Крот 10 лет назад #
- при выборе позиций модуля предусмотреть "показывать на этих пунктах меню", "а на этих исключить показ" или/и
- при выборе позиций сделать анализатор router.php всех компонент - и предлагать выбор (показать-скрыть) или/и
- сделать выбор позиций по аналогии с 2.0
также, сделать кнопки (выделить все пункты меню, снять выделение, установить модуль в определенную позицию во всех пунктах меню - вот это вообще неудобно, если например нужно поставить только на 99% пунктах меню, восстановить предыдущее состояние позиций)
мелочь, а уже с 1.8 версии ничего в этом плане не меняется (я тут с 1.8)
у меня каждый раз
извиняюсь за такой тон - наболело
Крот 10 лет назад #
но реально неудобно!
Fuze 10 лет назад #
Крот 10 лет назад #
мне почему-то показалось, что в 1.10.x потихоньку внедряются некоторые вещи из 2-ки, т.е. чтобы в дальнейшем удачно на ходу перепрыгнуть с 1-ки на 2-ку.
но 2-ка пока не нравится... первая ветка более гибкая по-моему
вообщем, попробую сам нарисовать, если будет удачно - выложу
scanread 10 лет назад #
Крот 10 лет назад #
scanread 10 лет назад #
Крот 10 лет назад #
но
1) cms превратиться в тяжелого неповоротливого монстра с кучей фич
2) разработчик (Fuze) должен будет делать кучу бесплатной работы - а оно ему надо?
ИМХО в данном случае вам лучше всего убедить Fuze сделать вам это меню на заказ. Плюсы этого - гарантия качества, оплаченный труд разработчика, ну и разработчик не пропадет
scanread 10 лет назад #
В одной цмс видел очень хорошую настройку. От части, она вполне логическая. К примеру, редакторы. В настройках можно выбрать редактор для админки, и для комментариев. Можно разрешить в настройках пользователя выбор редактора или запретить (будет использоваться тот, который выбрал админ для всех пользователей).
Так же и здесь, можно дать возможность выбора в настройках: тип меню, простое или мега, в зависимости от требований сайта. Меню - это не видео компонент, не компонент кулинарной книги, не какой-то дополнительный модуль или плагин, это меню, которое используется практически на всех сайтах. Исходя из этого возникла такая вот просьба или идея, не знаю, как правильнее уже назвать.
Fuze 10 лет назад #
Fuze 10 лет назад #
использовать "меню для отображения" у пункта меню;
использовать разные модули меню;
использовать разные шаблоны как для модуля меню, так и в настройках самого модуля меню.
Более того, если использовать опцию модуля меню "режим подменю", то можно так же неплохо все разнообразить. Так что все есть, просто видимо не очень хочется разбираться.
scanread 10 лет назад #
Олег Васильевич я 10 лет назад #
Fuze 10 лет назад #
"InstantТелепат"
"InstantСделайтеЧтобВсеРаботало"
"Автоматическая подстройка CSS по мановению руки"
"InstantБабло"
ну и т.д.
Авто Москва 10 лет назад #