BLOG

Нестандартный вывод дополнительных полей в К2

Нестандартный вывод дополнительных полей в К2

По умолчанию в компоненте K2 используется вывод всех доп. полей в одном месте, что очень некрасиво и не всегда удобно. К примеру, в списке материалов категории нужно вывести лишь часть доп. полей в intro-тексте, а уже в просмотре полного материала - все поля. Такой вот банальный пример.

Для начала - если Вы используете компонент K2 и его отдельные шаблоны, то нужно скопировать всё содержимое шаблона K2 в Ваш шаблон Joomla. Таким образом, при обновлении K2 (особенно это касается J2.5 и выше) Вы не потеряете свои изменения, которые Вы произвели в файлах шаблона K2.

Создаём копию шаблона K2

Открываем папку: /components/com_k2/templates/ и копируем ее содержимое в папку с вашим шаблоном (предварительно создав папки com_k2/templates/): /templates/имя_вашего_Joomlaшаблона/html/com_k2/templates/
Если Вы будете использовать разделение доп.полей не везде, то весьма полезным будет создание отдельного шаблона для этих целей. К примеру, часть статей мы будем выводить так, как они и выводятся в К2 по умолчанию (пусть шаблон так и называется default), а наш модернизированный шаблон банально обзовём new. Чтобы было более понятно - смотрим дерево на картинке (будьте внимательны - по поводу имени файла CSS-стиля в данной папке мы пожуём ниже). В нашем примере мы используем шаблон от компании Yootheme - Nano3.

 Создаём копию шаблона К2

Содержимое папки default полностью копируем в папку new. Именно в папке new мы и буедм производить все дальнейшие манипуляции.

Так как К2 по умолчанию "тянет" стили из "родной" папки компонента (/components/com_k2/css/k2.css), решим проблему следующим образом: 

Предоставляя базовое переопределение для item.php, мы делаем рестайлинг названия и удаляем стиль font-family по умолчанию, созданный K2, а вместо этого наследуем его из шаблона. В этом случае, вы должны увидеть изменение название стиля.

Как это расширить?

Вы можете щелкнуть правой кнопкой в вашем браузере на любой части, которую вы хотите изменить, это будет объявленный класс CSS или ID и используемые настройки, разделить новую структуру CSS в типографику, цвет и расположение, а затем просто скопировать нужный селектор CSS и вставить в соответствующий файл CSS коррекции. Внесите изменения и сохраните.

Теперь у вас есть настройки по умолчанию, вы можете скопировать вложенную папку по умолчанию, а затем переименовать, чтобы создать новый шаблон. Просто убедитесь, что ваш новый второй шаблон присваивается категории К2.

Настройка стилей

В item.php мы предоставляем ссылку на импорт, чтобы загрузить файл CSS - k2.css. Вы можете скопировать все CSS из файла стилей компонента K2 - k2.css и поместить его здесь. Я предпочитаю переопределять только то, что требуется. В k2.css мы предоставляем ссылки на 3 дополнительных CSS просто разбитых на типографику, расположение и цвета, вы не должны использовать их, если вы не хотите, я разделил их, по просьбе продвинутых клиентов.

Работаем с дополнительными полями K2

Здесь подразумевается, что с К2 вы уже работали, а значит, создали группу дополнительных полей, а в ней - хотя бы два самих поля. Затем нужно присвоить эту группу допполей нашей категории, которой мы назначили шаблон new. Создаём тестовый материал, открываем его и делаем запись в дополнительных полях (в нашем примере это банальные «Демо» и «Скачать»):

 Работаем с дополнительными полями

 Теперь разберёмся c содержимым папки нашего К2-шаблона.

category.php файл, отвечающий за вывод списка категорий
category_item.php файл, отвечающий за вывод материалов при открытии непосредственно категории в режиме блога
item.php файл, отвечающий за вывод материала в развёрнутом (полном) виде
item_comments_form.php файл вывода формы комментариев после материала
itemform.php файл вывода формы добавления материала
latest.php файл вывода списка последних материалов
latest_item.php файл вывода материала в списке последних материалов
new_style.css файл стилей данного шаблона (в нашем примере имя шаблона - new)
tag.php файл вывода списка материалов по тэгу
user.php файл вывода страницы автора

Для примера будем ковырять файл, отвечающий за вывод материалов в режиме блога - а именно category_item.php. Сделаем так, чтобы при просмотре списка материалов пользователь видел только Демо, а уже при просмотре развёрнутого материала появлялось бы ещё и поле Скачать.
Хочу обратить Ваше внимание, что за просмотр развёрнутого материала отвечает уже другой файл, а именно - item.php, и в нашем примере для достижения желаемого результата нужно будет подправить только первый файл,  category_item.php.

Разделяем дополнительные поля 

Открываем файл /templates/название_шаблона/html/com_k2/templates/new/category_item.php и после строки:

