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