Условия в шаблонах материалов Zoo/JBZoo

10.0/10 оценка (9 голосов)

Перед прочтением данной статьи, настоятельно рекомендуем ознакомиться с документацией о шаблонах материалов JBZoo. Это очень поможет вам при кастомизации приложения. Часто возникают вопросы по добавлению каких-либо условий при выводе элементов каталога. Здесь будут рассмотрены примеры условий для позиции элементов в шаблонах (например, full или teaser). Если в позиции несколько элементов, а условие нужно для одного, его нужно перенести в отдельную позицию или создать для него новую.

Рассмотрим сначала несколько простых примеров:

Условия для авторизованных/анонимных пользователей

Для того, чтобы указать условия для различных групп пользователей, вставьте следующий код:

Показ только для авторизованных:

<?php 
     $user = JFactory::getUser();
     if (!$user->guest) {
          <КОД>
     } 
 ?>

Показ только для анонимных (неавторизованных):

<?php 
    $user = JFactory::getUser();
    if ($user->guest) {
        <КОД>
    }
?>

Определение группы пользователей

Группа пользователя определяется по ID, которой можно посмотреть здесь:

Как найти ID группу пользователя?

Показывать только для группы Author:

<?php
    $user = JFactory::getUser();
    if (in_array('3', $user->groups) {
        <КОД>
    }
?>

Показывать только для Super Users:

<?php
    $user = JFactory::getUser();
    if ($user->superadmin) {
        <КОД>
    }
?>

Просмотр шаблона teaser из категории, а не титульной страницы

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

<?php
//Определяем переменную вида категории
(JRequest::getVar('view') == 'category') ? $category = true : $category = false;
//Показ только на главной
if(!$category){
    <КОД>
}
//Показ на всех страницах категорий, кроме главной
if($category){
    <КОД>
}
?>

Условие при просмотре teaser из определенных категорий

Это условие можно применить, если вы желаете, чтобы вид шаблона 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 категории в Zoo

Определение пункта меню

ID пункта меню можно взять либо из URL с выключенным SEF (Itemid=), либо в менеджере меню:

Где взять ID пункта меню?

<?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);

Комплексный пример #1

Пример шаблона 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')); ?>

Комплексный пример #2

Пример шаблона 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>

Комплексный пример #3

Пример шаблона фильтра 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’);
}
?>;
API, Шаблон

У меня остались вопросы, где я могу их задать?

Вы можете обратиться на наш специальный форум техподдержки JBZoo. Если у вас нет активного аккаунта со знаком «плюс» в тарифном плане, то вы можете задать свой вопрос в одном из этих разделов или на любой из наших контактов. Форум специально предназначен для JBZoo, приоритет и скорость ответа там выше.