Модули-невидимки

как решить вопрос корректного подсчета количества

#1 31 марта 2011 в 17:37
Доброго времени суток!

Не нашел темы отдельно по Модулям движка, впрочем мой пост касается больше корректного подсчета модулей.

Есть в движке такой модуль "Авторизация". Когда пользователь не авторизован — модуль отображается (ну конечно же если он изначально включен для показа), когда пользователь авторизован — модуль скрыт от показа. Все вроде бы просто, но… если допустим дизайн сайта выводит те или иные позиции с учетом предварительной проверки на наличие в этой самой позиции включенных для показа модулей и текущая страница вывода соответствует странице вывода этого модуля, то резервируется место под вывод позиции. Т.е. предположим:
— на главной странице в позиции sidebar включен для показа модуль "Авторизация" (и больше никаких модулей в этой позиции нет);
— пользователь авторизовался, но — колонка sidebar резервируется под отображение модуля по прежнему, хотя в ней ничего не отображается (модуль "Авторизация" скрыт для показа залогиненым пользователям) и получается что колонка контента сужается, а освободившаяся часть — пустая.

Никто не пробовал модифицировать функцию подсчета модулей для позиций с учетом включенных и выключенных модулей-невидимок? У обладателей компонента InstantShop есть еще один модуль-невидимка — "Корзина".
#2 31 марта 2011 в 18:48
тоже так думал, но потом пересмотрел всё и что то с настройками где отображать намудрил и всё поправилось
вроде как то так
хотя согласен, что должно быть проще как то, что бы не мудрить
#3 31 марта 2011 в 22:05
авторизацию можно поставить только для гостей(показ) и все будет нормально
#4 31 марта 2011 в 23:22


авторизацию можно поставить только для гостей(показ) и все будет нормально

forlord

Вариант сработал и под Пользователем не отображается. Правда под админом если зайти — все равно пустой столбец показывает.

Но например для модуля Корзина под InstantShop это уже не прокатит — там как раз Гости заходят, а сам модуль Корзина работает похоже: есть хотя бы один товар в Корзине — Корзина отображается, нет выбранных товаров — Корзина скрыта.
#5 26 апреля 2012 в 03:30
Достаточно вывод куска шаблона с колонкой заключить в условие if, где проверить, чтобы функция cmsCountModules не возвращала ноль.
Примерно выглядеть это будет так:
  1. <? if (!cmsCountModules("sidebar") == 0) {
  2. echo "<td>";
  3. cmsModule('left'); cmsModule("sidebar");
  4. echo "</td>";
  5. }
#6 26 апреля 2012 в 06:43

Правда под админом если зайти — все равно пустой столбец показывает.

Админ видит все что включено на сайте даже если модули отмечены для гостей
#7 26 апреля 2012 в 13:34


Правда под админом если зайти — все равно пустой столбец показывает.

Админ видит все что включено на сайте даже если модули отмечены для гостей

Gorec

Я про что и говорю — т.к. Админ видит все — ему должен отображаться модуль Авторизация, который вроде и невидимый, но он есть, потому отгрызается колонка, да еще и в том месте, где вообще ничего не должно показываться, т.е. основная часть должна быть широкой для отображения статей. Проблему можно решить, если зайти под пользователем, но постоянно так прыгать туда-сюда — не дело.
#8 26 апреля 2012 в 14:28
Алексей, логичней не настраивать отображение модуля в админке, а в самом модуле добавить условие — показывать только гостям, иначе не выводить. Две строки в модуле исправят проблему. И для админа он показываться не будет.

Никто не пробовал модифицировать функцию подсчета модулей для позиций с учетом включенных и выключенных модулей-невидимок?

Это проблема некорректно написанного модуля, а не вычисления позиций…
#9 27 апреля 2012 в 00:45


Алексей, логичней не настраивать отображение модуля в админке, а в самом модуле добавить условие — показывать только гостям, иначе не выводить. Две строки в модуле исправят проблему. И для админа он показываться не будет.

Никто не пробовал модифицировать функцию подсчета модулей для позиций с учетом включенных и выключенных модулей-невидимок?

Это проблема некорректно написанного модуля, а не вычисления позиций..

SJen

Нет. Если ты выключишь модуль в коде самого модуля от показа всем кроме гостей, то проблему это не решит, т.к. у тебя стоят проверки на кол-во модулей для позиций. Например, если для sidebar включенных модулей для этой страницы >0 — движок отводит место под sidebar, уменьшая тем самым размер main. Вот и получается: модуль есть, он включен для показа, соответственно функция подсчета его и учитывает и включает например sidebar, отводя под эту позицию место, а сам модуль выключен, т.к. пользователь залогинился и если у тебя в sidebar прописан всего один модуль "Авторизация", то ты получишь пустую полосу sidebar (точнее место, где оно должно выводиться) и урезанный main. Так и выходит, что даже отключенный от показа Админу — он будет резервировать колонку sidebar. Потому в модуле менять ничего смысла нет.
#10 27 апреля 2012 в 08:57

