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

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

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


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

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


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

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

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

Код PHP:
			// Проверяем права доступа
			if (!$inCore->checkContentAccess($mod['access_list'])) { continue; }
// ДОБАВЛЯЕМ 1 СТРОЧКУ НИЖЕ //////////
            if (($mod['show_only_on_nested']==1)&&($inCore->isMenuIdStrict()==1)) { continue; }
//////////////////////////////////////
            $modulefile = PATH.'/modules/'.$mod['content'].'/module.php';

            if (!$mod['user']) { cmsCore::loadLanguage('modules/'.$mod['content']); }
чтобы не появлялась позиция модуля
проводим изменения функцию в том же файле
Код PHP:
public function countModules($position){

    $inCore = cmsCore::getInstance();
    $inDB   = cmsDatabase::getInstance();
	
    if (!$inCore->isMenuIdStrict()){ $strict_sql = "AND (m.is_strict_bind = 0)"; } else { $strict_sql = ""; }

	$menuid = $inCore->menuId();
/// добавили столбец m.show_only_on_nested
    $sql = "SELECT m.access_list,m.show_only_on_nested
            FROM cms_modules m, cms_modules_bind mb
            WHERE mb.position = '$position' AND
                  m.published = 1 AND
                  m.id = mb.module_id AND
                  (mb.menu_id = '$menuid' OR mb.menu_id = 0)
                  $strict_sql
            ";
	$result = $inDB->query($sql);

    if (!$inDB->num_rows($result)){ return 0; }
	
	$mods = array();

    while($mod = $inDB->fetch_assoc($result)){

		
		if (!$inCore->checkContentAccess($mod['access_list'])) { continue; }
////////////////// новая строка
            if (($mod['show_only_on_nested']==1)&&($inCore->isMenuIdStrict()==1)) { continue; }
////////////////
		$mods[] = $mod;
		
	}

    return sizeof($mods);
}


Если моя информация была для вас полезной, можно отблагодарить меня :
Yandex счет 41001684845537
Webmoney R750806594532
Доска объявлений 1.8.b2 beta-версия. | Компонент Рассылка материалов v.1.0 альфа
Комментарии (10)
◦ Ӎɑƙҫиӎ ◦ Ᵽɑɗиớӊớβ 21 октября 2011 в 00:38 +1
P.S. кстати еще сделал возможность для модуля показаться только на вложенных страницах от текущей (например поиск пользователей в списке пользователей не нужен, а внутри в профиле пользователя - нужен)
Считаю это очень полезной доработкой.
Крот 21 октября 2011 в 00:48 0
Если моя информация была для вас полезной, можно отблагодарить меня :
Yandex счет 41001684845537
Webmoney R750806594532
joke
◦ Ӎɑƙҫиӎ ◦ Ᵽɑɗиớӊớβ 21 октября 2011 в 01:13 0
Однозначно.Срок Visa вышел.На днях ожидайте))
prosis 12 апреля 2012 в 04:41 0
а не проще добавить значение? - например '2' для 'is_strict_bind'
RooKee 16 апреля 2012 в 21:15 0
Сделал второй вариант в админке. всё работает. но вот одна проблема. Выводит сайдбар(ну или ту позицию, где модуль показывается на внутр.) на главной странице.
RooKee 16 апреля 2012 в 22:12 0
http://koshkaikot.ru/blogs вот тут в сайдбаре выводится модуль "Популярное" с показом только на внутренних страницах.
Крот 18 апреля 2012 в 18:28 +1
RooKee, добавил решение в конец поста, попробуйте
RooKee 18 апреля 2012 в 20:07 +1
Спасибо огромное ) Монетку ловите!
Крот 18 апреля 2012 в 21:18 +1
пожалуйста!
спасибо за мотивацию) продолжу искать улучшения и баги
Юрий 28 июля 2017 в 11:22 0
Подскажите как эту штуку прикрутить к 1.10.7? Чтобы выводить модуль только на вложенных страницах.