Баг показа модуля для в позиции при открытии пункта меню с типом [прямая ссылка]

+13
1.67K
Не знаю у меня только эта проблема или у всех.
Описание бага:
есть в главном меню пункт Объявления
у него есть подменю — Работа и вакансии, у этого пункта меню стоит linktype = ссылка, например /board/10 (на подпункт работа в объявлениях).
И если теперь хочется, чтобы какой-то модуль, например "пользовательский" (содержит только какой-то текст), ну в принципе неважно какой модуль, хоть погода, появлялся только при показе только этого подпункта меню "Работа и вакансии" — модуль не появляется!
в принципе проблему решил, хочется чтоб в дистрибутиве(или в обновлении) было исправлено

P.S. кстати еще сделал возможность для модуля показаться только на вложенных страницах от текущей
(например поиск пользователей в списке пользователей не нужен, а внутри в профиле пользователя — нужен)


1. лечим баг прямых ссылок
в файле cms.php
функция menuId()

делаем вот так
  1.  
  2. //полное совпадение ссылки и адреса?
  3. // СТРОЧКИ НИЖЕ ДОБАВЛЯЕМ
  4. $furi="http://".$_SERVER['HTTP_HOST'].$uri;
  5. if (($uri == $item['link'])||($furi == $item['link'])){
  6. // ЭТУ ВЫКЛЮЧАЕМ if (($uri == $item['link'])){
  7. $menuid = $item['id'];
  8. $is_strict = true; //полное совпадение
  9. break;
  10. }
  11.  
2. добавляем возможность модулю показываться только на вложенных страницах


добавляем поле show_only_on_nested со значением по умолчанию 0 в таблицу cms_modules,

  1. ALTER TABLE 'cms_modules' ADD 'show_only_on_nested' TINYINT( 4 ) DEFAULT '0' NOT NULL AFTER 'is_strict_bind'
настройка этого пункта только руками — тем модулям, которые нужно показывать только на вложенных страницах ставим в это поле значение 1. Кому надо могут сами изменить админку для настройки модулей

в файле
page.class.php
функция printModules

  1.  
  2. // Проверяем права доступа
  3. if (!$inCore->checkContentAccess($mod['access_list'])) { continue; }
  4. // ДОБАВЛЯЕМ 1 СТРОЧКУ НИЖЕ //////////
  5. if (($mod['show_only_on_nested']==1)&&($inCore->isMenuIdStrict()==1)) { continue; }
  6. //////////////////////////////////////
  7. $modulefile = PATH.'/modules/'.$mod['content'].'/module.php';
  8.  
  9. if (!$mod['user']) { cmsCore::loadLanguage('modules/'.$mod['content']); }
  10.  
чтобы не появлялась позиция модуля
проводим изменения функцию в том же файле
  1. public function countModules($position){
  2.  
  3. $inCore = cmsCore::getInstance();
  4. $inDB = cmsDatabase::getInstance();
  5.  
  6. if (!$inCore->isMenuIdStrict()){ $strict_sql = "AND (m.is_strict_bind = 0)"; } else { $strict_sql = ""; }
  7.  
  8. $menuid = $inCore->menuId();
  9. /// добавили столбец m.show_only_on_nested
  10. $sql = "SELECT m.access_list,m.show_only_on_nested
  11. FROM cms_modules m, cms_modules_bind mb
  12. WHERE mb.position = '$position' AND
  13. m.published = 1 AND
  14. m.id = mb.module_id AND
  15. (mb.menu_id = '$menuid' OR mb.menu_id = 0)
  16. $strict_sql
  17. ";
  18. $result = $inDB->query($sql);
  19.  
  20. if (!$inDB->num_rows($result)){ return 0; }
  21.  
  22. $mods = array();
  23.  
  24. while($mod = $inDB->fetch_assoc($result)){
  25.  
  26.  
  27. if (!$inCore->checkContentAccess($mod['access_list'])) { continue; }
  28. ////////////////// новая строка
  29. if (($mod['show_only_on_nested']==1)&&($inCore->isMenuIdStrict()==1)) { continue; }
  30. ////////////////
  31. $mods[] = $mod;
  32.  
  33. }
  34.  
  35. return sizeof($mods);
  36. }
  37.  


Если моя информация была для вас полезной, можно отблагодарить меня :
Yandex счет 41001684845537
Webmoney R750806594532
+1
artlab artlab 12 лет назад #
P.S. кстати еще сделал возможность для модуля показаться только на вложенных страницах от текущей (например поиск пользователей в списке пользователей не нужен, а внутри в профиле пользователя - нужен)
Считаю это очень полезной доработкой.
0
Крот Крот 12 лет назад #
Если моя информация была для вас полезной, можно отблагодарить меня :
Yandex счет 41001684845537
Webmoney R750806594532
joke
0
artlab artlab 12 лет назад #
Однозначно.Срок Visa вышел.На днях ожидайте))
0
prosis prosis 12 лет назад #
а не проще добавить значение? - например '2' для 'is_strict_bind'
0
RooKee RooKee 12 лет назад #
Сделал второй вариант в админке. всё работает. но вот одна проблема. Выводит сайдбар(ну или ту позицию, где модуль показывается на внутр.) на главной странице.
0
RooKee RooKee 12 лет назад #
http://koshkaikot.ru/blogs вот тут в сайдбаре выводится модуль "Популярное" с показом только на внутренних страницах.
+1
Крот Крот 12 лет назад #
RooKee, добавил решение в конец поста, попробуйте
+1
RooKee RooKee 12 лет назад #
Спасибо огромное ) Монетку ловите!
+1
Крот Крот 12 лет назад #
пожалуйста!
спасибо за мотивацию) продолжу искать улучшения и баги
0
Юрий Юрий 6 лет назад #
Подскажите как эту штуку прикрутить к 1.10.7? Чтобы выводить модуль только на вложенных страницах.

Еще от автора

Инвайтер 1.9 для 1.10.6
Доброго всем времени суток! Решил нарушить сложившуюся здесь традицию и решил вернуться сюда с обновлениями.
Инстант "по взрослому". Часть 2. Авторизация. Аякс. v1.10
Доброго всем времени суток! Продолжая серию Инстант "по взрослому", сегодня хотел бы показать более мощный плагин авторизации.
Инстант "по взрослому". Часть 1. Авторизация. Счетчик неверных входов. v1.10
Доброго всем дня! Продолжим наши уроки по усовершенствованию Инстанта. Сегодня мы будем изучать и усовершенствовать первую ветку Инстанта.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.