модуль есть, он включен для показа, соответственно функция подсчета его и учитывает и включает например sidebar

если добавить в модуле
  1. return false;
— это будет равносильно выключению модуля и решит вашу проблему с вычислением количества. Вы попробуйте. Сначала просто добавьте и посмотрите что будет с пустым местом, а потом уже нужно добавить return false; если модуль открывается зареганным юзером, который не должен это видеть.
#11 27 апреля 2012 в 09:41


модуль есть, он включен для показа, соответственно функция подсчета его и учитывает и включает например sidebar

если добавить в модуле
  1. return false;
— это будет равносильно выключению модуля и решит вашу проблему с вычислением количества. Вы попробуйте. Сначала просто добавьте и посмотрите что будет с пустым местом, а потом уже нужно добавить return false; если модуль открывается зареганным юзером, который не должен это видеть.

SJen

Функция подсчета берет данные из таблицы модулей БД (выборка из БД по позиции вывода всех включенных для показа модулей, после чего проверяется права на модуль для пользователя, путь отображения текущей страницы с настройками и полученное кол-во модулей подсчитывается и если оно больше 0, то резервируется место для вывода позиции), так что в сам модуль можно что угодно добавлять — это в калькуляции не используется и не учитывается. Как я уже писал: проблема не в отображении модуля, а в том, что движок резервирует позицию вывода в которой естественно пусто, т.к. модуль не выводится.
#12 27 апреля 2012 в 21:09
Алексей, все верно, беру свои слова обратно smile
Проверил по коду, все как вы и написали.

Появилась мысль, как можно избавиться от пустого места, используя jquery.
  1. $(document).ready(function(){
  2. if ($('#sidebar').html()=='') {$('#sidebar').remove();}
  3. });
  4.  
здесь sidebar — это id блока, в котором мы проверяем наличие модулей (точнее проверяем есть ли что внутри). Если блок пустой — удаляем его.

Никто не пробовал модифицировать функцию подсчета модулей для позиций с учетом включенных и выключенных модулей-невидимок?

Алексей
А ваш вариант вряддли осуществим… потому что в модуле реально может быть "return false;" и никакой запрос вам это не скажет, пока не начнется вывод модулей…
#13 27 апреля 2012 в 21:24

здесь sidebar — это id блока, в котором мы проверяем наличие модулей (точнее проверяем есть ли что внутри). Если блок пустой — удаляем его.

SJen
О! Хорошая идея. Действительно, если в позицию не выводится никакого HTML-кода, то просто ее игнорировать. Но тот же например sidebar выводится (в случае, если он справа от основной части контента расположен) уже после вывода контента, т.е. после позиций main под которые изначально при подсчете кол-ва расположенных в них модулях определяется будущая ширина колонок, т.е. есть в main модули и есть в sidebar — ставится ширина для main и для sidebar, есть модули только в main, но нет в sidebar — размеры main делаются во всю ширину сайта. Исходя из предложенного тобой варианта выходит следующее: сперва мы проверяем наличие модулей в позициях и там функция подсчета находит модуль Авторизация и отводит размер под sidebar и main, затем доходим до момента вывода sidebar и когда обнаруживаем оператором условия что туда ничего не выводится — игнорируем блок всей позиции sidebar, но ведь ранее мы уже ужали main и мало того — мы уже его опубликовали. Таким образом мы снова получим урезанный по ширине контент, а нужен то он во всю ширину. Или я ошибаюсь и можно "на лету" изменить размеры main?
#14 27 апреля 2012 в 22:13

Или я ошибаюсь и можно "на лету" изменить размеры main?

это зависит от шаблона… Если в вашем размеры main задаются исходя из наличия либо отсутствия sidebar, то придется менять на лету.

сейчас покажу как. Это не универсальное решение(зависит от шаблона), но вы под себя можете настроить:
Вариант 1, с жестким указанием ширины дива main
  1. $(document).ready(function(){
  2. if ($('#sidebar').html()=='') {
  3. $('#sidebar').remove();
  4. $('#main').css({'width':'1111px'});//новая ширина main
  5. }
  6. });
  7.  
Вариант 2, меняем класс объекта (например у меня есть классы grid_8/grid_4 с разной шириной). Старый убираем, новый ставим
  1. $(document).ready(function(){
  2. if ($('#sidebar').html()=='') {
  3. $('#sidebar').remove();
  4. $('#main').removeClass('grid_8').addClass('grid_4');
  5. }
  6. });
#15 28 апреля 2012 в 05:23


SJen
Спасибо! На дня опробую. v
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.