Перед прочтением данной статьи, настоятельно рекомендуем ознакомиться с документацией о шаблонах материалов JBZoo. Это очень поможет вам при кастомизации приложения. Часто возникают вопросы по добавлению каких-либо условий при выводе элементов каталога. Здесь будут рассмотрены примеры условий для позиции элементов в шаблонах (например, full или teaser). Если в позиции несколько элементов, а условие нужно для одного, его нужно перенести в отдельную позицию или создать для него новую.
Рассмотрим сначала несколько простых примеров:
Для того, чтобы указать условия для различных групп пользователей, вставьте следующий код:
Показ только для авторизованных:
<?php $user = JFactory::getUser(); if (!$user->guest) { <КОД> } ?>
Показ только для анонимных (неавторизованных):
<?php $user = JFactory::getUser(); if ($user->guest) { <КОД> } ?>
Группа пользователя определяется по ID, которой можно посмотреть здесь:
Показывать только для группы Author:
<?php $user = JFactory::getUser(); if (in_array('3', $user->groups) { <КОД> } ?>
Показывать только для Super Users:
<?php $user = JFactory::getUser(); if ($user->superadmin) { <КОД> } ?>
Это условие можно применять, если вы хотите, чтобы вид шаблона teaser отличался на страницах категорий и на главной странице.
<?php //Определяем переменную вида категории (JRequest::getVar('view') == 'category') ? $category = true : $category = false; //Показ только на главной if(!$category){ <КОД> } //Показ на всех страницах категорий, кроме главной if($category){ <КОД> } ?>
Это условие можно применить, если вы желаете, чтобы вид шаблона teaser отличался только в определенных категориях.
Внимание! Если категория привязана к какому-либо пункту меню Joomla, это условие работать не будет.
<?php //Определяем переменную с id категории $category_id = JRequest::getInt('category_id'); //Показ на странице определенной категории с id=2 if($category_id == '2'){ <КОД> } //Показ на страницах определенных категорий с id = 5, 6, 7, 8 $categories = array(5,6,7,8); if(in_array($category_id, $categories)){ <КОД> } ?>
Чтобы узнать category_id, перейдите на страницу настроек категории, справа в разделе Содержание найдите надпись ID категории.
ID пункта меню можно взять либо из URL с выключенным SEF (Itemid=), либо в менеджере меню:
<?php //Определяем переменную с id пункта меню $itemid = JRequest::getVar('Itemid'); //Только для пункта меню с id=130 if($itemid == '130'){ <КОД> } ?>
Можно установить определенную дату или нужный диапазон (например, с 21 марта по 1 апреля 2013).
<?php //Определяем переменную с начальной датой $timestart = mktime(0,0,0,3,21,2013); //Определяем переменную с конечной датой $timestop = mktime(0,0,0,4,1,2013); //Определяем переменную с текущей датой $time = time(); //Показ только в этом диапазоне дат 21.03.2013 - 01.04.2013 if( $timestart < $time && $time < $timestop ){ <КОД> } ?>
Ограничение длины выводимой строки, не более чем 250 символов. При этом, слова в конце будут оставаться целыми и добавится многоточие при необходимости.
<?php echo $this->app->jbstring->cutByWords($this->renderPosition('<НАЗВАНИЕ_ПОЗИЦИИ>'), 250);
Пример шаблона teaser со следующими условиями:
— позиция price показывается только авторизованным пользователям.
— позиция rating показывается только на страницах категорий.
— описание в позиции subtitle обрезается до 30 слов.
<?php defined('_JEXEC') or die('Restricted access'); $align = $this->app->jbitem->getMediaAlign($item, $layout); //Получаем объект $user $user = JFactory::getUser(); //Определяем переменную категории (JRequest::getVar('view') == 'category') ? $category = true : $category = false; ?> <?php if ($this->checkPosition('image')) : ?> <div class="item-image align-<?php echo $align;?>"> <?php echo $this->renderPosition('image');?> </ div> <?php endif; ?> <div class="product-props"> <?php if ($this->checkPosition('title')) : ?> <h4 class="item-title"><?php echo $this->renderPosition('title'); ?></h4> <?php endif; ?> <?php //Обрезаем текст в позиции subtitle до 30 слов ?> <p><i> <?php $desc = JString::trim(strip_tags($this->renderPosition('subtitle'))); $descArr = explode(' ', $desc); $descArr_tmp = array(); foreach ($descArr as $word) { if ($word = JString::trim($word)) { $descArr_tmp[] = $word; } } if (count($descArr_tmp) > 30) { $descArr_tmp = array_slice($descArr_tmp, 0, 30); echo implode(' ', $descArr_tmp) . ' ...'; } else { echo implode(' ', $descArr_tmp); } ?> </i></p> <?php //Добавляем условие вывода для позиции price: показ только авторизованным if ($this->checkPosition('price') && !$user->guest) : ?> <p><?php echo $this->renderPosition('price'); ?></p> <?php endif; ?> <?php if ($this->checkPosition('properties')) : ?> <ul> <?php echo $this->renderPosition('properties', array('style' => 'list')); ?> </ul> <?php endif; ?> <?php //добавляем условие вывода позиции rating только на страницах категорий if($category) { echo $this->renderPosition('rating', array('style' => 'block')); } ?> </ div> <?php echo $this->renderPosition('links', array('style' => 'pipe')); ?>
Пример шаблона full со следующими условиями:
— позиция anons показывается только для Super Users.
— позиция meta показывается только с 1 июня 2013 до 31 августа 2013.
<?php defined('_JEXEC') or die('Restricted access'); $align = $this->app->jbitem->getMediaAlign($item, $layout); echo $this->renderPosition('title', array('style' => 'jbtitle')); echo $this->renderPosition('subtitle', array('style' => 'jbsubtitle')); echo $this->renderPosition('likes', array( 'style' => 'jbblock', 'class' => 'align-left' ) ); echo $this->renderPosition('rating', array( 'style' => 'jbblock', 'class' => 'align-right', ) ); //Получаем объект $user $user = JFactory::getUser(); //Определяем переменную с начальной датой $timestart = mktime(0,0,0,6,1,2013); //Определяем переменную с конечной датой $timestop = mktime(0,0,0,8,31,2013); //Определяем переменную с текущей датой $time = time(); ?> <div class="rborder item-body"> <?php if ($this->checkPosition('image')) : ?> <div class="item-image align-<?php echo $align;?>"> <?php echo $this->renderPosition('image'); ?> </ div> <?php endif; ?> <?php //добавляем условие вывода позиции anons только для Super Users if ($this->checkPosition('anons') && $user->superadmin) : ?> <div class="item-anons"> <?php echo $this->renderPosition('anons'); ?> </ div> <?php endif; ?> <?php //добавляем условие вывода позиции meta в указанном диапазоне дат if ($this->checkPosition('meta') && $timestart < $time && $time < $timestop) : ?> <hr/> <div class="item-meta"> <?php echo $this->renderPosition('meta', array( 'style' => 'jbblock', 'labelTag' => 'strong', 'tag' => 'p' )); ?> </ div> <?php endif; ?> <div class="clear clr"></ div> </ div>
Пример шаблона фильтра inline:
— позиция fields1 выводится для пункта меню с id=101.
— позиция fields2 выводится для остальных пунктов меню.
<?php defined('_JEXEC') or die('Restricted access'); //Получаем ID текущего пункта меню $itemid = JRequest::getInt('Itemid'); if($itemid == '101'): // Условие для показа позиции fields1 в пункте меню с ID 101 ?> <div class="filter-inline"> <?php echo $this->renderPosition('fields1', array('style' => 'filter.block'));?> </ div> <?php else: // Показ позиции fields2 в остальных пунктах меню ?> <div class="filter-inline"> <?php echo $this->renderPosition('fields2', array('style' => 'filter.block'));?> </ div> <?php endif; ?>
Под меткой <КОД> можно написать любой PHP или HTML. Например, вывод позиции будет выглядеть так:
<?php if ($this->checkPosition('position_name’)) { echo $this->renderPosition('position_name’); } ?>;
Вы можете обратиться на наш специальный форум техподдержки JBZoo. Если у вас нет активного аккаунта со знаком «плюс» в тарифном плане, то вы можете задать свой вопрос в одном из этих разделов или на любой из наших контактов. Форум специально предназначен для JBZoo, приоритет и скорость ответа там выше.