defined('_JEXEC') or die('Restricted access');

(это практически в самом начале файла) вставляем следующий код:

// дополнительные поля материала K2
$extrafields = array();
foreach($this->item->extra_fields as $item)
{ 
$extrafields[$item->id] = $item->value;
}

 После этого нам необходимо удалить существующий вывод всех дополнительных полей. Ищем в районе 136-й строки код (от версии к версии номера строк могут меняться - для этого у Вас должна быть голова на плечах и более-менее прямые руки) и удаляем его:

<?php if($this->item->params->get('catItemExtraFields') && count($this->item->extra_fields)): ?>
<div class="catItemExtraFields">
    <h4>
        <?php echo JText::_('K2_ADDITIONAL_INFO'); ?>
    </h4>
    <ul>
        <?php foreach ($this->item->extra_fields as $key=>$extraField): ?>
        <?php if($extraField->value != ''): ?>
        <li class="<?php echo ($key%2) ? " odd " : "even "; ?> type<?php echo ucfirst($extraField->type); ?> group<?php echo $extraField->group; ?>">
            <?php if($extraField->type == 'header'): ?>
            <h4 class="catItemExtraFieldsHeader">
                <?php echo $extraField->name; ?>
            </h4>
            <?php else: ?>
            <span class="catItemExtraFieldsLabel"><?php echo $extraField->name; ?></span>
            <span class="catItemExtraFieldsValue"><?php echo $extraField->value; ?></span>
            <?php endif; ?>
        </li>
        <?php endif; ?>
        <?php endforeach; ?>
    </ul>
    <div class="clr"></div>
</div>
<?php endif; ?>

 Далее нам нужно вывести одно дополнительное поле внизу intro-текста материала, это будет поле Демо, которое имеет уникальный ID - 1 (узнать ID поля можно в административной панели K2, во вкладке Доп. поля):

 Узнать ID поля можно в административной панели K2, во вкладке Доп. поля

Затем в этом же файле category_item.php ищем подходящую позицию для размещения дополнительного поля (в нашем случае это будет в самом верху материала, под Автором) и вставляем следующий код:

<?php echo $extrafields[1];?>

где  [1] - это и есть id дополнительного поля Демо. Обновляем страницу на сайте и видим наше одно поле, которое имеет идентификатор 1. Таким же образом вставляем другие поля в любом месте шаблона K2, только не забудьте менять ID при каждом новом добавлении поля в шаблон, в противном случае у вас получится одно и тоже поле в разных местах шаблона:

 [1] - это и есть id дополнительного поля Демо

 НЕМАЛОВАЖНОЕ ЗАМЕЧАНИЕ: в настоящее время можно использовать алиасы доп. полей вместо id, что существенно упростит навигацию в файлах К2-шаблона:
$this->item->extraFields->АЛИАС->name
$this->item->extraFields->АЛИАС->value

 Таким образом, счастливые обладатели К2, начиная с версии 2.6.1, могут наслаждаться ещё и тем, что теперь возможен вывод названия (name) и значения (value) любого дополнительного поля в любом месте шаблона! Ну, а мы, так сказать, для простоты, поработаем пока "по старинке".
И ещё одно замечание. Как Вы уже могли заметить, у нас вывелось только значение дополнительного поля, имя поля в нашем случае не было необходимо, и мы его упустили. Если же Вы хотите вывести и название поля, и его значение - нужно несколько видоизменить код, который мы добавляли в начале (помните, после строки запрета прямого доступа к файлу):

// дополнительные поля материала K2
$extrafields = array();
foreach($this->item->extra_fields as $item)
{ 
// добавлением следующей строки мы определяем переменную, содержащую имя допполя, а в следующей - его значение:
$extrafieldsname[$item->id] = $item->name;
$extrafields[$item->id] = $item->value;
}

Индивидуальное оформление каждого поля

Далее нам необходимо индивидуально оформить дополнительное поле K2. Для этого достаточно просто обрамить наш код DIV'ом или любым другим элементом по желанию и добавить к нему CSS-класс или id для создания уникального стиля. Например, сделаем так:

<div class="demo">
<?php echo $extrafields[1];?>
</div>

После этого открываем CSS файл компонента K2 (это наш файлик new_style.css) и создаем стиль оформления. Здесь уже делайте оформление как душе угодно. Например, вот так:

.demo {
background: url ('../images/red-button.png');
width: 60px;
height: 20px;
margin: 8px 0 7px 5px;
}

 Но я использовал уже готовые стили шаблон и просто прописал class="uk-button uk-button-success", плюс добавил своих для позиционирования:

<div class="demo">
    <span class="uk-button uk-button-success demo_button">
        <?php echo $extrafields[1];?>
    </span>
</div>
.demo {
    display: flex;
}
.demo_button {
    margin: 1% auto;
}
.demo_button a {
    color: #fff;
}

 Результат получим такой:

