Тема сегодняшней статью будет посвящена сокращению размера кода, при помощи которого генерируется стандартная страница с материалом на сайте Joomla 3. Для этих целей мы создадим пользовательский шаблон для материала и привяжем его к одному из типов пункта меню в панели управления.

Как мы все знаем, в Joomla за вывод определенного материала отвечает специальный макет (или шаблон) при помощи которого генерируется содержимое конечной страницы. Расположен данный шаблон в папке /components/com_content/views/article/tmpl/ под именем default.php.

Содержимое данного файла достаточно велико и состоит из 173 строк кода (для Joomla версии 3.8.2). Но по большей части более половины имеющихся строк для отдельно взятого сайта попросту не нужны. Почему не нужны, спросите Вы? Давайте разберем, вот ответьте себе на один простой вопрос, как часто вы выводите на странице с материалом заголовок категории, иконки (печати, электронной почты и т.п.), информационные блоки и так далее.

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

Удалив лишний не используемый код в файле шаблона статьи, мы тем самым сократим размер самого файла, а так же пусть незначительно, но все же снизим нагрузку на сервер. Ведь для генерации страницы ему не придется обрабатывать различные условия, что нужно выводить, а что оставить без отображения.

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

Итак, приступим. Сразу оговорюсь, что я не буду вносить изменения для всех материалов разом, а создам новый шаблон и сделаю его доступным через новый тип пункта меню.

Для начала нам потребуется создать копии фалов default.php и default.xml расположенных в папке /components/com_content/views/article/tmpl, переименовать их и поместить в папку html/com_content/article текущего шаблона. Так как я делаю макет статьи для разделов (категорий), файлы я назвал category-article.php и category-article.xml (Вы можете назвать их как угодно, но имена файлов php и xml должны совпадать).

Теперь открываем файл category-article.xml и в самом его начале вносим в него небольшие изменения. Стандартный код файла выглядит следующим образом:

Стандартный код файла макета статьи Joomla 3 - default.xml

Все что от нас потребуется это в строках 3 и 8 поменять имена языковых констант (вместо default дописать в моем случае category-article), результат должен получиться вот таким:

<?xml version="1.0" encoding="utf-8"?>
<metadata>
 <layout title="COM_CONTENT_ARTICLE_VIEW_CATEGORY-ARTICLE_TITLE" option="COM_CONTENT_ARTICLE_VIEW_CATEGORY-ARTICLE_OPTION">
  <help
   key = "JHELP_MENUS_MENU_ITEM_ARTICLE_SINGLE_ARTICLE"
  />
  <message>
   <![CDATA[COM_CONTENT_ARTICLE_VIEW_CATEGORY-ARTICLE_DESC]]>
  </message>
 </layout>

Сохраняем изменения и закрываем данный файл, он нам больше не пригодится. После того как языковые константы были переименованы самое время присвоить им новые адекватные значения. Для этого открываем (или создаем новый) файл ru-RU.tpl_имя_шаблона.sys.ini в папке /templates/имя_шаблона/language/ru-RU и дописываем в него наши новые языковые константы и их значения:

COM_CONTENT_ARTICLE_VIEW_CATEGORY-ARTICLE_TITLE="Материал для раздела (категории)"
COM_CONTENT_ARTICLE_VIEW_CATEGORY-ARTICLE_DESC="Урезанная версия материала специально для раздела (категории)"

Константы прописали, отлично, теперь можно проверить результат. Открываем панель управления, переходим в раздел «Меню» и открываем один из пунктов меню для редактирования. Жмем на кнопку «Выбрать» тип пункта меню и в разделе «Материалы» наблюдаем наш вновь созданный шаблон материала:

Новый тип пункта меню для отображения материала.

После того как наш новый макет (шаблон) материала был создан, а языковые константы прописаны самое время приступить к его редактированию. Скажу сразу, я сократил данный файл по максимуму, убрал стандартный код, отвечающий за отображение всего содержимого статьи, оставил лишь начальные строки. Все необходимые данные мы будем выводить из базы самостоятельно, а сейчас оставляем лишь вот такой код:

<?php

defined('_JEXEC') or die;
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers');

// Create shortcuts to some parameters.
$params = $this->item->params;
$images = json_decode($this->item->images);
$urls = json_decode($this->item->urls);
$canEdit = $params->get('access-edit');
$user = JFactory::getUser();
$info = $params->get('info_block_position', 0);

// Check if associations are implemented. If they are, define the parameter.
$assocParam = (JLanguageAssociations::isEnabled() && $params->get('show_associations'));
JHtml::_('behavior.caption');
?>

<div class="category-article item-page<?php echo $this->pageclass_sfx; ?>" itemscope itemtype="https://schema.org/Article">
 <meta itemprop="inLanguage" content="<?php echo ($this->item->language === '*') ? JFactory::getConfig()->get('language') : $this->item->language; ?>" />

</div>

Для наглядности посмотрите на скриншот:

Код файла шаблона материала, из которого убрали все лишнее

Теперь приступим к написанию собственного кода, для начала давайте выведем основной текст материала. Для этих целей перед закрывающимся тегом div (строка 21) напишем следующий код:

<div itemprop="articleBody">
 <?php echo $this->item->text; /*Выдергиваем из базы основной текст материала*/ ?>
</div>

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

<div style="position: absolute;left: -9999px;">
 <h1 itemprop="headline"><? echo $this->item->title; ?></h1>
 <dd class="create">
  <time datetime="<? echo $this->item ->created; ?>" itemprop="dateCreated">
   Дата создания: <? echo $items->created; ?>
  </time>
 </dd>
 <dd class="published">
  <time datetime="<? echo $this->item ->publish_up; ?>" itemprop="datePublished">
   Дата публикации: <? echo $items->publish_up; ?>
  </time>
 </dd>
 <dd class="modified">
  <time datetime="<? echo $this->item ->modified; ?>" itemprop="dateModified">
   Обновлено: <? echo $items->modified; ?>
  </time>
 </dd>
</div>

Код не сложный, в самом начале я, как и говорил, создаю отдельный блок, которому при помощи стилей указываю абсолютное позиционирование и сдвигаю влево на 9999 пикселей, чтобы скрыть его от посетителей.
Затем внутри этого блока выводим заголовок материала:

<h1 itemprop="headline"><? echo $this->item->title; ?></h1>

Обратите внимание на строку itemprop="headline" это так называемый элемент микроразметки schema.org, так мы говорим поисковым роботам, что данный блок относится к заголовку страницы. Более подробно о микроразметке я напишу в другой раз.

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

<dd class="create">
 <time datetime="<? echo $this->item ->created; ?>" itemprop="dateCreated">
  Дата создания: <? echo $this->item ->created; ?>
 </time>
</dd>

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

Аналогичным образом можно выводить и другие данные, которые могут в дальнейшем пригодиться. Надеюсь, данная статья была для Вас полезна. Если у Вас остались вопросы задайте их в комментариях.

Добавить комментарий