Перед прочтением данной статьи, настоятельно рекомендуем ознакомиться с документацией о шаблонах материалов 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, приоритет и скорость ответа там выше.