rezult demo

 Усложняем задачу

 В "штатном" режиме дополнительные поля К2 выводятся циклом, мы же в предыдущем примере убрали цикл и вывели поля индивидуально. Но не запаримся ли мы, если у нас два десятка полей, и нам не нужно делать индивидуальное оформление для каждого поля, а нужно лишь скрыть одно-два поля от посторонних? Выведем снова циклом, исключив ненужные поля.  Ситуация с алиасами нам не подойдёт однозначно.  Например, будем выводить поле "оптовая цена" только для конкретной группы пользователей К2 (назовём их условно "Оптовики"). В данном примере рассмотрим поля "Мелкий опт" и "Крупный опт" id которых равны соответственно 19 и 20, и группу пользователей "Оптовики", id которой равно 5.

Обратите внимание: мы работаем не с группами пользователей JOOMLA, а с группами пользователей К2. Это важно!
<ul>
<?php foreach ($this->item->extra_fields as $key=>$extraField): ?>
  <?php if(($extraField->value != '') &&  ($extraField->id <> 19) &&  ($extraField->id <> 20)): ?>
    <li class="<?php echo ($key%2) ? "odd" : "even"; ?> type<?php echo ucfirst($extraField->type); ?> group<?php echo $extraField->group; ?>">
      <span class="itemExtraFieldsLabel"><?php echo $extraField->name; ?>:</span>
                  <span class="itemExtraFieldsValue"><?php echo $extraField->value; ?></span>
                </li>
              <?php endif; ?>
<?php endforeach; ?>
</ul>

 Таким образом, в этом куске кода мы выводим все поля, кроме незаполненных и тех, у которых id=19 и id=20. Теперь проверим, какой id у пользователя, и если он из группы "Оптовики" (т.е. id группы юзеров К2 =5) - выведем по описанноый ранее методике оставшиеся два поля:

// получаем айдишку К2-юзера и его К2-группы
<?php $user = &JFactory::getUser(); 
$k2_user = K2HelperPermissions::getK2User($user->id); // проверяем на соответствие нашей группе, и если группа =5 (оптовики) - то выводим допполя с id=19 и 20 if($k2_user->group >= 5 )    { ?>
<?php echo $extrafields[19];?>
<?php echo $extrafields[20];?>
// Если условие не выполнилось (id группы не равен 5), то
<?php } else echo  '<h5>тут выводим предупреждение о недопустимости просмотра данной группой</h5>'  ?>

 Смотрим готовый код:

// Начинаем цикл-перебор всех существующих доп.полей
<ul>
  <?php foreach ($this->item->extra_fields as $key=>$extraField): ?>
// Делаем проверку, не пустые ли допполя и не равны ли их id-шки 19 и 20, и если условие верно - выводим допполя по очереди:
<?php if(($extraField->value != '') &&  ($extraField->id <> 19) &&  ($extraField->id <> 20)): ?>
             <li class="<?php echo ($key%2) ? "odd" : "even"; ?> type<?php echo ucfirst($extraField->type); ?> group<?php echo $extraField->group; ?>">
      <span class="itemExtraFieldsLabel"><?php echo $extraField->name; ?>:</span>
                  <span class="itemExtraFieldsValue"><?php echo $extraField->value; ?></span>
                </li>
              <?php endif; ?>
              <?php endforeach; ?>
</ul>
// получаем айдишку К2-юзера и его К2-группы
<?php $user = &JFactory::getUser(); 
$k2_user = K2HelperPermissions::getK2User($user->id); 
// проверяем на соответствие нашей группе, и если группа =5 (оптовики) - то выводим допполя с id=19 и 20 
if($k2_user->group >= 5 )    { ?>
 
<span class="itemExtraFieldsLabel"><?php echo $extrafieldsname[19];?></span>
 
<span class="itemExtraFieldsValue"><?php echo $extrafields[19];?></span>
 
<span class="itemExtraFieldsLabel"><?php echo $extrafieldsname[20];?></span>
 
<span class="itemExtraFieldsValue"><?php echo $extrafields[20];?></span>
 
// Если условие не выполнилось (id группы не равен 5), то
<?php } else echo  '<h5>тут выводим предупреждение о недопустимости просмотра данной группой</h5>'  ?>

Итог:

Думаю, простота данного решения не введёт в ступор даже мало-мальски посвящённого в тему Джумлера. Используя данную методику, можно не только выводить/скрывать доп. поля, но и при желании размещать их в разном порядке, в начале и конце статей, а также выводить в одной статье поля из разных групп.

web7pc.com
Precios para: Crear pagina web | Crear Tiendas Online | Posicionamiento SEO
Comprar robots para: Milanuncios | Vibbo | A medida
Otras preguntas pincha:  AQUÍ

Убедитесь, что Вы ввели всю требуемую информацию, в поля, помеченные звёздочкой (*). HTML код не допустим.