Форум русской поддержки Joomla!® CMS
06.12.2016, 10:08:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Ширина модулей в зависимости от количества опубликованных позиций (Решение)

 (Прочитано 4903 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

Пол: Мужской
Сообщений: 3820


Все начинается с Value


« : 11.07.2012, 02:49:36 »

Многие при написании своих шаблонов сталкиваются с тем, как задать ширину модулей в зависимости от количества опубликованных позиций. Самые частые здесь примеры, не показывать правую или левую колонки исходя из заданных условий. При этом модули должны растягиваться. Предлагаю ниже приведенную функцию, которая возвращает количество опубликованных модулей. В зависимости от от полученного результата можно с легкостью управлять размерами модулей. Количество передаваемых аргументов не определено.
Код
<?php 
function colpoz() {
$arg = func_get_args();
$numarg = func_num_args();
$col = 0;
for ($i = 0; $i < $numarg; $i++) {
if(JFactory::getDocument()->countModules($arg[$i])) $col++;
}
return $col;
}
?>
Пример 1. Задание класса
Код
<?php $myclass = 'test'.colpoz('left', 'right', 'center'); ?>
<div class="<?php echo $myclass;?>"><jdoc:include type="modules" name="left" /></div>
Пример 2. Задание ширины модуля
Код
<?php $modwidth = round (100 / colpoz('left', 'right', 'center', 'left1', 'right1', 'center1')).'%'; ?>
<div id='left' style='width:<?php echo $modwidth;?>'><jdoc:include type="modules" name="right1" /></div>
'left', 'right', 'center', 'left1', 'right1', 'center1' - позиции модулей
« Последнее редактирование: 19.03.2014, 12:38:43 от Fedor Vlasenko » Записан
 
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

Пол: Мужской
Сообщений: 3820


Все начинается с Value


« Ответ #1 : 21.07.2012, 16:18:16 »

Ох уж эти заказчики. В общем надоело позиции постоянно прописывать. Подкорректировал немножко функцию сверху и вот, что получилось Smiley
Код
<?php function colpoz() {
$col = 0; $htmlcode = '';
$numarg = func_num_args(); $arg = func_get_args();
for ($i = 0; $i < $numarg; $i++) {
$argname = $arg[$i];
if(JFactory::getDocument()->countModules($argname)){
$htmlcode .= '<div id="'.$argname.'" zamena><jdoc:include type="modules" name="'.$argname.'" /></div>';
$col++;
}
}
if ( $col == 0) return;
$style = 'style="width: '. round (100 / $col).'%; float: left;"';
echo preg_replace('/zamena/', $style, $htmlcode);
} ?>
Теперь, чтоб вывести позиции в шаблоне достаточно написать:
Код
<?php colpoz('top1', 'top2', 'top3'); ?>
<?php colpoz('top4', 'top5', 'top6', 'top7', 'top8'); ?>
При этом блоки выведутся если в них опубликованы модули и трансформируются(растянутся) по ширине
Здесь я не вывожу заголовки модулей. modChrome_none можно и переписать под свой вкус код в modules.php или добавить вывод стиля в colpoz()
« Последнее редактирование: 22.07.2012, 12:05:28 от Poznakomlus » Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6456



« Ответ #2 : 04.06.2014, 23:05:04 »

Функция прописывается непосредственно в шаблоне?
Записан
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

Пол: Мужской
Сообщений: 3820


Все начинается с Value


« Ответ #3 : 04.06.2014, 23:13:39 »

Да, можно и в другом месте. Где угодно. Здесь показан принцип и подход. И может лучше использовать вместо preg_replace sprintf
Записан
Shustry
Moderator
*****

Репутация: +727/-3
Offline Offline

Пол: Мужской
Сообщений: 6667


Рисую дизайны


« Ответ #4 : 06.06.2014, 00:14:49 »

Прикрепил. Фёдору респекты.
Записан
GTitan
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 35



« Ответ #5 : 08.02.2015, 16:43:58 »

А как на Бутстрап 3 такое реализовать, количество таблиц прописывать нигде не нужно, "span3" "span9" и т.д?
Записан
ShfVD
Живу я здесь
******

Репутация: +65/-0
Offline Offline

Пол: Мужской
Сообщений: 922



« Ответ #6 : 08.02.2015, 18:24:28 »

А как на Бутстрап 3 такое реализовать, количество таблиц прописывать нигде не нужно, "span3" "span9" и т.д?
А где вы в Bootstrap 3 видели "span3" "span9"?
Записан
GTitan
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 35



« Ответ #7 : 08.02.2015, 18:58:01 »

А где вы в Bootstrap 3 видели "span3" "span9"?
Вы иронизируете, не знаете сами, или увидели мою ошибку?
Записан
ShfVD
Живу я здесь
******

Репутация: +65/-0
Offline Offline

Пол: Мужской
Сообщений: 922



« Ответ #8 : 08.02.2015, 19:18:15 »

Увидел ошибку - сетка Bootstrap3 в корне отличается от Bootstrap2 (где были "span3" "span9")
http://bootstrap-ru.com/300/css/#grid
Для Bootstrap, мне кажется это не катит, т.к. ширина высчитывется
Код
$style = 'style="width: '. round (100 / $col).'%; float: left;"';
и в Bootstrap придется еще делать вычисления, подставляя  % - класс
« Последнее редактирование: 08.02.2015, 19:27:49 от ShfVD » Записан
GTitan
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Пол: Мужской
Сообщений: 35



« Ответ #9 : 08.02.2015, 20:09:20 »

Благодарю Вас, за указание на мою ошибку. Рекомендация полезная)
Записан
nixx
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 2


« Ответ #10 : 22.04.2015, 15:29:53 »

Чтобы не плодить темы, решил спросить здесь.

Joomla 2.5.
На некоторых страницах отключено левое меню.
Нужно на этих страницах подвинуть содержимое влево (занять тот объем, который занимало левое меню)
в CSS добавлен блок выполняющий все что нужно по сдвигу, в шаблон добавил конструкцию, которая  по условию (IF) применит нужный стиль из блока CSS. А вот само условие "IF" сформулировать не получается, и информацию нигде не могу найти.

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

Вопрос в том как в конструкции "IF ..." проверить статус левого меню (включено оно на текущей странице или отключено). Подскажите, пожалуйста, конструкцию, при помощи которой это можно сделать.
Записан
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

Пол: Мужской
Сообщений: 3820


Все начинается с Value


« Ответ #11 : 22.04.2015, 16:00:30 »

Код
if(JFactory::getDocument()->countModules('Имя позиции модуля')):
echo 'В позиции есть модули';
else
echo 'В позиции нет модулей';
endif;

Инфо о загуженных модулях

Код
$reflectionMethod = new ReflectionMethod(JModuleHelper, _load);
$reflectionMethod->setAccessible(true); //открываем защищенный метод
$module = $reflectionMethod->invoke(null);
printf("<pre>%s</pre>", print_r($module, true)); //немного изврата с выводом :-)
Записан
nixx
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 2


« Ответ #12 : 22.04.2015, 17:38:50 »

Fedor Vlasenko, благодарю за внимание к проблеме.

При выполнении блока "Инфо о загуженных модулях" среди списка нет нужного объекта (ну и подобных объектов тоже)

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

Вопрос в том, как определить этот объект "левое меню" чтобы на основании его состояния "опубликован-не опубликован", "загружен-не загружен" (присутствует или отсутствует на странице) принять решение, т.е:

Код:
if  ОБЪЕКТ "Левое меню" включен_загружен

применяем стандартный стиль "равнение по ширине левого меню"
else
применяем стиль "равнение по ширине 0"
endif;

вопрос в том, как определить  включен ли объект "Левое меню" (есть ли он на загруженной странице), чтобы правильно сформулировать условие:
 "if  ОБЪЕКТ "Левое меню" включен_загружен"
« Последнее редактирование: 22.04.2015, 17:44:39 от nixx » Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6456



« Ответ #13 : 22.04.2015, 18:32:11 »

Код
      <?php if($this->countModules('left and right') == 0) $contentwidth = "_full";
     if($this->countModules('left or right') == 1) $contentwidth = "_middle";
     if($this->countModules('left and right') == 1) $contentwidth = "_small";
     if(strlen(trim(strip_tags($doc->getBuffer('component')))) > 0) { ?>
 
       <div class="section">
 
         <?php if($this->countModules('left')) { ?>
           <div class="pos_left">
             <jdoc:include type="modules" name="left" style="html5" />
           </div>
         <?php } ?>
 
         <div class="pos_<?php echo $contentwidth; ?>">
           <div class="content">
             <?php if($this->countModules('breadcrumb')) { ?>
               <jdoc:include type="modules" name="breadcrumb" style="html5" />
             <?php } ?>
             <jdoc:include type="messages" />
             <jdoc:include type="component" />
           </div>
 
         </div>
 
         <?php if($this->countModules('right')) { ?>
           <div class="pos_right">
             <jdoc:include type="modules" name="right" style="html5" />
           </div>
         <?php } ?>
 
         <div class="clr"></div>
 
       </div>
     <?php } ?>

Код
.pos_left,.pos_right {width:25%;}
.pos_full {width:100%;}
.pos_middle {width:75%;}
.pos_small {width:50%;}
« Последнее редактирование: 22.04.2015, 18:37:56 от AlekVolsk » Записан
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

Пол: Мужской
Сообщений: 3820


Все начинается с Value


« Ответ #14 : 09.08.2015, 15:02:29 »

3 года спустя пишем функцию
Код
function showModules()
{
   $html = '';
   $count = 0;
   $doc = JFactory::getDocument();
   foreach (func_get_args() as $value) {
       if ($doc->countModules($value)) {
           $html .= '<div %1$s><jdoc:include type="modules" name="' . $value . '" /></div>' . PHP_EOL;
           ++$count;
       }
   }
   if ($count) {
       $style = 'style="width: ' . round(100 / $count). '%; float: left;"';
       printf($html, $style);
   }
}
 
выводим модули
Код
showModules('position-0', 'position-1', 'position-2', 'position-3',
   'position-4', 'position-5', 'position-6', 'position-7', 'position-8', 'position-9');
 
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet