Как создать материал в joomla 2.5. Материал в Joomla. Практика - Множественная кольцевая перелинковка материалов категории

Материалы

Давайте начнём с нескольких определений. Материалы в Joomla! это информация, которую вы хотите отобразить на сайте. Обычно они состоят из текста, изображений или других типов контента. Для многих сайтов Joomla! статьи являются основным контентом, презентованным на сайте.

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

Разделы и категории

Разделы и категории в Joomla! позволяют, при желании, организовать расположение ваших материалов. Вот как это работает. Раздел содержит одну или более категорию, к которой могут быть прикреплены материалы. Один материал может находиться только в одной категории и одном разделе.

Допустим есть раздел под названием «Питомцы» и категории «Собаки» и «Кошки». Материалы о собаках прикрепим к категории «Собаки», о кошках к категории «Кошки». Таким образом материал о собаках будет находиться в разделе «Питомцы», в категории «Собаки». Один и тот же материал не может находиться в разных категориях. Чтобы обойти этот нюанс вы можете создать новую категорию «Кошки и собаки», либо создать новый материал, чтобы поместить его в нужную вам категорию.

Зачем использовать разделы и категории?

Есть две основные причины, исходя из которых вы захотите организовать ваши материалы в категории и разделы.

Схемы блогов и списков

Во-первых в Joomla! существуют встроенные пункты меню, чтобы пользоваться этими возможностями. Раздел блогов, раздел списков, категории блогов и категории списков. Эти вкладки меню позволяют с лёгкостью отобразить материалы, принадлежащие к определённому разделу или категории. Как только создан новый материал и определён в категорию и раздел, он будет автоматически помещён на ту страницу, которую вы указали в настройках.

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

Организация материалов в Менеджере материалов

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

Разделы, категории и организация меню

Важно понимать,что если Joomla! использует организацию материалов в три уровня (Раздел>Категория>Материал), не обязательно от этого будет зависеть структура меню вашего сайта. Например у вашего сайта может быть один уровень меню, а может быть и шесть.

Другие типы категорий

Так же присутствует возможность некоторой путаницы, касающейся категорий. Разделы используются только для материалов. Тем не менее категории так же используются для компонентов, включая баннеры, контакты, новостные ленты и ссылки. Эти категории абсолютно не похожи на категории материалов и отображаются в других частях страницы в пользовательской части Joomla!. Так что, если сталкиваетесь с понятием категорий, могут иметься ввиду категории материалов, либо категории компонентов.

You have no rights to post comments

Что делает: каждому материалу можно присвоить несколько категорий. При просмотре материала будут показаны все категории, в которых содержится материал (хотя это уже на ваше усмотрение, можете и не показывать). При просмотре категорий дубликатов, естественно, никаких нет.

Хак требует изменения как базы данных так и нескольких файлов самой Joomla, так что перед тем как редактировать файлы, сделайте их копии.

Шаг 1 - Выполнить скрипт для БД, где # - префикс таблиц в вашей БД. Лучше всего это делать через phpMyAdmin .

ALTER TABLE `#_content` ADD `catid2` INT (11) NOT NULL DEFAULT "0" AFTER `catid` ;
ALTER TABLE `#_content` ADD `catid3` INT (11) NOT NULL DEFAULT "0" AFTER `catid2` ;
ALTER TABLE `#_content` ADD INDEX (`catid2`);
ALTER TABLE `#_content` ADD INDEX (`catid3`);

Шаг 2 - Добавляем в админке возможность при создании/редактировании материала указывать несколько категорий
Редактируем файл administrator\components\com_content\views\article\tmpl\edit.php
Ищем

form->getInput("catid"); ?>

Добавляем после

form->getInput("catid2"); ?>form->getInput("catid3"); ?>

Редактируем файл administrator\components\com_content\models\forms\article.xml
Ищем

label="JCATEGORY"
class="inputbox" required="true"
>

Добавляем после


>

label="JCATEGORY" description="JFIELD_CATEGORY_DESC"
class="inputbox" required="false" default="0"
>

Шаг 3 - делаем возможность в админке для материалов привязанных к нескольким категориям в столбце Категория показывать все категории, к которым привязан материал
Редактируем файл administrator\components\com_content\views\articles\tmpl\default.php
Ищем

escape($item->category_title); ?>

и заменяем на

escape($item->category_title);
if ($item->category_title2) echo "


".$this->escape($item->category_title2);
if ($item->category_title3) echo "
".$this->escape($item->category_title3);
?>

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

Редактируем файл administrator\components\com_content\models\articles.php
Ищем

// Join over the categories.
$query->select("c.title AS category_title");
$query->join("LEFT", "#__categories AS c ON c.id = a.catid");

и добавляем после:


$query->
$query->
$query->
$query->

$query->where("c.lft >= ".(int) $lft);
$query->where("c.rgt <= ".(int) $rgt);

и заменяем на

$query->where("(c.lft >= ".(int) $lft." AND c.rgt <= ".(int) $rgt.") OR (sister2.lft >= ".(int) $lft." AND sister2.rgt <= ".(int) $rgt.") OR (sister3.lft >= ".(int) $lft." AND sister3.rgt <= ".(int) $rgt.")");

Шаг 4 - Учим Joomla показывать при просмотре материала все категории, за которыми закреплен данный материал.
Редактируем файл components\com_content\models\article.php
Ищем

$query->select($this->getState(


"a.mask, a.catid, a.created, a.created_by, a.created_by_alias, " .

Заменяем на

$query->select($this->getState(
"item.select", "a.id, a.asset_id, a.title, a.alias, a.title_alias, a.introtext, a.fulltext, " .
// If badcats is not null, this means that the article is inside an unpublished category
// In this case, the state is set to 0 to indicate Unpublished (even if the article state is Published)
"CASE WHEN badcats.id is null THEN a.state ELSE 0 END AS state, " .
"a.mask, a.catid, a.catid2, a.catid3, a.created, a.created_by, a.created_by_alias, " .
// use created if modified is 0

// Join on category table.
$query->select("c.title AS category_title, c.alias AS category_alias, c.access AS category_access");
$query->join("LEFT", "#__categories AS c on c.id = a.catid");

Добавляем после

// Join over the categories to get other category titles
$query->select("sister2.title as category_title2");
$query->join("LEFT", "#__categories as sister2 ON sister2.id = a.catid2");
$query->select("sister3.title as category_title3");
$query->join("LEFT", "#__categories as sister3 ON sister3.id = a.catid3");

Редактируем файл components\com_content\views\article\tmpl\default.php
Ищем

$url = "item->catslug))."">".$title."";?>
get("link_category") and $this->item->catslug) : ?>


Заменяем на

$title2 = $this->escape($this->item->category_title2);
$title3 = $this->escape($this->item->category_title3);
$url = "item->catid)) . "">" . $title . "";
$url2 = "item->catid2)) . "">" . $title2 . "";
$url3 = "item->catid3)) . "">" . $title3 . "";
?>
get("link_category")) : ?>
if ($this->item->category_title2) echo ", ".$url2;
if ($this->item->category_title3) echo ", ".$url3;
?>

if ($this->item->category_title2) echo ", ".$title2;
if ($this->item->category_title3) echo ", ".$title3;

Примечание: эту же операцию с файлом default.php необходимо проделать и с используемыми вами шаблонами, если в них есть этот файл. Например его содержит шаблон beez5\html\com_content\article\default.php

Шаг 5 - Учим Joomla показывать при просмотре категории все категории, за которыми закреплены материалы.
Редактируем файл components\com_content\models\articles.php
найти


$query->select(
$this->getState(
"list.select",

"a.catid, a.created, a.created_by, a.created_by_alias, " .

Заменяем на

// Select the required fields from the table.
$query->select(
$this->getState(
"list.select",
"a.id, a.title, a.alias, a.title_alias, a.introtext, " .
"a.checked_out, a.checked_out_time, " .
"a.catid, a.catid2, a.catid3, a.created, a.created_by, a.created_by_alias, " .

// Join over the categories to get parent category titles
$query->select("parent.title as parent_title, parent.id as parent_id, parent.path as parent_route, parent.alias as parent_alias");
$query->join("LEFT", "#__categories as parent ON parent.id = c.parent_id");

Добавляем после

// Join over the categories to get other category titles
$query->select("sister2.title as category_title2");
$query->join("LEFT", "#__categories as sister2 ON sister2.id = a.catid2");
$query->select("sister3.title as category_title3");
$query->join("LEFT", "#__categories as sister3 ON sister3.id = a.catid3");

$categoryEquals = "a.catid ".$type.(int) $categoryId;

Заменяем на

$categoryEquals = "a.catid ".$type.(int) $categoryId." OR a.catid2 ".$type.(int) $categoryId." OR a.catid3 ".$type.(int) $categoryId;

Следующзее изменение добавлено 20.03.2015

$query->where("a.catid ".$type." (".$categoryId.")");

заменяем на

$query->where("a.catid ".$type." (".$categoryId.") OR a.catid2 ".$type." (".$categoryId.") OR a.catid3 ".$type." (".$categoryId.")"); Редактируем файл components\com_content\views\category\tmpl\blog_item.php
найти $url = "item->catid)) . "">" . $title . ""; ?>
get("link_category")) : ?>


Заменить на

$title2 = $this->escape($this->item->category_title2);
$title3 = $this->escape($this->item->category_title3);
$url = "item->catid)) . "">" . $title . "";
$url2 = "item->catid2)) . "">" . $title2 . "";
$url3 = "item->catid3)) . "">" . $title3 . "";
?>
get("link_category")) : ?>
if ($this->item->category_title2) echo JText::sprintf("COM_CONTENT_CATEGORY", $url2);
if ($this->item->category_title3) echo JText::sprintf("COM_CONTENT_CATEGORY", $url3);
?>

if ($this->item->category_title2) echo JText::sprintf("COM_CONTENT_CATEGORY", $title2);
if ($this->item->category_title3) echo JText::sprintf("COM_CONTENT_CATEGORY", $title3);

Примечание: эту же операцию с файлами blog_item.php необходимо проделать и с используемыми вами шаблонами, если в них есть этот файл. Например его содержит шаблон beez5\html\com_content\category\blog_item.php

Шаг 6 - добавляем возможность указания нескольких категорий в fronted редакторе (если нужно)
Редактируем файл components\com_content\models\forms\article.xml
Ищем

id="catid"
name="catid"
type="categoryedit"
extension="com_content"
label="JCATEGORY"
description="JFIELD_CATEGORY_DESC"
class="inputbox"
required="true">

Добавляем после

id="catid2"
name="catid2"
type="categoryedit"
extension="com_content"
label="JCATEGORY"
description="JFIELD_CATEGORY_DESC"
class="inputbox"
default="0"
required="false">


id="catid3"
name="catid3"
type="categoryedit"
extension="com_content"
label="JCATEGORY"
description="JFIELD_CATEGORY_DESC"
class="inputbox"
default="0"
required="false">

Редактируем файл components\com_content\views\form\tmpl\edit.php
найти

form->getInput("catid"); ?>

заменить на

form->getInput("catid"); ?>form->getInput("catid2"); ?>form->getInput("catid3"); ?> Всё, теперь можно работать.

Как я и обещал, начиная с этой статьи, мы будем знакомиться с различными типами меню в Joomla . И начнём мы с самого первого - это "Список материалов в архиве ".

Если Вы не знаете, то прочитайте сперва соответствующую статью про это. Так же, если Вы не знаете, то тоже сначала надо про это прочитать.

Теперь же давайте приступим к разбору типа меню - "Список материалов в архиве ":

Различные настройки слева мы с Вами уже рассматривали в статье: . А вот параметры, находящиеся справа, различаются в зависимости от типа меню. И сейчас мы с Вами познакомимся с параметрами для "списка материалов в архиве ":

Как мы видим, имеются три блока. Начнём с блока: "Параметры - Основные ":

  • Порядок . Здесь из выпадающего списка надо выбрать вариант сортировки материалов при их выводе на страницу.

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

  • Показывать ссылки на закрытый контент . Есть ссылки, которые открыты только для зарегистрированных пользователей (думаю, Вы такое часто встречали). И вот этой опцией можно показывать все посетителям, что ссылки существуют, и выводить их. Однако, если посетитель не авторизован, то он всё равно перейти по ссылке не сможет - его попросят сначала авторизоваться.
  • Показать текст заголовка . Показывать или нет названия статей.
  • Заголовок как ссылка . Отображать заголовок простым текстом или в виде ссылки на статью.
  • Показывать вступительный текст . Эта настройка позволяет выводить вступительный текст материалов на страницу.
  • Название раздела . Отобразить или спрятать название раздела, которому принадлежит статья.
  • Название раздела как ссылка . Отображать название раздела ссылкой или обычным текстом.
  • Название категории . Показать или нет название категории, которой принадлежит статья.
  • Название категории как ссылка . Показывать название категории как ссылку или простым текстом.
  • Имя автора . Показывать или нет автора статьи.
  • Дата и время создания . Выводить дату и время создания статьи или, наоборот, не выводить.
  • Дата и время последнего изменения . Выводить или нет дату и время последнего изменения статьи.
  • Показывать навигацию . Показывать содержание статьи или нет. Имеются ввиду материалы, которые состоят из нескольких страниц.
  • Ссылка подробнее . Если поставить "Показать " и у материала есть основной текст, то появится эта ссылка. Если хотя бы одно из условий не выполняется, то ссылка "Подробнее " не отобразится.
  • Голоса/Рейтинг статьи . Показать рейтинг статьи, а также дать возможность пользователям ставить ей оценку.
  • Иконки . Показывать иконки печати, PDF и E-mail или же нет.
  • Иконка PDF . Показать или спрятать иконку PDF .
  • Иконка печати . Показать или спрятать иконку вывода версии для печати статьи.
  • Иконка E-mail . Вывести иконку для возможности отправки статьи по E-mail другу, или же, наоборот, не выводить.
  • Хиты . Показать или спрятать количество просмотров статьи.
  • Показывать в RSS . Тут можно выбрать либо показывать только вступительный текст, либо только основной. Дело вкуса, но советую показывать только вступительный, чтобы человек, подписанный на Вашу RSS-ленту , пришёл на Ваш сайт дочитать статью.

Третий и последний блок - это "Параметры - Система ":

  • Заголовок страницы . Очень важная опция, в которой Вам надо поставить значение тега <title > на странице, куда будет вести пункт меню.
  • Показывать заголовок страницы . Показывать или нет заголовок страницы не только в теге <title >, но уже непосредственно и в контенте сайта.
  • Суффикс класса страницы . Если Вы хотите сделать индивидуальный дизайн, то для предупреждения путаницы с другими CSS-классами , Вам надо указать уникальный суффикс, который Вы будете использовать при оформлении страницы.
  • Картинка меню . Здесь можно выбрать картинку, которая будет располагаться рядом с названием пункта меню.
  • SSL включено . Эта опция определяет: нужно ли требовать при переходе по этой ссылке защищённого соединения. В большинстве случаев, надо оставлять "Игнорировть ".

Вот и рассмотрены нами все настройки при создании пункта меню типа: "Список материалов в архиве ". В следующей статье я продолжу описывать этот процесс, но уже с другими типами меню Joomla .

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

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

Примечание : Так же в рамках данной статьи будет рассмотрен обычный сайт, без учета влияния перелинковки материалов контекстными ссылками и прочими механизмами. Это обеспечит более простое понимание самой сути множественных колец.

Примечание : Данная идея была встречена на форуме MaulTalk. Но, отсутствие каких-либо реализаций в интернете (по крайней мере в поисковиках ничего подобного не встретилось) привело как к реализации модуля, так и к написанию этой статьи.

А теперь, чуть более простым и понятным языком.

Немного о самой кольцевой перелинковке

Перелинковку можно организовать разными методами: большим количеством ссылок на продвигаемую страницу, связью "снизу-вверх"/"сверху-вниз", хаотично проставленными ссылками, кольцом, кубом и многими другими методами. Каждый из этих методов преследует свои цели, и нельзя сказать, что какой-то из них лучше или хуже. Все зависит от задачи.

В данном случае, основной интерес сосредоточен на кольцевой перелинковке, так как она дает достаточно много плюсов:

  1. Равномерное перераспределение веса. Т.е. весь внутренний вес и вес, который приходит с других сайтов, планомерно распределяются между всеми материалами. При перерасчете веса, каждый добавленный материал будет намного быстрее набирать собственный вес
  2. Все добавленные материалы как минимум имеют ссылки с нескольких других страниц сайта. Т.е. даже если поисковая система не добралась до этих материалов, или просто не захотела их включать в индекс, остается вероятность, что заголовок может привлечь посетителя, и материал не останется без внимания
  3. Простота понимания, даже при большом количестве материалов вы будете знать ответы на вопросы "что? куда? зачем?"
  4. Упорядоченность. Не секрет, что любые блоки со ссылками видят не только поисковые системы, но и посетители (И иногда даже щелкают по этим ссылкам). А это значит, что потенциально вы можете провести их по всем материалам сайта, с какой бы станицы не стартовал посетитель
  5. Связанность релевантных материалов. Отсутствия жесткого требования к порядку организации ссылок. Располагайте рядом наиболее ожидаемые материалы, а не те, которые требует схема

Конечно, у данного метода есть свои проблемы. Но, есть и свои решения.

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

Достаточно часто в статьях "Как правильно оптимизировать ваш сайт" / "Используем перелинковку" / и т.д., употребляется такое слово как "кольцо". Суть метода достаточно проста. Страницы ссылаются таким образом, что образуют кольцо (см. рисунок ниже).

С другой стороны, у такого механизма есть несколько проблем. Две достаточно небольшие и одна большая. Небольшие - это управляемость в общем виде и включение новых материалов в кольца. Большая - выпадение из индекса одного из материалов. В случае управляемости, речь больше идет о технической стороне, т.е. по какому принципу организуется кольцо, и какие необходимы условия, чтобы материал был добавлен. В случае включения новых материалов, речь идет о действиях автора, т.е. что необходимо сделать, чтобы материал был добавлен в кольцо.

Если проблемы управляемости и включения материалов решаемы собственными силами, то для случае выпадения из индекса не все так просто. Как только одна их страниц выпадает, кольцо разрывается (См. рисунок).

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

Но, попробуйте представить, что выпала не одна страница, а несколько. Да, еще и материалов на сайте стало достаточно много. Найти все выпавшие страницы будет уже не так просто. Да, и не факт, что вы сможете оперативно обнаружить выпадение страниц.

Что же делать?

И именно тут возникает мысль. А что если сделать не одно, а несколько колец из материалов? Да, и сделать это так, чтобы не заставлять автора статьи бегать по всему списку материалов в поисках "Куда же эти ссылки вставить?", а возложить эти обязанности на сам сайт.

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

Не смотря на то, что материал "Мат. 35" выпал, остальные кольца все же сохранились (синие стрелки показывают на как минимум одно сохранившееся кольцо).

Такая перелинковка будет не только минимизировать риск потери веса при выпадении страниц, но и оставаться управляемой. Вы всегда сможете сказать "куда и как" будет ссылаться материал. При этом добавление и удаление материалов с сайта, будет оставаться предсказуемым и происходить без участия автора.

Практика - Множественная кольцевая перелинковка материалов категории

На практике оказалось, что не все так просто. Давайте рассмотрим наиболее известные модули и плагины (без названий, только механизмы).

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

Существуют модули в стиле "Похожие статьи", которые, в основном, полагаются на метатеги. И чаще всего это keywords. Этот механизм очень сильно смахивает на обычное облако тегов. И даже, если не думать об этом, и быть готовым наполнить keywords, то стоит взглянуть в настройки, и вам станет все ясно. В основном, речь идет либо о красивом выводе превьюшек, либо о множественной фильтрации и сортировке. Организовать таким способом кольцо - нереально.

Существуют плагины "Следующие/Предыдущие". Их основная задача "провести пользователя от и до". Такие плагины организуют лишь цепочку от начала до конца. Первый и последний материалы не будут ссылаться друг на друга. Поэтому кольцо построить нет возможности.

Примечание : Факт, но, к сожалению, в стандартной комплектации Joomla 2.5 выводить заголовки статей в плагине "Контент - Навигация по страницам" нельзя.

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

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

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

Примечание : Возможно, под эти цели существуют специальные инструменты, но, к сожалению, они так и не нашлись.

Примечание : Конечно, ручным способом все же кольца можно создать, но представьте сколько сил от вас будет требовать не только добавление, но и отслеживание, что кольцо нигде не разорвалось.

Пишем свой модуль множественной перелинковки кольцами

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

Первое с чего необходимо начать - это придумать название. Не очень сильно мудрствуя, назовем модуль "Кольцевая перелинковка материалов категории". Техническое же имя будет "mod_circle_link_mat_by_cat".

Следующее, что необходимо сделать, это составить стандартную структуру файлов.

  • css
    • mod_circle_link_mat_by_cat.css
    • index.html
  • language
    • ru-Ru
      • mod_circle_link_mat_by_cat.ini
      • mod_circle_link_mat_by_cat.sys.ini
      • index.html
    • index.html
  • tmpl
    • default.php
    • index.html
  • helper.php
  • index.html

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

  • index.html - пустой файл, который находится во всех каталогах, включая основной каталог модуля
  • mod_circle_link_mat_by_cat.php - точка входа модуля. Этот файл будет запускаться первым при запуске модуля, и он же будет запускать остальные файлы (кроме языков и файла настройки)
  • mod_circle_link_mat_by_cat.xml - файл конфигурации, который включает все мета-настройки модуля. В данном случае используются:
    • название модуля и его описание
    • файлы, которые нужно скопировать
    • различные параметры, которые будут выведены в административной панели
    • подключение локализации
  • mod_circle_link_mat_by_cat.css - файл со стилями. Он пустой, и создан только с одной целью, чтобы в последствие, при подгонке стилей под ваш сайт (если таковое потребуется), вам не надо было смешивать общие стили сайта со стилями модуля
  • mod_circle_link_mat_by_cat.ini - файл локализации
  • mod_circle_link_mat_by_cat.sys.ini - файл локализации
  • default.php - шаблон отображения. Используется для генерации html-кода, который будет отображаться внутри блока с модулем
  • helper.php - в этот файл будут выноситься все необходимые функции для получения данных

Файл конфигурации - mod_circle_link_mat_by_cat.xml

Файл конфигурации имеет достаточно простую и понятную структуру. Вначале идет описание самого модуля, включая такие поля как автор и описание. Затем в теге "files" перечисляется структура файлов и папок, которую необходимо скопировать при установке. После чего следует тег "languages" с информацией о месторасположении файлов локализации в модуле. Ну и под конец, идет секция "config", в которой определяются необходимые параметры.

Если все секции, кроме "config", содержат чисто технический характер, и их можно просто скопировать, то для секции с параметрами необходимо добавить небольшое пояснение.

  • isMain - это чекбокс, который запрещает вывод данных на главной странице. По умолчанию включен
  • exceptCat - строка, в которой через запятую перечисляются все ID категорий, для которых модуль не должен выводить ссылки. Например, категория "Uncategorised". По умолчанию, поле пустое
  • prev_mat_number - количество предыдущих материалов (с учетом кольца), которые необходимо вывести. По умолчанию, значение 3
  • next_mat_number - количество следующих материалов(с учетом кольца), которые необходимо вывести. По умолчанию, значение 3

Примечание : Различные имена в виде "MOD_CIRCLE_MAT_BY_CAT_ISMAIN" - это константы, которые будут взяты из файлов локализации.

Кольцевая перелинковка материалов категории FBT 1.0.0 27 Июня 2014 mod_circle_link_mat_by_cat.xml mod_circle_link_mat_by_cat.php index.html helper.php tmpl css language ru-RU/ru-RU.mod_circle_link_mat_by_cat.ini ru-RU/ru-RU.mod_circle_link_mat_by_cat.sys.ini

Точка входа модуля - mod_circle_link_mat_by_cat.php

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

В данном случае из ресурсов нужен только роутинг для корректного составления ссылок. Все остальное уже подключено.

Получение данных - это достаточно объемная задача. Именно поэтому она была вынесена в отдельный файл helper.php. В текущем файле только вызов функции "получить список". Ну, и в самом конце, вызов шаблона для составления html-кода. Каких-то особых сложностей здесь нет.

addStylesheet(JURI::root(true) . "/modules/".$module_name."/css/".$module_name.".css"); // Параметры $prevCount = $params->get("prev_mat_number"); $nextCount = $params->get("next_mat_number"); $idMat = JRequest::getVar("id",""); $idCat = $helper->getSection($idMat); // Проверка для главной страницы $menu = &JSite::getMenu(); // Исключаемые категории $exceptCat = explode (",", $params->get("exceptCat")); $isInExceptCat = false; // Проверяем категорию на исключенность $countExceptCat = count ($exceptCat); for($i = 0; $i < $countExceptCat; $i++) { if ((int) $exceptCat[$i] == $idCat) { $isInExceptCat = true; break; } } // Проверяем параметры if(!$isInExceptCat && ($params->get("isMain") != "1" or $menu->getActive()!= $menu->getDefault())) { // Получаем список $showList = $helper->getList($idMat, $idCat, $prevCount, $nextCount); // Выводим через шаблон require (JModuleHelper::getLayoutPath($module_name, $params->get("layout", "default"))); } ?>

Файлы локализации - mod_circle_link_mat_by_cat.ini

Файлы локализации строятся простым способом. Перечислением пар "ключ" = "значение". Каких-то сложных мест тут нет.

Примечание : Настоятельно рекомендуем, при составлении имен использовать уникальные имена ключей, чтобы случайно не пересечься с другими локализациями. Например, при составлении вы можете использовать конструкцию "{ИМЯ_МОДУЛЯ} + _ + {КЛЮЧ}".

Файл mod_circle_link_mat_by_cat.ini

MOD_CIRCLE_MAT_BY_CAT="CircleLinkByCat" MOD_CIRCLE_MAT_BY_CAT_PREV_MAT_LBL="Кол-во пред. материалов" MOD_CIRCLE_MAT_BY_CAT_PREV_MAT_LBL_DESC="Укажите желаемое количество предыдущих материалов" MOD_CIRCLE_MAT_BY_CAT_NEXT_MAT_LBL="Кол-во след. материалов" MOD_CIRCLE_MAT_BY_CAT_NEXT_MAT_LBL_DESC="Укажите желаемое количество следующих материалов" MOD_CIRCLE_MAT_BY_CAT_ISMAIN="Исключить главную" MOD_CIRCLE_MAT_BY_CAT_ISMAIN_DESC="Если вы не хотите, чтобы модуль подключался на главной странице, то выставьте пункт в значение ДА" MOD_CIRCLE_MAT_BY_CAT_EXCEPTCAT="Исключить категории" MOD_CIRCLE_MAT_BY_CAT_EXCEPTCAT_DESC="Если на вашем сайте существуют категории, которые необходимо исключить, то введите их ID через запятую"

Файл mod_circle_link_mat_by_cat.sys.ini

MOD_CIRCLE_MAT_BY_CAT="Кольцевая перелинковка материалов категории"

Шаблон отображения - default.php

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

0) { ?>

Составляем хэлпер - helper.php

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

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

Код для получения предыдущих статей:

/* получаем предыдущие статьи */ select id, link, title, access, alias, 0 as afterCircle from (select * from (select id, "" as link, title, access, alias from #__content where /* все предыдущие статьи в категории в опубликованном состоянии */ catid = ".$idCat." and id < ".$idMat." and state > 0 /* дата публикации не закончилась */ and (publish_down is null or publish_down > < NOW()) /* нужно получать с конца списка */ order by id desc limit 0,".$prevCount.") sort order by id asc) a union /* получаем данные для случая, если предыдущих статей меньше, чем надо */ select id, link, title, access, alias, 1 as afterCircle from (select * from (select id, "" as link, title, access, alias from #__content where /* все последующие статьи в категории в опубликованном состоянии */ catid = ".$idCat." and id > ".$idMat." and state > 0 /* дата публикации не закончилась */ and (publish_down is null or publish_down >= NOW()) /* материал опубликован */ and (publish_up is null or publish_up < NOW()) /* нужно получать с конца списка */ order by id desc limit 0,".$prevCount.") sort order by id desc) b

Запрос может показаться несколько сложным и большим, но на самом деле все очень просто. Первая часть, до union, выбирает из всех материалов только предыдущие для данной статьи. Вторая часть, после union, нужна для получения последних материалов. Т.е. как бы продолжается поиск материалов по кольцу.

Пример . Допустим, в категории есть 5 материалов:

  • А - Б - В - Г - Д.

Для простоты, они следуют друг за другом в алфавитном порядке. И вы хотите вывести два предыдущих материала для статьи "Б". В таком случае, предыдущими статьями являются как "А", так и "Д" (так как "Д" является последним материалом). Материал "А" найдется первой частью запроса, а "Д" найдется второй частью запроса.

Для получения следующих материалов, SQL-запрос отличается только проверками и порядком сортировок. Сам код:

/* получаем следующие статьи */ select id, link, title, access, alias from (select * from (select id, "" as link, title, access, alias from #__content where /* все следующие статьи в категории в опубликованном состоянии */ catid = ".$idCat." and id > ".$idMat." and state > 0 /* дата публикации не закончилась */ and (publish_down is null or publish_down >= NOW()) /* материал опубликован */ and (publish_up is null or publish_up < NOW()) /* нужно получать с начала списка */ order by id asc limit 0,".$nextCount.") sort order by id asc) a union /* получаем данные для случая, если следующих статей меньше, чем надо */ select id, link, title, access, alias from (select * from (select id, "" as link, title, access, alias from #__content where /* все предыдущие статьи в категории в опубликованном состоянии */ catid = ".$idCat." and id < ".$idMat." and state > 0 /* дата публикации не закончилась */ and (publish_down is null or publish_down >= NOW()) /* материал опубликован */ and (publish_up is null or publish_up < NOW()) /* нужно получать с начала списка */ order by id asc limit 0,".$nextCount.") sort order by id asc) b

Как видите, основное отличие только в обратном порядке поиска и сортировки данных.

Если рассматривать, пример, то для статьи "Г" двумя последующими материалами являются: "Д" и "А" (так как "А" является первым в списке).

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

// Для всех полученных элементов добавляем link if(count($showList) > 0) { $countShowList = count ($showList); for ($i = 0; $i < $countShowList; $i++) { /* Получаем пункт меню */ $itemid = &JSite::getMenu()->getItems("link", "index.php?option=com_content&view=article&id=".($showList[$i]->id), true); /* Если пункт меню существует, то формируем ссылку для него */ if(!empty($itemid)) { $showList[$i]->link = JRoute::_("index.php?Itemid=".$itemid->id); } /* Если пункта меню не существует, то формируем ссылку с учетом SEF */ else { /* Получаем пункт меню для категории */ $catitemid = JSite::getMenu()->getItems("link", "index.php?option=com_content&view=category&id=".$idCat, true); /* Если пункт меню существует, то формируем ссылку для него */ if(!empty($catitemid)) $showList[$i]->link = JRoute::_("index.php?option=com_content&view=article&id=".($showList[$i]->id).":".($showList[$i]->alias)."&catid=".$idCat."&Itemid=".$catitemid->id); /* Если пункта меню не существует, то формируем ссылку с учетом SEF */ else $showList[$i]->link = JRoute::_("index.php?option=com_content&view=article&id=".($showList[$i]->id).":".($showList[$i]->alias)."&catid=".$idCat); } } }

Вся загвоздка заключается в том, что при обращении к материалу через пункт меню, для него формируется совершенно другая ссылка (это часто применяемый способ, чтобы избавиться от ID материала в Url). При этом важно, чтобы в конструкции "JRoute::_("index.php?Itemid=".$itemid->id)" параметр "Itemid" писался с учетом регистра. Если вы напишите не "Itemid", а "itemid", то на выходе вы получите страшного вида ссылку. С чем это связано? Сложно сказать, но факт остается фактом, параметр регистрозависимый.

Теперь все, что нам осталось, это заархивировать файлы в Zip-архив. Для этого можете использовать бесплатные архиваторы . И все, модуль готов!

Устанавливаем и настраиваем полученный модуль

После всех проделанных трудов, осталось установить и настроить модуль.

Установка достаточна проста. Все что вам нужно - это открыть "Менеджер расширений" и загрузить архив с модулем.

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

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

Теперь необходимо настроить модуль. Щелкаем левой кнопкой мыши на модуле. И переходим к настройке.

Первым делом необходимо настроить основные параметры, а именно: указать позицию модуля, изменить состояние на "опубликовано" и определиться с вопросом "Будете ли вы выводить название модуля?".

Теперь необходимо перейти к настройке стандартного блока "Привязка к пунктам меню". Сама настройка ничем не отличается от настройки любого другого модуля. В данном случае был выбран пункт "На всех страницах".

Со стандартными параметрами закончено. Производим настройку параметров самого модуля. Указываем будет ли модуль отображаться на главной. Перечисляем исключаемые категории. Например, указываем ID категории "Uncategorised" (для каждого сайта данная категория может иметь разный ID, поэтому вначале зайдите в "менеджер категорий" и найдите нужную). Выбираем количество предыдущих и следующих материалов.

Рейтинг 4.83 (9 Голосов)


В очередном, 42 уроке создания сайта Joomla, посмотрим, для чего нужен модуль, как создать и как настроить модуль «Список материалов категории».

Для чего нужен

Рассматриваемый модуль относится к группе модулей «Материалы». Всего в этой группе 6 модулей.

Модуль «Список материалов категории» нужен для показа на сайте в любой позиции для модулей, списка статей (материалов) из выбранной категории или несколько выбранных категорий.

Каталог модуля

Папка с этим модулем носит название . В его каталоге лежат:

  • Каталог tmpl ;

Файлы helper.php; mod_articles_category.php; mod_articles_ category.xml .

Сам каталог вы найдете в каталоге .

Как создать

Чтобы создать модуль Список материалов категории пройдите простые шаги:

  • Авторизуйтесь в административной части сайта с правами необходимыми для создания модулей. Например, суперадминистратор;
  • Из верхнего меню войдите на вкладку «Модули»;
  • На странице со списком уже созданных модулей нажмите кнопку «Создать». Она зеленого цвета;
  • В списке модулей выберете модуль с названием «Материалы - Список материалов категории»;
  • Заполните настройки модуля, выберете позицию модуля на сайте и сохраните его;
  • После чистки кэша (если вы его используете), модуль будет виден на сайте в указанной позиции.

Настройки

Посмотрим настройки нашего модуля. Они несложные. На вкладке создания модуля 8 вкладок :

Модуль; Привязка к пунктам меню; Параметры фильтрации, сортировки, группировки, отображения; Дополнительные параметры; Права доступа.

Модуль

Интересная настройка, имеющая два параметра режима отображения:

  • Обычный: Модуль просто создается и показывается, где указано;
  • Динамичный: При таком режиме, система сама принимает решение, где показывать этот модуль.

Привязка к пунктам меню

В данной настройке указываем, на каких страницах сайта показывать данный модуль. Выбор делается по пунктам созданных меню сайта.

Например, чтобы показать модуль ТОЛЬКО на главной странице, нужно выбрать Привязку модуля - «Только на указанных страницах» и выбрать из списка меню главную страницу.

Параметры фильтрации

class="eliadunit">

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

Также есть возможность убрать из списка «Избранные материалы», включить или убрать дочерние категории, указать количество статей в списке.

Сортировка

Параметров сортировка ранжируют список материалов по заголовку и еще 9 вариантам. Можно указать прямую или обратную сортировки.

Группировка

При желании можно сгруппировать материалы по году, месяцу, авторам или категориям (если их несколько).

Параметры отображения

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

При желании вы можете дополнить список датой выхода материала, категорией, количеством просмотров, автором, вводным текстом, ссылкой «Подробнее».

Дополнительные параметры

Здесь вы можете поменять внешний вид модуля, указав свои, заранее загруженные стили модуля (пункт Суффикс CSS-класса модуля) или использовать один из системных стилей модулей (пункт Стиль модуля).

Параметр «Размер Bootstrap» разобьёт список на колонки. Значение «0» нет колонок.

Права

Если ваш сайт многопользовательский, то нужно выставить права пользователей по вашей схеме прав на управление сайтом.

После настроек не забываем проверить на вкладке «Модуль» позицию модуля, показать или скрыть его название, которое обязательно, написать для себя примечание.

Вывод

В этой статье вы посмотрели последний модуль из группы «Материалы» под названием Список материалов категории Joomla сайта.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: