Сегодня хотел бы поделиться с вами информацией о том, как в джумле работать с модулями. Модули — это такие функциональные части сайта, где вы можете добавлять либо статическую информацию, либо динамический скрипт, который сами напишите. Проще говоря, модули выводятся по определенным, вами установленным правилам и в нужных именно вам местах.
Все модули прописываются в шаблоне, то есть в файле index.php. Стили модулей также прописываются в той же директории шаблона, в файле template.css. Но прописать в шаблоне модуль недостаточно, чтобы он заработал так как вам нужно. Допустим вы хотите чтобы этот модуль выдавался только на главной, а вот тот модуль выдавался в блоге или еще каком-то разделе сайта.
«Джумла изначально была достаточно непростой в самостоятельном освоении системой»
Джумла изначально была достаточно непростой в самостоятельном освоении системой. Разработчики установили некоторые существенные ограничения, из-за которых очень часто возникают проблемы, решение которых требует времени и знаний. Например, в стандартной сборке джумлы нельзя в материалы вставлять php-код. Для того чтобы открыть эту возможность нужно ставить специальный плагин Sourcer, но об этом расскажу в другой раз.
Вернемся к модулям, мы как грамотные вебмастера для начала заходим в админпанель джумлы, в раздел модулей (Расширения>Модули) и создаем там новый блок модуля с уникальным идентификатором и названием. Старайтесь создавать говорящие идентификаторы всегда, потому что через полгода крайне сложно вспомнить почему вы именно так назвали какой-то конкретный модуль. А если он называется back_and_up_button, сразу понятно за что отвечает данный модуль.

Затем выбирайте тот тип модуля, который вам нужен. Выберем, например Модуль «Материалы — Самые читаемые». Затем важное — это создать уникальный идентификатор вашего модуля. Именно он и будет отвечать за вывод модуля в шаблоне. Для создания просто впишите его в поле «ПОЗИЦИЯ».

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

Теперь нужно прописать модуль в сам шаблон, т.е. в файл index.php. Ищите по верстке куда вы хотели бы вставить данный модуль и вставляйте строку.
<jdoc:include type=»modules» name=»supermodul» style=»container» />
Не забывайте, что supermodul, это идентификатор, который мы придумали и когда придумаете свой, они должны совпадать с тем, что вы написали в джумле и то что вставили в файл index.php.

А вот теперь начинается самое интересное, ради чего и стоило прочитать мою статью. Все успешно выводится, но почему-то нет заголовка модуля? Или что-то еще показывается не так? Кривой шаблон возможно. Логически понимаем, что есть какой-то еще шаблон именно модуля, и лежит он здесь:
/корень сайта/modules/mod_articles_popular/tmpl/default.php
Править нужно его. Добавлять туда, что вам хочется добавить к модулю, сверх имеющегося оформления или функционала. Добавим туда заголовок, которого почему-то у меня не появлялось.

Стили h1 в классе mostread поправить или создать очень просто. Открываем template.css и там оформляем так как нам необходимо, паддинги расставляем, размеры шрифтов и тому подобная дребедень, чтобы выглядело красиво.

После всех этих манипуляций вы научитесь создавать свое собственное оформление и функционал модулей в джумле. Все примеры и скриншоты которые вы видели применены на моем сайте и успешно работают.
Таким методом можно создать какие угодно сложные модули. Добавлять оформление к уже имеющимся, дорабатывать их, или создавать свои собственные. Конечно, все это не имеет никакого отношения к официальному коммунити джумлы и они наверняка это порицают. У них есть кодекс, который нужно чтить, но обычным вебмастерам, которым важен результат вполне пригодится и мой опыт по редактированию, созданию и настройке модулей.
Модули являются неотъемлемой и очень важной частью CMS Joomla. Эта статья представляет максимально подробное руководство по модулям Joomla. Я постарался собрать и структурировать в ней всю информацию о модулях, а также мои знания и опыт.
Данная статья будет полезна как новичкам, так и профессионалам в Joomla. Новички смогут найти в ней ответы на любые вопросы, связанные с модулями, а профессионалы проверят свои знания.
Добро пожаловать в мега-статью, посвященную модулям Joomla.
Содержание
- Что такое модули Joomla
- Стандартные модули Joomla
- Как установить модуль
- Сколько модулей может быть на странице
- Управление модулями Joomla
- Просмотр модулей Joomla
- Настройка модулей Joomla
- Позиции модулей
- Порядок модулей
- Связь модулей и пунктов меню. Вывод модулей на отдельных страницах
- Вывод модулей Joomla в разных частях сайта
- Как добавить позицию модуля в шаблон
- Как вставить модуль в материал Joomla
- Вставка модуля в компонент Joomla
- Вывести модуль в модуле Joomla
- Advanced Module Manager – вывод на страницах, не привязанных к пунктам меню
- Ограничение на просмотр модулей
- Кэширование модулей
- Оформление модулей
- Суффикс класса модуля
- Стиль позиции модуля
- Макет модуля
- Альтернативный макет модуля
- Разработка модуля Joomla
- Модули Joomla и com_ajax
- Когда не стоит использовать модули
- Модуль с уникальной информацией для страницы каталога или интернет-магазина
- Модули html-кода в материалах Joomla
- Модули для текста (или меню) в несколько колонок
- Где скачать модули Joomla
- Бесплатные модули Joomla от Wedal.ru
Модули Joomla – один из основных видов расширений этой CMS. Наряду с модулями, существуют также компоненты, плагины и шаблоны. Модули – это, определенно, одна из причин использовать Joomla для создания сайта.
Модули представляют собой блоки с какой-либо информацией, встраиваемые в шаблон, контент и другие места на сайте. Давайте посмотрим примеры модулей на сайте wedal.ru:
Все зеленые блоки – модули Joomla. Синий блок – компонент Joomla.
Модули могут встраиваться практически в любую часть сайта, а потому новичкам, да и иногда даже профессионалам, бывает сложно сходу понять, модуль перед ним или нет.
Ровно по этой же причине я не буду давать четкое определение модулей. Скажу лишь, что модули используются, когда нужно показать какую-то общую информацию на каких-то отдельных страницах сайта.
Чтобы чуть лучше понять предложение выше, предлагаю вернуться в школьные годы, и немного вспомнить алгебру. Предположим, у нас есть, прости господи, многочлен вида:
a*x1 + a*x2 + b*x3 + b*x4
Давайте представим, что x1, x2, x3, x4 – разные страницы сайта с разным контентом, например, статьи. А a и b – это какой-то повторяющийся контент, который должен быть на этих страницах. Пусть a – это набор картинок, а b – большая таблица с данными.
С одной стороны, мы можем создать 4 страницы с контентом и вставить в редакторе на двух из них одинаковые наборы картинок и на двух других – одинаковые таблицы. Это будет работать. И это как раз будет иллюстрировать формулу, которую я написал выше. Но есть одна проблема.
Что если нам понадобится изменить одну из картинок или информацию в таблице? Придется открывать каждую статью, где они встречаются, и вручную изменять ее содержимое. Хорошо, если таких статей всего 4, как в примере. А если их 40? 400? Становится не очень весело.
Какое есть решение? А давайте запишем нашу формулу в виде:
a*(x1+x2) + b*(x3+x4)
Мы выносим повторяющийся контент страницы в отдельный блок, который страница при создании будет подгружать. В данном случае a и b как раз и будут модулями Joomla. Теперь, если нам понадобится изменить картинку или данные таблицы, мы можем один раз открыть соответствующий модуль и внести правку. После этого изменения автоматически появятся на всех страницах, где этот модуль выводится.
В этом и заключается основной смысл модулей.
Стандартные модули Joomla
Чтобы еще лучше разобраться с тем, что такое модули, давайте посмотрим на те из них, которые будут доступны сразу после установки Joomla. Посмотрите картинку:
Стандартный набор охватывает практически весь типовой функционал. Здесь есть:
- Вставка html-кода
- Меню
- Форма авторизации
- Список статей/категорий/тегов
- Хлебные крошки
- Поиск
Если вы видите что-то из вышеперечисленного на сайте, то с вероятностью 99% перед вами модуль Джумла.
Самую большую часть набора представляют модули вывода материалов. Не все из них идеальны, но большинство вполне годные.
Конечно, вы совсем не обязательно должны использовать стандартные модули Joomla. Никто не запрещает найти что-то более интересное или подходящее под текущую задачу в каталоге расширений Joomla.
Как установить модуль
Если вы хотите установить дополнительный модуль в Joomla, первым делом вам нужно скачать архив с ним. Чаще всего модули, как и другие расширения Joomla, поставляются в виде отдельных архивов с расширением .zip .
Когда вы скачали такой архив, в админке нужно перейти в Расширения –> Менеджер расширений –> Установка, убедится, что активна вкладка Загрузить файл пакета, и, собственно, выбрать файл модуля у себя на компьютере. Что может быть проще?
Также есть два альтернативных варианта установки модуля.
- Установить модуль прямо из Интернета, перейдя на вкладку Установить из URL, и указать ссылку на файл модуля.
- Перейти на вкладку Установить из JED, найти подходящий модуль и воспользоваться кнопкой установки.
И хотя этот вариант установки из JED кажется наиболее простым и логичным, я не рекомендую вам его использовать. Случается, что при прямой установке из JED вы получаете далеко не самую свежую версию модуля. Лучше все-таки лично посетить JED (каталог расширений Joomla), подобрать там модуль, а затем перейти на сайт разработчика и скачать его уже там.
В целом же установка модулей Joomla очень проста. С ней легко справится даже новичок.
Сколько модулей может быть на странице
Последнее, о чем хочется поговорить во вводной части – допустимое количество модулей на сайте.
Освоить модули легко. Установить еще легче. Если вы только недавно познакомились с Joomla, то можете словить эйфорию от работы с ними. Не поддавайтесь ей.
Если вы подбираете для сайта интересный модуль, делайте это на тестовом сайте. Не устанавливайте на боевой сайт всё подряд. Это может аукнуться когда-нибудь в будущем.
Другой вариант – веб-мастер делает на модулях весь сайт, вообще забывая про компоненты. За время работы мне доводилось видеть несколько проектов, на которых использовались сотни модулей (нет, не уникальных, но экземпляров какого-нибудь одного, например html-кода). Бывают редкие случаи, когда такое количество модулей оправдано, но это должен быть очень большой проект с очень сложным дизайном.
В основном 50 модулей на сайте – это максимум, после которого вы должны задуматься, о том, что что-то делаете не так. Если у вас большой и сложный сайт (сильно больше и сложнее, чем wedal.ru), то умножьте эту цифру на два.
Для обычных информационных сайтов или интернет-магазинов норма 10-30 модулей (включая экземпляры одного модуля).
Управление модулями Joomla
Управление модулями Joomla с одной стороны очевидное, но с другой стороны содержит очень много тонкостей, о которых важно помнить. Далее мы рассмотрим их.
Прежде всего, нужно понимать, чем отличается уникальный модуль от экземпляра модуля.
Уникальный модуль – такой, который устанавливается, как отдельное расширение и занимает отдельную папку в Joomla.
Экземпляр модуля – отдельно хранящаяся (в базе данных) конфигурация уникального модуля.
Чтобы было проще понять, давайте рассмотрим такой пример. Предположим, у нас на сайте есть слайдеры на двух разных страницах. Сами (функционально) они одинаковые, но должны иметь разный контент. Например, в одном слайдере две картинки, а в другом три другие. Также первый прокручивается автоматически, а второй нет.
В случае с Joomla оба слайдера можно реализовать через один и тот же уникальный модуль, но при этом в админке будет создано два его экземпляра, в которых будут загружены разные изображения и заданы разные настройки, в том числе и привязка к разным страницам.
У одного уникального модуля может быть неограниченное количество экземпляров. Еще раз повторю. Экземпляр – это совокупность настроек модуля, хранящаяся в базе данных и всё. Хотя есть, конечно, и более сложные случаи. О них поговорим позднее.
Просмотр модулей Joomla
Для начала давайте разберемся с тем, как посмотреть уникальные модули, которые установлены (или предустановлены) на сайте. Это можно сделать двумя способами:
Первый способ. В админке перейти в Расширения –> Менеджер расширений –> Управление. На открывшейся странице нажать кнопку Инструменты поиска, и в появившемся фильтре выбрать тип расширения Модуль. Посмотрите пример:
Здесь же, кстати, можно удалить ненужные модули.
Вы можете спросить: почему на картинке некоторые модули повторяются? Дело в том, что все модули разделены на две области:
- Область фронтенда – то, что будут видеть пользователи сайта
- Область бэкенда (админки) – то, что будут видеть пользователи админки
Для каждой области есть свой уникальный модуль.
Второй способ. В файлах сайта нужно перейти в одну из папок:
- /modules/ – чтобы посмотреть уникальные модули фронтенда
- /administrator/modules/ – чтобы посмотреть уникальные модули админки
Эти же каталоги указывают нам расположение модулей в файловой структуре Joomla.
Просмотреть экземпляры модулей Joomla тоже очень просто. Достаточно перейти в админке в Расширения –> Менеджер модулей. Здесь вы увидите список всех созданных экземпляров модулей:
Заметьте, в менеджере модулей показаны экземпляры модулей только одной из областей. По умолчанию это «Сайт». Если вы хотите посмотреть экземпляры модулей админки, то нужно выбрать соответствующую опцию в фильтре, показанном на рисунке выше.
Теперь, когда мы разобрались с тем, что такое уникальный модуль и экземпляр модуля, пора поговорить о настройке.
Настройка модулей Joomla
Прежде всего. Модули, которые вы настраиваете в админке и видите на сайте – это экземпляры. Уникальный модуль – это каркас, файловая система, но не настройки (разве что только те, которые заданы по умолчанию).
У каждого модуля есть как общие настройки, так и свои собственные. Собственные настройки модуля создает разработчик, и они обычно отличаются для каждого модуля. Общие же настройки одинаковы во всех модулях. О них мы сейчас и поговорим.
Позиции модулей
Одна из самых важных настроек, которая есть у каждого модуля Joomla, это Позиция.
Позиция модуля – это место в шаблоне, где модуль может быть выведен.
В каждом шаблоне позиции разные. Их создают разработчики шаблонов.
В современных шаблонах, построенных на фреймворках, вы можете добавлять позиции самостоятельно, прямо в настройках шаблона в админке.
Выбор позиции модуля представляет собой выпадающий список:
Разумеется, для того чтобы выбрать позицию, нужно понимать, где она расположена в шаблоне Joomla. Для обычных шаблонов позиции можно посмотреть так:
- Перейти в Расширения –> Менеджер шаблонов –> Настройки и активировать опцию Просмотр позиций модулей:
- Открыть главную страницу сайта и добавить к URL ?tp=1, например, https://wedal.ru?tp=1
Это позволит вам увидеть расположение позиций модулей шаблона.
Порядок модулей
Порядок вывода модулей определяется индивидуально для каждой позиции.
Изменять порядок в настройках каждого отдельного модуля я не советую. Это неудобно. Гораздо проще зайти в менеджер модулей, отфильтровать модули по отдельной позиции, нажать на сортировку по самой первой колонке, а затем перетащить модули мышкой так, как нужно:
Связь модулей и пунктов меню. Вывод модулей на отдельных страницах
Второй по важности общей настройкой я считаю привязку модулей к страницам сайта.
По умолчанию в Joomla модули привязываются к пунктам меню. Это может вызывать некоторые затруднения у новичков в Joomla.
Чтобы вывести модуль на отдельной странице, нужно сделать следующее:
- В менеджере меню создать новый пункт меню типа Материал (Статья) и выбрать для него статью, на страницу которой нужно привязать модуль. Это не обязательно должна быть статья. Это может быть и страница сайта другого типа. Здесь вы можете выбрать любой тип пункта меню.
- В настройках модуля, на вкладке Привязка к пунктам меню, выбрать пункт меню, который был создан в п.1.
Вывод модулей Joomla в разных частях сайта
Выше мы рассмотрели, что такое позиции модулей и как вывести модуль Joomla в одной из них. В этом разделе я расскажу о других способах вывода модулей на сайте. Зачем они нужны и когда используются, вы узнаете далее.
Как добавить позицию модуля в шаблон
Иногда стандартных позиций шаблона бывает недостаточно. Что делать, есть нам нужно вывести модуль в таком месте шаблона, позиции в котором не существует? Нужно создать новую позицию в шаблоне. На самом деле, это проще, чем кажется.
Если вы используете стандартный шаблон и хотите добавить в нем новую позицию, то вам нужно открыть файл:
/templates/ваш_шаблон/index.php
В нем должна содержаться разметка данного шаблона. Вставить новую позицию можно с помощью следующего кода:
<jdoc:include type="modules" name="название_позиции" style="xhtml" />
Обычно этот код еще оборачивают в условие проверки количества модулей, опубликованных в данной позиции (чтобы иметь возможность скрывать позицию, если в ней нет ни одного опубликованного модуля), но здесь я специально его опускаю для упрощения.
В такой вставке важно указать название новой позиции в атрибуте name и ее стиль в атрибуте style. По умолчанию можно указывать стиль xhtml или none. Он определяет структуру вывода модуля (заголовок, контент, общая верстка). Подробнее про стили позиций рассказывается ниже, в разделе про оформление модулей.
Если вы используйте шаблон, основанный на фреймворке, то, скорее всего, сможете посмотреть текущие позиции и добавить новые в его настройках, в админке.
Как вставить модуль в материал Joomla
Бывает так, что модуль необходимо вставить не просто в шаблон, а прямо в статью на сайте. Примером может служить вставка таблицы в разных статьях, про которую я рассказывал выше.
Для вставки модуля в материал в Joomla есть несколько специальных плагинов. Это работает так. Вы вставляете в статью специальную конструкцию, а при загрузке страницы плагин проверяет, встречается ли она, и если да – заменяет ее модулем.
Вы можете использовать один из двух вариантов:
- Вставить в материал позицию модулей
- Вставить в материал отдельный модуль
Для вставки позиции модуля используется конструкция:
{loadposition название_позиции}
Название позиции может быть любым. Можете выдумать его на ходу. Главное, чтобы в настройках модуля была указана эта же позиция.
Для вставки отдельного модуля в материал используется конструкция:
{loadmoduleid ID_модуля}
Эта конструкция появилась относительно недавно и, если вы используете не самую свежую версию Joomla, она может у вас не работать.
ID модуля можно узнать в менеджере модулей. Там, напротив каждого из них, указан ID.
Другой вариант использования описанных выше конструкций – это специальная кнопка в редакторе TinyMCE (он используется в Joomla по умолчанию). Данная кнопка позволяет вставлять модули гораздо более удобным способом. Посмотрите:
Вставка модуля в компонент Joomla
Этот вариант нужен тем, кто уже хоть немного разбирается в PHP.
Иногда возникает необходимость вставить модуль в страницу, генерируемую каким-либо компонентом Joomla. Самый простой пример – необходимо в интернет-магазине (к примеру, Virtuemart) на странице товара вставить модуль обратной связи. Место этой вставки расположено в макете карточки товара. Как быть?
Для вставки модуля Joomla в компонент можно использовать следующий код:
<?php
jimport( 'joomla.application.module.helper' );
$modules = JModuleHelper::getModules('позиция_модулей'); // получаем все модули заданной позиции
$params['style'] = 'xhtml'; // задаём стиль модулей (none, xhtml, др.)
// Выводим все модули из заданной позиции
foreach($modules as $module)
{
echo JModuleHelper::renderModule($module, $params);
}
?>
Это вариант вывода позиции модулей в компоненте.
Есть и другой вариант – вывести модуль по ID:
<?php
jimport( 'joomla.application.module.helper' );
$params['style'] = 'xhtml'; // задаём стиль модулей (none, xhtml, др.)
$module = JModuleHelper::getModuleById('ID_модуля'); //получаем параметры модуля по ID
echo JModuleHelper::renderModule($module, $params); // Выводим модуль
?>
Этот вариант работает только в последних версиях Joomla 3.
И еще есть третий вариант, о котором я узнал совсем недавно. Он самый простой:
<?php echo JHtml::_('content.prepare', '{loadposition! позиция_модуля}'); ?>
В примере выше нужно убрать восклицательный знак. Я добавил его, чтобы Joomla не пыталась обработать этот вызов здесь, в статье.
Вывести модуль в модуле Joomla
Запомните важный момент! Если перед вами появилась задача вставить модуль в модуль Joomla, то с вероятностью 99% вы что-то делаете неправильно.
Модуль Joomla не предназначен для того, чтобы в него вставляли другой модуль. Это что-то вроде бесконечной песенки «У попа была собака…». Модуль – конечная единица контента в Joomla. Если вам чего-то в нем не хватает, значит, вы неправильно спроектировали структуру сайта или шаблон. Разработчики Joomla учли это и отключили возможность использовать конструкций loadposition и loadmoduleid в модуле html-кода.
Тем не менее, есть способ, позволяющий вставить один модуль Joomla в другой. Для этого вы должны:
- Переопределить макет модуля в шаблон Joomla (про макеты и их переопределения читайте в разделе «Оформление модулей», который будет ниже)
- В коде переопределенного макета использовать код для вставки модуля в компонент, который я писал чуть выше.
И это будет работать. Модуль будет вставлен в модуль. Но еще раз повторю: это неправильно! Если вам не хватает какого-то контента в модуле, разумнее будет вставить его в переопределенный макет этого модуля, но никак не добавлять в модуль другой модуль.
Advanced Module Manager – вывод модуля на страницах, не привязанных к пунктам меню
Очень часто встречается ситуация, когда нужно вывести модуль только на некоторых страницах, которые не привязаны к пунктам меню. Например, вы хотите вывести модуль с баннером только на отдельных страницах каталога товаров, а к пункту меню привязан только верхний уровень каталога (обычная ситуация в Virtuemart). Это слабая сторона Joomla, т.к. стандартный функционал CMS не позволит вам сделать это.
Да, если вы разработчик, и хорошо разбираетесь в шаблонах Joomla и PHP, то без труда сможете добавить нужную привязку в шаблоне Joomla. Но что делать всем остальным?
На помощь придет стороннее расширение Advanced Module Manager. Оно улучшает менеджер модулей Joomla, добавляя новые различные варианты привязки модулей, а том числе и по URL страницы.
Advanced Module Manager имеет две версии: бесплатную и коммерческую. Различие между ними в количестве разнообразных привязок. Подробнее прочитать про это расширение и сравнить его версии можно здесь.
Что касается моего опыта – я крайне редко использую Advanced Module Manager, поскольку в нем есть и минусы. Такая широта функционала дает, в свою очередь, и гораздо бОльшую нагрузку. Поэтому не устанавливайте данное расширение бездумно. Используйте его только в том случае, на это действительно есть необходимость. И, однозначно, если вам нужно сделать всего 1-3 нестандартных привязки модулей, не стоит устанавливать такого монстра.
Ограничение на просмотр модулей
Еще одной важной возможностью модулей Joomla является разграничение доступа.
Предположим, у нас есть задача в определенной позиции шаблона:
- Для неавторизованных пользователей показывать форму входа
- Для авторизованных пользователей показывать пользовательское меню.
Именно так сделано сейчас на wedal.ru.
Вид для гостей:
Вид для авторизованных пользователей:
Как этого добиться? Доступ к модулям на сайте регулируется опцией Доступ, которая есть в любом модуле Joomla:
В выпадающем списке можно выбрать уровень доступа, которым должны обладать пользователи, чтобы видеть данный модуль.
Таким образом, для решения задачи, описанной выше, достаточно:
- Создать два модуля: Форма авторизации и Меню пользователя и вывести их в одной позиции на сайте
- Задать для модуля Форма авторизации уровень доступа Гость
- Задать для модуля Меню пользователя уровень доступа Зарегистрированный
В результате все пользователи, которые зашли на сайт, но не авторизовались, будут видеть только форму входа, а авторизованные пользователи будут видеть меню.
Отдельно стоит сказать про уровни доступа. Их набор не является фиксированным. Вы можете создавать любое количество собственных уровней доступа, привязывать к ним группы пользователей и очень гибко управлять видимостью модулей Joomla. Это довольно сложный функционал. Подробнее про систему контроля доступа (Joomla ACL) вы можете почитать в отдельной статье.
Кэширование модулей
Модули Joomla могут быть очень разными. Иногда актуальность информации в них очень важна (например, последние комментарии, статьи или темы форума), но иногда информация в модуле может быть более чем постоянной. Пример – меню.
Давайте представим ситуацию. У вас на сайте размещено сквозное многоуровневое меню, в котором десятки пунктов. Так бывает очень часто, если не сказать почти всегда.
Для генерации такого меню при запросе каждой страницы Joomla должна обратиться к базе данных, взять из нее все пункты, проанализировать их параметры, создать ссылки в зависимости от этих параметров, построить структуру. Вся эта работа потребляет вычислительные ресурсы сервера.
А теперь представьте, что у вас запрашивается в среднем 1 страница в секунду. При этом работа по генерации меню проводится каждый раз, хотя само меню может не меняться годами. Это совсем не оптимально.
Для оптимизации таких ситуаций и увеличения производительности в Joomla заложен функционал кэширования модулей. В каждом нормальном модуле есть опции, позволяющие включить или выключить кэширование, а также задать время жизни кэша.
Как работает кэширование модулей в Joomla? Вернемся к примеру с меню. При включенном кэшировании, при первой генерации меню Joomla записывает его html-код в файл и хранит этот файл на сервере в папке кэша. Во второй и последующий разы, когда нужно сгенерировать меню, Joomla не делает это повторно, а просто берет html-код из файла и подставляет его в шаблон. Это существенно экономит ресурсы сервера и снижает нагрузку.
У кэша есть время жизни. Оно задается отдельно в каждом модуле. Это важно.
Время жизни кэша – это прошедшее время, от первого создания кэша, до того, как он будет пересоздан повторно.
Почему это важно? Представим себе 2 модуля: модуль меню, изменения в который вносятся 2 раза в год и модуль последних статей на сайте, которые появляются 2 раза в неделю. Разумно предположить, что кэш первого модуля можно обновлять гораздо реже. Для этого и нужна данная опция.
В каждом отдельном модуле вы можете совсем отключить его кэширование, если актуальность информации, которую он выводит, очень важна. В противном случае настраивайте время кэширования, а опцию включения кэша оставляйте По умолчанию.
При таком подходе вы сможете один раз включить кэширование в общих настройках Joomla и оно сразу заработает для всех модулей, в которых прямо не отключено. Это очень удобно.
Кэширование нужно включать уже после завершения разработки сайта. Включение кэша на этапе разработки будет сильно мешать, т.к. вы не сможете видеть актуальные данные каждый раз при обновлении страницы.
Оформление модулей
Модули Joomla очень хорошо поддаются кастомизации. Обладая соответствующими навыками, вы можете легко и быстро переделать любой из них под свои задачи. В этом разделе я расскажу про всё, что связано с оформлением модулей.
Суффикс класса модуля
Суффикс класса модуля является довольно полезной опцией, когда вам нужно оформить по-разному два экземпляра одного модуля.
Представьте, есть один модуль вывода последних новостей, и вы используете его дважды в разных местах страницы и с разными опциями. Также вам нужно по-разному оформить его в каждом месте. Joomla имеет опцию, позволяющую задать уникальный CSS-класс для модуля.
Подробно про суффикс класса модуля вы можете прочитать в отдельной статье, целиком посвящённой этой теме. Всем, кто постоянно использует Joomla, настоятельно рекомендую к ознакомлению.
Стиль позиции модуля
Далее поговорим про html-структуру модулей на сайте. Она формируется из двух частей:
- Стиль позиции модуля в шаблоне
- Макет модуля
Каждая из этих частей формирует итоговую html-разметку модуля на сайте. Фактически то, что будет вставлено в шаблон вместо:
<jdoc:include type="modules" name="название_позиции" style="xhtml" />
Здесь мы рассмотрим первую часть – стиль позиции модуля.
Стилей может быть несколько. Какой именно стиль будет применен, указывается во вставке позиции модуля. Посмотрите пример вставки чуть выше. Здесь применен стиль xhtml.
Вы можете переопределять стили позиций, а также создавать свои собственные стили. Посмотрим как.
Стандартный набор стилей позиции модуля расположен в файле:
/templates/system/html/modules.php
Посмотрите его и вы увидите все доступные по умолчанию стили. Если вам хочется изменить какой-нибудь из стилей, или добавить свой собственный, то первым делом нужно переопределить данный файл в ваш шаблон. Если говорить простым языком, скопируйте этот файл и вставьте в:
/templates/ВАШ_ШАБЛОН/html/
Кстати, очень велика вероятность, что в вашем шаблоне такой файл уже существует. Тогда ничего копировать не нужно – редактируйте файл из вашего шаблона.
Содержимое файла стилей позиции модуля на первый взгляд может показаться сложным, но в реальности оно довольно простое. В файле содержится набор функций. Одна функция определяет один стиль. Шаблон имен функций такой:
modChrome_название_стиля
т.е., к примеру, функция стиля xhtml будет называться:
modChrome_xhtml
Содержимое функции определяет html-разметку стиля позиции. Здесь есть всего две основные переменные, которые нужно вывести:
- $module->title – заголовок модуля
- $module->content –содержимое макета модуля
Всё остальное – различные параметры и дополнительная логика. Ориентируйтесь на примеры функций в файле, и вы сможете создать свой уникальный стиль для позиции.
Всё это прекрасная теория. На практике же лично я использую в основном только два стандартных стиля:
- xhtml – выводит заголовок и содержимое модуля в простых блоках
- none – выводит содержимое модуля (без заголовка) без какой-либо разметки. Читай – только макет.
Ну и в целом – изменение стилей позиций модулей – достаточно редкая задача. Чаще всего хватает стандартного их набора. Но зная про стили позиций, вы не будете теряться, когда увидите дополнительную html-разметку вокруг выведенного в шаблон модуля.
Макет модуля
Второй, гораздо более важной составляющей html-разметки модуля, является его макет.
Макет – это файл, который выводит на сайт содержимое модуля. У каждого модуля есть как минимум один макет. Часто модули имеют несколько макетов.
Макеты модуля всегда расположены в каталоге:
/modules/название_модуля/tmpl/
Рассмотрим пример макетов на стандартном модуле авторизации Joomla.
Найти макеты можно в каталоге:
/modules/mod_login/tmpl/
Здесь вы увидите два файла-макета:
- default.php
- default_logout.php
Почему два? Т.к. это модуль авторизации, то он может быть показан в одном из двух состояний:
- Пользователь не авторизован
- Пользователь авторизован
Логично, что в первом случае модуль должен показывать форму ввода логина и пароля, а во втором приветствие пользователя. Поэтому макетов два. Какой из них будет показан, определяется логикой модуля.
Предположим, вы хотите изменить html-разметку макета модуля или добавить в него дополнительный функционал. Как это правильно сделать? Следуем по шагам:
- Переопределите редактируемый макет в шаблон Joomla, который используйте
- Вносите изменения в переопределенном шаблоне
Переопределить макет модуля очень просто. Его нужно скопировать по адресу:
/templates/ваш_шаблон/html/название_директории_модуля/
В нашем примере это будет:
/templates/ваш_шаблон/html/mod_login/
Все недостающие каталоги создаем сами.
Альтернативный макет модуля
Иногда бывают ситуации, когда один и тот же модуль нужно выводить в разной разметке. Например, в одном месте сайта последние статьи нужно показывать списком и только заголовки, а в другом – заголовок, описание, вводное изображение.
Хорошо, когда опций модуля хватает чтобы сделать такое разделение. Но часто бывает, что нет. В этом случае нам на помощь приходят альтернативные макеты модулей Joomla.
Альтернативный макет – это файл стандартного макета модуля, имеющий другое название и измененное содержимое.
Чтобы создать и использовать альтернативный макет для модуля необходимо:
- Переопределить стандартный макет модуля в шаблон Joomla (подробнее о том, как это сделать, написано в разделе выше)
- Переименовать стандартный макет в любое другое название, не содержащее специальных символов (в том числе нижнего подчеркивания)
- В настройках модуля найти опцию «Альтернативный макет» и выбрать в ней файл, созданный в п.2.
В примере с модулем авторизации (см. раздел выше) я переопределил его стандартные макеты в шаблон Joomla, а затем переименовал их в header.php и header_logout.php соответственно. После этого в настройках модуля авторизации выбрал переименованный макет:
Всё. Теперь данный экземпляр модуля авторизации будет брать разметку из альтернативного макета.
Альтернативных макетов у модуля может быть неограниченно много. Они позволят вам получить огромную гибкость разметки в Joomla. Еще больше информации об альтернативных макетах модулей и не только вы можете найти в статье Макеты Joomla. Как сделать ваш сайт максимально уникальным.
Разработка модуля Joomla
Joomla имеет огромное количество готовых модулей. Но бывает так, что требуемый функционал совершенно уникален. Что делать в этом случае? Создать собственный модуль!
Разработка простого модуля – задача не очень сложная. Тем не менее, она требует базовых знаний HTML, CSS, PHP, XML. Если они у вас есть, то данный раздел будет вам полезен. Если же нет, то создать собственный модуль вам будет довольно сложно. Лучше отдайте эту задачу на аутсорс или обратитесь за созданием модуля ко мне.
Для начала давайте рассмотрим стандартную структуру модуля Joomla. Конечно в зависимости от задач она может меняться, но в целом достаточно постоянна.
Типичный модуль Joomla находится в каталоге /modules/, имеет уникальное название, начинающееся с mod_ , и содержит следующе файлы и подкаталоги:
- Файл mod_название_модуля.xml (обязательно) – манифест модуля. Здесь содержится установочная информация (версия, автор, дата, и др), ссылки на языковые файлы и опции настроек модуля, которые должны быть доступны в админке.
- Файл mod_название_модуля.php (обязательно) – точка входа модуля. Именно этот файл запустит Joomla, когда ей потребуется вызвать модуль.
- Файл helper.php (не обязательно) – набор функций (или методов) модуля. Здесь обычно держат весь функционал модуля.
- Папку language (не обязательно, но крайне желательно) – содержит языковые файлы модуля.
- Папку assets (не обязательно) – содержит css и js файлы модуля, если таковые имеются.
- Папку tmpl((не обязательно, но крайне желательно) – содержит макет вывода модуля
Минимальный модуль будет состоять всего из двух файлов: первых двух, указанных в этом списке. Но делать так – очень плохая практика.
Хороший модуль обязательно должен:
- Содержать все тексты (и отдельные слова) в языковых константах. Это нужно, поскольку только в этом случае в модуль может быть внедрена дополнительная локализация и мультиязычность.
- Иметь макет вывода, расположенный в подкаталоге tmpl. Это нужно чтобы была возможность переопределить данный макет в шаблон Joomla и отредактировать под свои нужды.
Чтобы написать свой модуль Joomla, я советую взять один из стандартных модулей, установленных по умолчанию, выбрав такой, который в наибольшей степени будет подходить под ваши нужды, а затем переименовать и переделать его. Это поможет сэкономить некоторое время.
Также вы можете найти в Интернете сервисы генерации модулей-заготовок. Конечно, функционал, который вам необходим, они не создадут, но позволят быстро создать каркас модуля со всеми необходимыми для заполнения полями.
Модули Joomla и com_ajax
Есть еще одна важная вещь, которую нужно знать о модулях, прежде чем браться за разработку.
Модуль не может содержать несколько страниц (в стандартном понимании). Т.е., по сути, модуль только выводит информацию, но не обрабатывает ее, как компонент. Это означает, что вы не можете вызвать модуль по прямому URL.
Т.е., к примеру, модуль не предназначен для реализации формы обратной связи, которая сначала показывает форму, а потом страницу «Спасибо».
Для того чтобы иметь возможность вызова модуля по прямой ссылке, применяется специальный компонент Joomla, который называется com_ajax.
Com_ajax работает с модулями следующим образом:
- При запросе в адресной строке передается URL вида: php?option=com_ajax&module=название_модуля&format=raw(или json)&method=назавание_метода
- Com_ajax из параметров понимает к какому модулю обратиться, какой формат ответа от него ждать и какой метод должен быть выполнен, чтобы ответ был получен
- В модуле, в файле helper.php должен присутствовать метод, имя которого передается в com_ajax и название которого заканчивается на «Ajax». Например, если в com_ajax передается параметр &method=getForm, то в хелпере должен быть метод getFormAjax.
Вот и всё. Сам этот метод должен генерировать то, что будет ответом на такой URL. Это может быть, в том числе, макет модуля. Таким образом, используя com_ajax, вы сможете вывести модуль по прямому URL.
Более подробную информацию по com_ajax и варианты его использования вы можете найти здесь.
Когда не стоит использовать модули
Не всегда использование модулей на сайте Joomla оправдано. Бывали случаи, когда я сталкивался с сайтами, на которых использовалось 500-800 экземпляров модулей. Стоит ли говорить, что поддержка такого сайта превращалась в настоящий кошмар.
В этом разделе я собрал случаи, в которых не следует использовать модули, а лучше применить другие техники.
Модуль с уникальной информацией для страницы каталога или интернет-магазина
Бывает, что случается такое: на каждой странице каталога товаров (или чего-то еще) появляется необходимость поместить блок с уникальной информацией. Скажем, заказчик просит добавить на странице каждого товара слайдер с дополнительными фотографиями.
Модуль, конечно, кажется самым простым решением. Но это пока товары исчисляются единицами или десятками. А что, если в перспективе их будут сотни или тысячи? Вы создадите сотни экземпляров модуля слайдера? Никогда так не делайте.
Правильный подход: использовать дополнительные поля для товара в каталоге. В них загружать слайды и формировать слайдер в макете карточки товара.
Модули html-кода в материалах Joomla
Некоторые разработчики так увлекаются использованием модулей, что часто вставляют их в материалы через редактор, даже когда этого не требуется.
Простой пример: у вас есть таблица, которую нужно вставить в статью. Статья, содержащая эту таблицу, на сайте только одна. Другие статьи содержат другие таблицы.
Правильный подход: Помните про правило вынесения за скобки (смотрите начало статьи). Если содержимое модуля html-кода будет выводиться только в одной статье или точно не будет обновляться, то не городите модуль, а просто включайте этот html-код в статью.
Модули для текста (или меню) в несколько колонок
Часто бывает, что необходимо сделать что-то такое:
Не нужно создавать для этого три разных модуля. Почему? Да, это кажется проще на первый взгляд, но когда вы сделаете аналогичным образом еще несколько блоков, то их поиск и редактирование превратится в кошмар.
Правильный подход: Выводите HTML-код в одном модуле и используйте CSS для создания нескольких колонок.
Если вы сомневаетесь, использовать модуль или нет, то всегда вспоминайте, что основное предназначение модулей Joomla – показывать одинаковую информацию на разных страницах сайта. Вспоминайте пример с многочленом. Если вы видите, что страниц с блоком повторяющейся информации много, то смело размещайте ее в модуле.
Где скачать модули Joomla
Если вы ищете, где можно скачать разнообразные модули Joomla для своего сайта, то запомните одно простое правило:
Скачивать модуль можно только с сайта его разработчика или с extensions.joomla.org.
Все остальные варианты с высокой долей вероятности приведут вас к проблемам. Модули, скачанные из неофициальных источников, могут содержать в коде что угодно. Проблем от них вы получите гораздо больше, чем пользы.
В каталоге расширений Joomla (или сокращенно JED), ссылку на который я дал выше, все расширения проверяются. Загружать модули оттуда или же с сайтов разработчиков, на которые там есть ссылки, относительно безопасно.
В JED есть как платные модули, так и те, которые можно скачать и использовать бесплатно. Фильтр позволит вам отделить одни от других.
Бесплатные модули Joomla от Wedal.ru
Я хочу предложить вам несколько собственных бесплатных модулей Joomla. Их нет в JED (пока). В них нет никакого подвоха. Я делал их для себя (точнее для решения частых задач при разработке сайтов), и решил поделиться с сообществом.
- Wedal Joomla Callback – модуль встроенной и всплывающей формы обратной связи
- Wedal Joomla Slider – модуль слайдера для Bootstrap
- Wedal Christmas Tree – модуль новогодней ёлки, внешний вид которой можно настроить
Все три модуля имеют открытый код и распространяются бесплатно. Буду рад, если они пригодятся вам при создании сайтов на Joomla.
От себя же могу предложить услуги по разработке как модулей Joomla, так и других типов расширений или сайтов под ключ.
Об авторе
Wedal (Виталий). Веб-разработчик полного цикла (Full Stack). Создатель и автор сайта Wedal.ru.
Основной профиль – создание сайтов и расширений на CMS Joomla.
- Об авторе
- Портфолио
- Услуги
- Контакты
Назначение Модуля в CMS Joomla — вывод данных в определенных местах шаблона (позициях).
Модули – это расширения, используемых на сайтах с CMS Joomla, основное назначение которых — отображение информации, в определенных местах шаблона (позициях). Через модуль выводятся списки материалов (последних, популярных) или категорий, пункты меню сайта, контактная информация, баннеры, слайдеры изображений и т.д.
Помимо отображения данных, при помощи модулей так же организована передача данных от пользователя сайту на CMS Joomla, для последующей обработки. Например модуль авторизации на сайте принимает и передает на обработку логин и пароль пользователя для входа на сайт. Модули содержащие формы обратной связи содержат и передают большее число полей. Опросы, организованные на сайте с CMS Joomla, принимают и передают на обработку ответы при помощи модулей.
Модули CMS Joomla являются зависимыми расширениями, они (за исключением модуля «HTML-код») связаны с компонентами, отображая или принимая их данные. Далее я предполагаю что Вы уже знакомы с понятием (расширением) «Компонент» CMS Joomla.
Характеристики модулей CMS Joomla
Модули CMS Joomla имеют две главных характеристики — «Позиция (position)» и «Тип (type)» и дополнительную «Категория».
Позиция модуля это место в шаблоне, где размещен модуль. Позиции для размещения модулей устанавливает разработчик шаблона. В процессе разработки сайта возможно изменение позиций шаблона или добавление новых. В современных шаблонах, разрабатываемых для CMS Joomla 3 предусмотрено огромное количество позиций. Размещение модуля в позиции шаблона производится простым выбором в административной части сайта. В одной позиции шаблона может быть размещено несколько модулей.
Тип модуля определяет его назначение и виды данных, которые модуль способен выводить или принимать. В модуле типа «HTML-код» можно вывести любую произвольную текстовую информацию, изображения, ссылки и использовать разметку HTML. В модуле типа «Меню» может быть выведено какое-либо меню сайта. В модуле типа «Вход на сайт» выводятся поля для ввода логина и пароля и кнопка для отправки данных.
Категория это характеристика которая поможет нам ориентироваться в огромном количестве модулей, доступных для использования с CMS Joomla.
- JM1 — модули, входящие в стандартную комплектацию CMS Joomla (доступные «из коробки»).
- JM2 — модули от сторонних разработчиков, не входящие в стандартную поставку CMS Joomla, но предназначенные для вывода стандартных данных Joomla.
- JM3 — модули от сторонних разработчиков, предназначенные для работы с данными компонентов этих разработчиков.
Пример модуля JM1 — стандартный модуль «Меню». такой модуль выводит простой список пунктов меню вертикально или горизонтально. Модуль меню относящийся к категории JM2 — может вывести то же самое меню, но более элегантно, например с плавно выпадающими подпунктами или в виде аккордеона. Такие модули могут оказаться на сайте в комплекте поставки данных с шаблоном от разработчика или установлены самостоятельно. JM3 — модули идут в комплекте с их компонентами, например вывод новых или популярных товаров из компонента интернет-магазина или последних комментариев из соответствующего компонента.
Далее при описании модулей я буду делать пометки о том к какой категории относятся описываемые модули.
Примеры модулей CMS Joomla на этой странице.
Позиция «top» (самый верх страницы, темно-серый фон). Здесь находятся два модуля. Слева «HTML-код» (JM1), который выводит номера телефонов. Справа «Переключение языков» (JM3). На этом сайте переключение языков организовано компонентом FaLang, имеющем свой собственный модуль. Но и в стандартной поставке CMS Joomla так же присутствует модуль «Переключение языков» (JM1).
Позиция «header» (ниже позиции top, с фоновой картинкой). Здесь находится модуль вывода ГЛАВНОГО МЕНЮ сайта. Это модуль стороннего производителя «AS Superfish Menu», относящийся к категории JM2. Он выводит меню, созданное в CMS Joomla, но обладает возможностью выводить подпункты в плавно выпадающих при наведении списках
Позиция «breadcrumb» (черный фон). Здесь находятся модуль «Навигатор сайта» (JM1), который выводит путь страницы на сайте, так называемые «Хлебные крошки».
Позиция «right» (блок справа от основного окна со статьей). Здесь находятся модуль «Список материалов Категории» (JM1).
Позиция «footer1» (низ страницы, черный фон). Здесь находятся два модуля «HTML-код» (JM1), один выводит вспомогательную текстовую информацию, другой номера телефонов и Skype.
Позиция «footer2» (самый низ страницы). Здесь находятся модуль «Меню» (JM1), со ссылками на социальные сети.
Модули CMS Joomla — панель управления.
Для работы с Модулями в административной части CMS Joomla предназначен раздел «Менеджер модулей». Попасть в Менеджер модулей можно через верхнее меню «Расширения — Модули»
Попадаем на страницу со списком ВСЕХ модулей, установленных на сайте (Менеджер модулей).
Кнопки менеджера Модулей.
В верхней части страницы Менеджера Модулей мы видим кнопки управления Модулями:
«Создать» — открывает Окно со списком ТИПОВ МОДУЛЕЙ, которые можно создать.
«Изменить» — открывает Окно для изменения Модуля. Модуль для изменения нужно отметить соответствующим чекбоксом (слева от наименования Модуля).
«Дублировать» — Самый простой способ создания модуля. Установите чекбокс для модуля, который хотите дублировать и нажимайте на кнопку. Произойдет полное копирование модуля включая все настройки.
«Опубликовать» — Меняет состояние Модуля на «Опубликовано». Модуль который следует опубликовать нужно отметить соответствующим чекбоксом (слева от наименования Модуля). Удобно для публикации нескольких Модулей, отмеченных чекбоксами.
«Снять с публикации» — Меняет состояние Модуля на «Неопубликовано». Модуль который следует опубликовать нужно отметить соответствующим чекбоксом (слева от наименования Модуля). Удобно для снятия с публикации нескольких Модулей, отмеченных в чекбоксе.
«Разблокировать» — Снимает блокировку (замочек рядом с наименованием модуля), препятствующую редактированию Модуля. О причинах возникновения блокировок было сказано ранее в разделе посвященном Созданию/Редактированию Материала.
«В корзину» — Меняет состояние Модуля на «В корзине». Т.е. удаляет модуль, но с возможностью отмены.
«Пакетная обработка», «Настройки» — предназначены для разработчика сайта.
Выбор типа модуля (после нажатия кнопки «Создать»):
После нажатия кнопки откроется окно выбора нужного типа модуля. Ниже список модулей категории JM1 — стандартная поставка CMS Joomla. Если на сайте установлены модули других категорий они так же будут в списке и их можно выбрать для создания нового модуля.
- HTML-код — Модуль отображения произвольного фрагмента HTML-кода. Используется для вывода произвольной информации на сайте (Контактные телефоны, Адрес, Карта, Заголовок/Текст/Картинка на главной)
- RSS-лента новостей Этот модуль позволяет показывать ленту новостей.
- Баннеры — Модуль отображает действующие баннеры, созданные в компоненте баннеров.
- Вход на сайт — Модуль отображения формы для ввода логина и пароля пользователя при входе в систему.
- Категории — Этот модуль показывает список категорий, входящих в одну общую родительскую категорию.
- Кто на сайте — Модуль отображает количество гостей и авторизованных пользователей (тех, что ввели логин).
- Ленты новостей — Модуль создаёт RSS-ленту для страницы, на которой отображается.
- Материалы — Материалы в архиве — Этот модуль показывает список календарных месяцев, которые содержат архивные материалы.
- Материалы — Новости — Модуль Новостей выводит фиксированное количество материалов из конкретной категории.
- Материалы — Последние новости — Этот модуль отображает список самых последних опубликованных материалов.
- Материалы — Самые читаемые — Этот модуль отображает список популярных материалов.
- Материалы — Связанные материалы — Этот модуль отображает список ссылок на материалы, которые связаны с тем, что в данный момент открыт.
- Материалы — Список материалов категории — Этот модуль отображает список материалов из одной или нескольких категорий.
- Меню — Этот модуль отображает меню на страницах сайта.
- Навигатор сайта Этот модуль выводит путь к текущей странице в виде строки.
- Нижний колонтитул (footer) — Этот модуль выводит информацию об авторских правах сайта и т.д.
- Новые пользователи — Этот модуль выводит список последних, зарегистрированных пользователей.
- Обёртка (Wrapper) — Этот модуль отображает в IFrame-окне содержимое по заданной ссылке (сайт или файл).
- Переключение языков — Этот модуль отображает список доступных Языков контента.
- Поиск — Этот модуль отображает форму поиска.
- Популярные метки — Отображает список наиболее популярных меток.
- Похожие метки — Модуль отображает ссылки на другие элементы с похожими метками.
- Случайное изображение — Этот модуль выводит случайно выбранное изображение из заданного каталога.
- Ссылки — Этот модуль отображает ссылки из указанной категории компонента Ссылки.
- Статистика — Модуль статистики отображает информацию о сервере вместе со статистикой о пользователях.
- Умный поиск — Это — модуль системы Умный Поиск (J0).
Таблица со списком установленных Модулей
В основной части страницы Менеджера Модулей мы видим таблицу со список Модулей:
Рассмотрим таблицу списка Модулей по столбцам:
Столбец 1. Крайний левый столбец таблицы предназначен для установки сортировки. Модули можно перемещать вверх/вниз по таблице в пределах Позиции при помощи курсора мыши. Для этого нужно навести курсор на Модуль (там где три вертикальные точки), курсор примет характерную для перетаскивания форму перекрещенных стрелок, и на жав левую клавишу мыши произвести перетаскивание вверх или вниз.
Столбец 2. Второй столбец таблицы содержит чекбоксы для выделения нужных Модулей для последующего изменения их состояния кнопками «Опубликовать», «Снять с публикации» и др. Удобно для обработки нескольких Модулей.
Столбец 3. Столбец «Состояние» предназначен для показа и индивидуального изменения состояния Модуля. Левая его часть имеет два состояния «Опубликовано» (зеленая галочка) и «Не опубликовано» (крестик в красном). Состояние меняется нажатием левой клавиши мыши. Сам Модуль остается на экране. Правая часть содержит выпадающий список для выбора двух других состояний «Дублировать» и «В корзину».
Столбец 4. Столбец «Заголовок» содержит Заголовок Модуля + Текст Примечания (если заполнено). Заголовок Модуля является ссылкой, нажатие на которую открывает Окно редактирования Модуля.
Столбец 5. Столбец «Позиция» указывает на какой позиции размещен модуль. Позиции для размещения модулей задаются при верстке шаблона. Наименования позиций задаются разработчиком шаблона произвольно. Увидеть расположение позиций модулей можно в разделе «Расширения — Шаблоны». Иконка «Предварительный просмотр» слева от имени шаблона. Просмотр доступен при условии если дано разрешение на просмотр в настройках шаблона.
Столбец 6. Столбец «Тип» содержит информацию о типе Модуля.
Столбец 7. Столбец «Страница» содержит информацию о том на каких страницах сайта показывается модуль.
Столбец 8. Столбец «Доступ» показывает уровень доступа к просмотру Модуля.
Столбец 9. Столбец «Язык» содержит информацию о Языке для которого создан Модуль при создании мультиязычного сайта.
Столбец 10. Столбец «ID» содержит информацию об уникальном идентификаторе Модуля.
По столбцам, являющимся ссылками возможна сортировка. По умолчанию сортировка установлена по столбцу «Позиция».
Так же сортировку по выбранным колонкам можно произвести при помощи поля «Порядок». Рядом находится кнопка с цифрой (по умолчанию 20) где можно выбрать количество Модулей, показываемых на странице. Остальные Модули будут перенесены на следующие страницы.
Инструменты поиска.
Так как Модулей на сайте, особенно мультиязычном, может быть установлено много, предусмотрен поиск по наименованию Модуля, для этого используйте поле «Поиск».
Так же используйте «Инструменты поиска». После нажатия на кнопку ниже появится несколько полей с выпадающими списками.
«Выбор состояния» позволяет отобрать Модули соответствующего состояния.
«Выбор позиции» позволяет отобрать Модули расположенные на одной позиции.
«Выбор типа» позволяет отобрать Модули одного типа.
«Выбор Меню» позволяет отобрать Модули привязанные к страницам сайта (по пунктам меню).
«Выбор уровня доступа» позволяет отобрать Модули соответствующего уровня доступа.
«Выбор языка» позволяет отобрать Модули для соответствующего языка. При использовании Falang не актуально.
Для того чтобы начать редактировать нужный Модуль достаточно нажать на его заголовок. Откроется окно Редактирования Модуля. Вид окна Редактирования Модуля зависит от Типа Модуля.
Продолжим изучение CMS Joomla 3 и в рамках данной статьи поговорим о переопределение макетов. Разберем на конкретном примере как создать переопределение модуля последних новостей, чтобы вместе с названием (заголовком) материала выводить его изображение. Это может в дальнейшем пригодиться для создания своих собственных уникальных шаблонов. Но обо всем по порядку.
Если сказать простыми словами, то под переопределением в Joomla подразумевают копирование файлов ядра в определенную папку с последующим их изменением по своему усмотрению и для своих нужд. Переопределение Joomla 3 еще часто называют шаблонизацией, ведь мы так сказать меняем шаблон вывода тех или иных расширений и компонентов системы.
Что можно переопределять?
В Joomla 3 переопределять можно практически все что угодно – компоненты, модули и макеты. Другими словами все то, что может потребоваться для решения поставленных задач. К подобным задачам можно отнести изменение внешнего вида стандартных модулей, макетов вывода материалов на сайт и многое другое.
В одной из предыдущих статей посвященных созданию собственного шаблона мы столкнулись с ситуацией, когда в модулях совместно с названием материала должны были отображаться их изображения. Для решения подобной задачи чтобы не искать сторонние расширения можно воспользоваться переопределением макета модулей и добиться желаемого результата.
Чтобы все стало понятно посмотрите на скриншот стандартного модуля популярных материалов и того что должно получиться после переопределения его макета:
Как видите, после переопределения обычный модуль может стать уникальным. И нам не придется тратить время, а возможно и деньги на поиск подходящего модуля сторонних разработчиков.
Для чего нужно переопределение?
Вполне законный вопрос, зачем нам создавать какое то переопределение, если файлы можно редактировать напрямую. Да это так, но как мы знаем, после обновления Joomla до новой версии все файлы ядра перезаписываются, таким образом можно потерять все внесенные изменения.
Это конечно не проблема, если Вы помните что когда и как редактировали. Но так уж повелось, что человеку свойственно забывать любую информацию, особенно если прошло достаточно много времени. Вот именно поэтому стоит один раз создать переопределение определенных файлов ядра и быть спокойным после каждого обновления Joomla.
Но тут есть и обратная сторона, ведь после обновления системы файлы перезаписываются не просто так, в них вносятся определенные правки для улучшения производительности и т.д. Поэтому после обновления стоит иногда заглядывать в файлы ядра и проверять их на наличие нового кода, это сделать все же проще, чем переписывать собственный код каждый раз заново.
Как создать переопределение в Joomla 3
Создать переопределение можно несколькими способами — простым копированием необходимых файлов в папку html текущего шаблона либо через панель управления. Во втором случае необходимо перейти в раздел «Расширения» -> «Шаблоны» -> «Шаблоны». Нажать на «Параметры» шаблона используемого по умолчанию и в открывшейся странице перейти на вкладку «Создать переопределение»:
Выбираем то, что будем переопределять, после этого в папке html текущего шаблона будет создана копия системных файлов. В эти файлы мы можем вносить необходимые изменения по своему усмотрению, не боясь потерять данные после очередного обновления Joomla.
Хочу отметить что можно создавать неограниченное количество переопределений одного и того же расширения, для этого необходимо дать различные имена файлам макета шаблона.
Переопределение модуля последних материалов
Хватит теории, давайте приступим к практической части. Разберем принцип переопределения на примере стандартного модуля Joomla 3 под названием «Материалы — Последние новости». В данный модуль мы помимо прочего добавим возможность вывода изображений материалов совместно с заголовками.
Для начала переходим в папку имя_сайта/modules/mod_articles_latest/tmpl. Там находится всего один файл шаблона данного модуля под названием default.php его нам надо скопировать.
Теперь переходим в папку html текущего шаблона (если её там нет, то создаем), создаем в ней папку с именем модуля (mod_articles_latest) и вставляем в неё файл default.php. Путь до файла должен получиться таким — имя_сайта/templates/имя_шаблона/html/mod_articles_latest/default.php
Переименуем данный файл, я назвал его last-news.php и откроем для изменения. Его содержимое для Joomla 3.8.1 следующее:
Как видите, все материалы выводятся в виде обычного не нумерованного списка, в котором кроме заголовков материала ничего не выводится. Давайте это поменяем, во-первых вместо не нумерованного списка будем использовать блоки div, во-вторых добавим изображения для каждого материала. Код будет таким:
<?php defined('_JEXEC') or die; ?>
<div class="latest-news<?php echo $moduleclass_sfx; ?>">
<?php foreach ($list as $item) : ?>
<?php $arrImg=json_decode($item->images); ?>
<div class="article-title" itemscope itemtype="https://schema.org/Article">
<?php if ($arrImg->image_intro): ?>
<a href="<?php echo $item->link; ?>" itemprop="url">
<img src="<?=$arrImg->image_intro;?>" alt="<?php echo $item->title; ?>" title="<?php echo $item->title; ?>">
<span itemprop="name">
<?php echo $item->title; ?>
</span>
</a>
<?php else: ?>
<a href="<?php echo $item->link; ?>" itemprop="url">
<span itemprop="name">
<?php echo $item->title; ?>
</span>
</a>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
Я не буду расписывать каждую строчку кода, но для того чтобы стало понятно что за что отвечает, посмотрите на скриншот, и все станет понятно:
На самом деле код не сильно изменился, единственное что добавилось, это новая переменная $arrImg, которая содержит путь до изображения, а так же условие проверяющее было ли выбрано для данного материала вступительное изображение. Если изображение имеется, то мы его выводим вместе с заголовком материала, если его нет, тогда выводится один заголовок.
Осталось оформить все это дело при помощи css, после чего стандартный модуль последних материалов будет уже не узнать:
/* Модуль последних новостей */
.moduletable h3 {margin: 15px 0 0;font-size: 18px;background-color: #f0f0f0;padding: 8px 12px;}
.latest-news .article-title {overflow: auto; padding: 15px 0; border-bottom: 1px solid #b8b7b7; }
.latest-news .article-title:hover{background-color: #b8b7b7;}
.latest-news .article-title:hover >a {color: #F0F0F0;}
.latest-news :last-child {border-bottom: none !important;}
.latest-news img {float: left;width: 95px;margin-right: 4px;}
.latest-news a {color: #000;}
.latest-news a:hover {color: #000; text-decoration: none;}
Сохраняем изменения и переходим в панель управления. Открываем наш модуль для редактирования и на вкладке «Дополнительные параметры» в поле «Альтернативный макет» выбираем только что переопределенный макет модуля:
Осталось проверить результат! Для этого переходим на сайт и смотрим, что у нас получилось.
В заключение хочу сказать, что подобным образом можно переопределить (изменить шаблон) практически любого модуля в Joomla 3. Для тех, кто хочет узнать, как переопределить макет блога категории тогда советую почитать данную статью, а данная статья подошла к концу.
Настройка оформления модулей
- 06.01.2006
Среди вопросов, посвященных оформлению сайтов на Joomla, часто встречается такие: «как изменить оформление у конкретных модулей?» и «как изменить цвет заголовков определенных модулей?». В этой статье мы расскажем вам, как правильно использовать альтернативное оформление модулей.
Как правило, все модули берут общее оформление из класса table.moduletable, оформление заголовка модуля — соответственно из класса table.moduletable th и оформление «тела» модуля — из класса table.moduletable td. Также может существовать еще класс table.moduletable ul, который заведует оформлением списков в модулях.
Шаг 1. Создаем альтернативные стили оформления
- В файле css шаблона, в котором вы хотите применить альтернативное оформление модулей, находим все, что начинается с table.moduletable и копируем:
table.moduletable { width: 100%; margin-bottom: 10px; border-bottom: 1px solid #FFFFFF; } table.moduletable th { height: 20px; vertical-align: middle; background-color: #BB0000; border-bottom: 2px solid #FFFFFF; } table.moduletable td { background-color: #5F68A0; } - Добавляем в скопированные классы суффикс (например -alt).
Важно: суффикс может быть любым, главное, чтоб он был прописан латинскими буквами через дефис или подчеркивание (дефис или подчеркивание нужны для того, чтоб вы сами не путались).
table.moduletable-alt { width: 100%; margin-bottom: 10px; } table.moduletable-alt th { height: 20px; vertical-align: middle; background-color: #BB0000; border-bottom: 2px solid #FFFFFF; } table.moduletable-alt td { background-color: #DEDEDE; }
В классе с суффиксом -alt мы убрали нижний бордюр и заменили цвет бэкграунда в оформлениии «тела» модуля. Теперь у нас имеются как бы два разных CSS-класса, отвечающих за оформление модулей, но реально Joomla пока еще выглядит по-старому, как будто бы мы ничего не добавляли.
Шаг 2. Назначаем альтернативное оформление модулю
Теперь мы должны разобраться, как сделать так, чтобы некоторые модули оформлялись при помощи созданного нами альтернативного класса.
- Авторизуемся в административной панели Джумла
- Выбираем пункт меню Модули->Модули сайта (Modules->Site modules)
- Выбираем в списке модуль, к которому мы хотим применить альтернативное оформление и нажимаем кнопку «Изменить» (Edit)
- В качестве значения параметра Суффикс класса CSS (Module Class Suffix) указываем -alt (именно так, начиная с дефиса или подчеркивания — в зависимости от того, что вы использовали в css)
- Нажимаем кнопку «Сохранить»
В заключение хочется отметить, что количество альтернативных стилей может быть неограниченным. Главное, не запутайтесь в суффиксах и собственном css.
Создание нового стиля модуля,
4.0 из
5
основанный на
3 голосах.

Стили модуля определяют его форму и внешний вид. Например, вы можете создавать различные стили модуля, такие как красный модуль, синий, с тенью, без without, и т.д. Стили модуля определены в файле /layouts/module.php.
Если вы хотите добавить новые стили для модуля, вы можете переопределить файл по умолчанию module.php. Просто скопируйте файл /layouts/module.php в /styles/YOUR_STYLE/layouts/module.php.
Теперь давайте посмотрим, как работает файл modules.php. Откройте его и посмотрите на строки приблизительно от 50 до 75. Вот пример:
// set module template using the style
switch ($style) {
case 'line':
$template = 'default-1';
$style = 'mod-'.$style;
$style .= ($color) ? ' mod-line-'.$color : '';
$split_color = 1;
$subtitle = 1;
$title_template = '<h3 class="title">%s</h3>';
break;
case 'dropdown':
$template = 'dropdown';
$subtitle = 1;
break;
case 'raw':
$template = 'raw';
break;
default:
$template = 'default-1';
$style = $suffix;
$title_template = '<h3 class="title">%s</h3>';
}
Определения
Каждый случай определяет стиль модуля. Давайте посмотрим, что означает код:
case ‘line’:
Это имя стиля модуля. В Joomla вы можете загрузить модуль с помощью суффикса класса модуля. Например: style-line
$template = ‘default-1’;
Шаблоны, определяющие HTML разметку нужную вам, чтобы создать собственный стиль модуля. Шаблоны находятся в /warp/layouts/modules/templates.
$style = ‘mod-‘.$style;
Здесь мы устанавливаем класс CSS для стиля модуля. Например .mod-line
$style .= ($color) ? ‘ mod-line-‘.$color : »;
Если вы хотите создать цветовые вариации вашего стиля модуля, вам нужны дополнительные классы CSS. Например .mod-line-blue
$split_color = 1;
Необязательно и только для опытных пользователей. Если первое слово в заголовке модуля должно быть в элементе span, с цветом в классе CSS, установите этот параметр в 1.
$subtitle = 1;
Необязательно и только для опытных пользователей. Если заголовок модуля должен поддерживать подзаголовки, используя || технику, установите этот параметр в 1.
$title_template = ‘<h3 class=»title»>%s</h3>’;
Определяет HTML разметку для заголовка модуля.
Добавить стиль для пользовательского модуля
Необходимо сделать две вещи. Определить новый стиль модуля в module.php и создать нужные CSS стили в modules.css. Итак, давайте начнем и добавим обработчик в module.php.
Например, мы хотим стиль модуля в виде бокса с шаблоном, который содержит два элемента div:
module.php
case 'box': $template = 'default-2'; $style = 'mod-'.$style; $title_template = '<h3 class="title">%s</h3>'; break;
Теперь давайте добавим немного стиля CSS в module.css
module.css
.mod-box {
border: 1px solid red;
background: white;
padding: 15px;
}
Вот и все. Теперь вы можете загрузить ваш новый стиль модуля в Joomla с помощью суффикса класса модуля style-box.
Для WordPress вам нужно сделать еще одно действие. Откройте файл template.xml и добавьте ваш новый стиль модуля в параметры style:
<setting name="style" type="style" label="Style" nav_menu="false"> <option name="None" value="" /> <option name="Line" value="line" /> <option name="Box" value="box" /> </setting>
Как добавить другой шаблон модуля?
Если вы хотите добавить свой собственный шаблон модуля, вы должны добавить файл шаблона в /layouts/modules/templates. Или, если вы используете свой собственный стиль, скопировать этот файл в /styles/YOUR_STYLE/layouts/modules/templates. Вы можете использовать шаблоны по умолчанию, находящиеся в /warp/layouts/modules/templates как образцы.
0 Пользователей и 1 Гость просматривают эту тему.
- 5 Ответов
- 5188 Просмотров
Здравствуйте!
Помогите пожалуйста разобраться с модульностью в Joomla, и с тем как эти модули редактировать.
Я так понял что в файле шаблона index.php имеется вся структура разрабатываемого сайта. А вот некоторые моменты как модуль поиска, поставленный из Joomla кодируется нестандартным образом, а точнее <jdoc:include type=»modules» name=»user4″ />
Объясните, пожалуйста: каким образом можно сие чудовище развернуть, и редактировать как обычный html- код?
Код модуля редактируется в коде модуля. А то, что вы указали, жестко прописанная позиция для модуля поиска в шаблоне.
Записан
Мелкий ремонт. skype poisk-plus
Хорошо. А тогда где искать эти файлы, где по-русски написано:
<form class=»form-search» method=»get» action=»/search» target=»_blank»>
<input type=»text» name=»q» placeholder=»Поиск» value=»»/>
и файл со стилями для этого элемента?
по ходу решения проблемы, я нашел файл default_form.php в недрах папки components/com_search/views/search/tmpl/
есть мнение о возможности настройки формы поиска в этом файле, но результата никакого.
Подскажите кто может. Я на верном пути?
Для редактирования модуля поиска поэтапно:
Ваш сайт-modules-mod_search-tmpl-default.php
Вот его и меняете
Если необходимо изменить языковые файлы:
Ваш сайт-language-ru-RU-ru-RU.mod_search.sys
Записан
Мелкий ремонт. skype poisk-plus
Спасибо огромное. Сейчас попробую сделать.
-
Offline
MorG
Недавно здесь
- Регистрация:
- 18.06.2010
- Сообщения:
- 3
- Симпатии:
- 0
- Пол:
- Мужской
Много я уже перечитал, но видимо не всё, так и не понял как изменить внешний вид модуля не вмешиваясь в сам модуль.
С компонентами вроде ясно нужно создать папку «html» в папке с шаблоном, а там папку с названием компонента и в ней фалы дублирующие файлы отвечающие за отображение.
В модулях я так понял, что при помощи суффикса класса, но это как-то странно… -
Offline
TroL
Недавно здесь
=> Cпециалист <=- Регистрация:
- 01.03.2011
- Сообщения:
- 502
- Симпатии:
- 34
- Пол:
- Мужской
Чего в этом странного?! что бы отредактировать модуль всетаки придется влесть в модуль точнее в фаил модульtmpldefault.php там смесь хтмл и пхп, думаю хтмл ты знаешь, верстка идет в нем. а потом в ксс-е побавляешь то что надо, ничего сложного
Поделиться этой страницей
Время прочтения
13 мин
Просмотры 2.4K
Joomla 4 «под капотом» претерпела немало изменений относительно предыдущих версий. Её кодовую базу сообщество разработчиков регулярно подтягивают до современных реалий, вводя актуальные технологии в ядро CMS. Так, например, если раньше загрузка классов была вариациями на тему include, то в Joomla 4 появился лоадер, приведённый к PSR-4. Ядро CMS переводится на концепцию сервис-провайдеров, внедрены DI-контейнеры, переработанная система событий для плагинов позволила увеличить производительность при генерации страниц более чем в два раза. Эти изменения влекут за собой изменения в структуре компонентов, модулей и плагинов.
В данной статье пойдёт речь о том, как создать модуль для Joomla 4 с новой структурой файлов и классов. К слову сказать, legacy ещё работает и многие расширения, созданные по канонам Joomla 3 (а не работавшие на Joomla 3, но написанные по канонам Joomla 1.5) ещё долго будут работать на Joomla 4.
Отступление
Я предполагаю, что часть читателей имеет опыт работы с Joomla, но не имеет опыта создания модулей, поэтому постараюсь описать создание модуля как можно подробнее. Статья имеет сугубо прикладной характер, без погружения в теорию ООП и его реализацию в Joomla. Основная цель — подсказать что «делать руками», когда поставлена определённая задача.
Рассказывать о создании модуля я буду на примере своего модуля WT Yandex map items — модуля вывода материалов Joomla на Яндекс.карты по координатам из пользовательских полей, который создавался под проект на Joomla 4, поэтому названия файлов, классов и namespace будут содержать название именно этого модуля. При создании своего модуля, естественно, нужно изменить их на свои.
Файловая структура модуля Joomla 3 vs Joomla 4 и распределение функционала
Было (Joomla 3)
Для создания модуля было необходимо как минимум 3 файла:
-
mod_wtyandexmapitems.xml — описание модуля для установщика расширений Joomla (системное имя, дата, версия, сайт разработчика и т.д.), параметры конфигурации, сервер обновлений и т.д.
-
mod_wtyandexmapitems.php — «точка входа» в модуль. С этого файла начинается работа Вашего кода.
-
tmpl/default.php — макет вывода для модуля. Здесь находится HTML-вёрстка Вашего модуля. При необходимости, можно скопировать и переименовать этот файл, изменить вывод HTML по своему вкусу и выбрать в настройках свой новый макет вывода.
Этот же способ позволяет выполнять любой свой PHP-код в нужном месте и в нужное время.
Именно такую структуру мы видим в одном из простейших модулей Joomla — mod_custom — «HTML-код».
Хелпер (helper) модуля Joomla
Если наш модуль делает что-то более сложное, чем просто вывод значений из настроек модуля, например:
-
отображает список новых статей на сайте;
-
показывает карусель товаров из компонента интернет-магазина;
-
выводит популярные комментарии или фотографии из фото-галереи ;
-
подтягивает данные модуля по ajax (ajax-корзина товаров, к примеру).
то все функции, выполняющие эту работу, помещаются в хелпер модуля. В Joomla 3 он помещался в файл helper.php, находящийся рядом с основным php-файлом. Подключение хелпера было в «точке входа» с помощью JLoader::register('ModWtyandexmapitemsHelper', __DIR__ . '/helper.php');
Стало (Joomla 4)
Для создания модуля в Joomla 4 нужны следующие файлы (с меньшим количеством можно поэкспериментировать спортивного интереса ради):
Файл mod_wtyandexmapitems.xml
Этот файл содержит описание модуля для установщика расширений Joomla (системное имя, дата, версия, сайт разработчика и т.д.), параметры конфигурации, сервер обновлений, а также задаёт Namespace модуля и директории для автозагрузки классов.
<?xml version="1.0" encoding="utf-8"?>
<extension type="module" client="site" method="upgrade">
<name>MOD_WTYANDEXMAPITEMS</name>
<author>Sergey Tolkachyov</author>
<creationDate>13/09/2022</creationDate>
<copyright>(C) 2022 Sergey Tolkachyov.</copyright>
<license>GNU General Public License version 2 or later</license>
<authorEmail>info@web-tolk.ru</authorEmail>
<authorUrl>https://web-tolk.ru</authorUrl>
<version>1.0.0</version>
<description>MOD_WTYANDEXMAPITEMS_DESC</description>
<namespace path="src">JoomlaModuleWtyandexmapitems</namespace>
<files>
<folder module="mod_wtyandexmapitems">src</folder>
<folder>language</folder>
<folder>services</folder>
<folder>tmpl</folder>
</files>
<languages>
<language tag="en-GB">language/en-GB/mod_wtyandexmapitems.ini</language>
<language tag="en-GB">language/en-GB/mod_wtyandexmapitems.sys.ini</language>
<language tag="ru-RU">language/ru-RU/mod_wtyandexmapitems.ini</language>
<language tag="ru-RU">language/ru-RU/mod_wtyandexmapitems.sys.ini</language>
</languages>
</extension>
Также обратите внимание, что для корректной установки и работы модуля нужно указывать атрибут module="mod_wtyandexmapitems" в xml-манифесте. Если в Joomla 3 этот атрибут указывался для файла «точки входа» (<filename module="mod_wtyandexmapitems">mod_wtyandexmapitems.php</filename>), то сейчас он указывается для папки src модуля — <folder module="mod_wtyandexmapitems">src</folder> .
Ещё одно нововведение связано с языковыми файлами: теперь в именах файлов не обязательно дублировать префикс языка — «ru-RU.mod_wtyandexmapitems.ini». Достаточно того, что файл лежит в папке «ru-RU».
Файл services/provider.php
Файл — сервис-провайдер Вашего модуля. Он сообщает Joomla, что Ваш модуль существует и регистрирует namespace модуля в глобальном пространстве имён.
<?php
/**
* @package WT Yandex Map items
*
* @copyright (C) 2022 Sergey Tolkachyov
* @link https://web-tolk.ru
* @license GNU General Public License version 2 or later
*/
defined('_JEXEC') or die;
use JoomlaCMSExtensionServiceProviderHelperFactory;
use JoomlaCMSExtensionServiceProviderModule;
use JoomlaCMSExtensionServiceProviderModuleDispatcherFactory;
use JoomlaDIContainer;
use JoomlaDIServiceProviderInterface;
/**
* The WT Yandex map items module service provider.
*
* @since 1.0.0
*/
return new class implements ServiceProviderInterface
{
/**
* Registers the service provider with a DI container.
*
* @param Container $container The DI container.
*
* @return void
*
* @since 4.0.0
*/
public function register(Container $container)
{
// Основной namespace модуля
$container->registerServiceProvider(new ModuleDispatcherFactory('\Joomla\Module\Wtyandexmapitems'));
// Namespace модуля для хелпера
$container->registerServiceProvider(new HelperFactory('\Joomla\Module\Wtyandexmapitems\Site\Helper'));
// Namespace модуля для своих типов полей
$container->registerServiceProvider(new HelperFactory('\Joomla\Module\Wtyandexmapitems\Site\Fields'));
$container->registerServiceProvider(new Module);
}
};
Некоторые модули для Joomla могут быть довольно сложными, использовать дополнительные PHP-библиотеки и SDK, поэтому в папке src модуля могут быть самые разные Namespace, которые можно зарегистрировать в сервис-провайдере, дабы они были доступны глобально. Однако, я предпочитаю библиотеки оформлять отдельными расширениями Joomla и устанавливать их в папку libraries в корне сайта, а обращаться к ним уже по namespace. Это удобно для тех случаев, когда не одно Ваше расширение использует данную библиотеку, а несколько. В таком случае для библиотеки потребуется системный плагин, регистрирующий её namespace в глобальном пространстве имён.
Берём на заметку, что в Namespace указывается «клиент» модуля — «Site» или «Administrator».
Файл src/Dispatcher/Dispatcher.php
Этот файл используется для того, чтобы передать данные из хелпера модуля в макет (layout).
<?php
/**
* @package WT Yandex Map items
*
* @copyright (C) 2022 Sergey Tolkachyov
* @link https://web-tolk.ru
* @license GNU General Public License version 2 or later
*/
namespace JoomlaModuleWtyandexmapitemsSiteDispatcher;
defined('JPATH_PLATFORM') or die;
use JoomlaCMSApplicationCMSApplicationInterface;
use JoomlaCMSDispatcherAbstractModuleDispatcher;
use JoomlaCMSExtensionModuleInterface;
use JoomlaInputInput;
use JoomlaModuleWtyandexmapitemsSiteHelperWtyandexmapitemsHelper;
use JoomlaRegistryRegistry;
/**
* Dispatcher class for mod_wtyandexmapitems
*
* @since 1.0.0
*/
class Dispatcher extends AbstractModuleDispatcher
{
/**
* The module extension. Used to fetch the module helper.
*
* @var ModuleInterface|null
* @since 1.0.0
*/
private $moduleExtension;
public function __construct(stdClass $module, CMSApplicationInterface $app, Input $input)
{
parent::__construct($module, $app, $input);
$this->moduleExtension = $this->app->bootModule('mod_wtyandexmapitems', 'site');
}
/**
* Returns the layout data.
*
* @return array
*
* @since 1.0.0
*/
protected function getLayoutData()
{
$data = parent::getLayoutData();
// Вариант использования хелпера через Namespace
$data['placemarks'] = (new WtyandexmapitemsHelper)->getPlacemarks($data['params'], $this->getApplication());
// ИЛИ
// Вариант использования хелпера через $this->moduleExtension,
// который мы загрузили в конструкторе класса
$helper = $this->moduleExtension->getHelper('WtyandexmapitemsHelper');
// ИЛИ
// Вариант использования хелпера напрямую из этого метода,
// не загружая модуль в $this->moduleExtension.
// Тогда строка $this->moduleExtension в __construct() не нужна.
$helper = $this->app->bootModule('mod_wtyandexmapitems', 'Site')->getHelper('WtyandexmapitemsHelper');
$data['placemarks'] = $helper->getPlacemarks($data['params'], $this->getApplication());
return $data;
}
}
Особый интерес для нас представляет функция getLayoutData(), так как именно в ней мы обращаемся к методам нашего хелпера модуля и помещаем полученные данные в массив $data. Ключ массива $data может быть любым и может быть не единственным. Можно провести параллель с Model в MVC, когда мы из разных мест собираем данные и передаём их для отображения.
В хелпере модуля можно собрать один результирующий массив данных и в диспетчере передать на рендер только его (обратившись только к одному методу хелпера — точке входа в хелпер). А можно обращаться к разным методам хелпера в диспетчере, присваивая данные разным элементам массива $data. Подход к реализации Вы выбираете сами, распределяя функционал между этими двумя файлами.
Файл src/Helper/WtyandexmapitemsHelper.php
Хелпер модуля. Имя файла = имя модуля без суффикса «mod_» + Helper (с заглавной буквы).
Namespace хелпера — JoomlaModuleWtyandexmapitemsSiteHelper. Вместо «Site» может быть «Administrator», если у Вас модуль для панели администратора, например для дашбордов Joomla 4. Имя класса совпадает с именем файла. Внутри — нужные Вам функции.
<?php
/**
* @package WT Yandex Map items
*
* @copyright (C) 2022 Sergey Tolkachyov
* @link https://web-tolk.ru
* @license GNU General Public License version 2 or later
*/
namespace JoomlaModuleWtyandexmapitemsSiteHelper;
use JoomlaCMSAccessAccess;
use JoomlaCMSComponentComponentHelper;
use JoomlaCMSFactory;
use JoomlaCMSHelperModuleHelper;
use JoomlaCMSHTMLHTMLHelper;
use JoomlaCMSLanguageText;
use JoomlaCMSLayoutFileLayout;
use JoomlaCMSRouterRoute;
use JoomlaCMSUriUri;
use JoomlaComponentContentSiteHelperRouteHelper;
use JoomlaComponentFieldsAdministratorHelperFieldsHelper;
use JoomlaRegistryRegistry;
defined('_JEXEC') or die;
/**
* Helper for mod_wtyandexmapitems
*
* @since 1.0
*/
class WtyandexmapitemsHelper
{
public function getPlacemarks($params, $app):array
{
/**
* Этот метод мы вызывали в файле
* src/Dispatcher/Dispatcher.php
* в строке
* $data['placemarks'] = (new WtyandexmapitemsHelper)->getPlacemarks($data['params'], $this->getApplication());
*/
}
}
В данном случае в методе getPlacemarks() я получаю с помощью нескольких методов список материалов Joomla 4, их пользовательские поля, выбираю (сообразно настройкам модуля) поле, в котором хранятся координаты, а затем собираю массив со структурой, необходимой для Яндекс карт.
Работа с Ajax в модулях Joomla 4
Если Вашему модулю есть что отдать по ajax на фронт, то для этого нужно в хелпере модуля создать метод getAjax().В нашем случае на Яндекс.карты будет загружаться более 100 меток с текстами и картинками. Поэтому целесообразнее получать эти данные по ajax.
Согласно документации Joomla по использованию ajax Вы можете в запросе указывать конкретный метод хелпера. В таком случае имя метода должно заканчиваться на «Ajax»: например method=mySuperAwesomeMethodToTrigger вызовет метод mySuperAwesomeMethodToTriggerAjax модуля.
Пример ajax-запроса, реализованного нативными средствами Joomla (статья-мануал на Хабре).
Joomla.request({
url: window.location.origin + "/index.php?option=com_ajax&module=wtyandexmapitems&format=raw",
onSuccess: function (response, xhr){
if (response !== ""){
let placemarks = JSON.parse(response);
console.log(placemarks);
objectManager.add(placemarks);
myMap' . $module->id . '.geoObjects.add(objectManager);
}
}
});
}
Файл tmpl/default.php — макет вывода в Joomla
Здесь по-прежнему находится HTML-вёрстка Вашего модуля. Его по-прежнему можно скопировать в ту же папку или в папку с Вашим шаблоном (сделать переопределение), переименовать и изменить вывод HTML, не отказывая себе в самых страшных извращениях и при этом не опасаясь того, что Ваши изменения будут затёрты при обновлении движка.
В файлах макетов вывода, как правило, находится цикл вывода данных foreach.
В Joomla 3 нередко можно было встретить следующую конструкцию:
// Файл "точка входа" модуля mod_menu.php
// $list - массив с пунктами меню, которые передаются в макет вывода
$list = ModMenuHelper::getList($params);
// Файл tmpl/default.php - макет вывода модуля mod_menu
// $list - массив с пунктами меню, которые передаются в макет вывода
foreach ($list as $i => &$item){
// здесь работа по отображению HTML меню, с учетом настроек модуля и данных в массиве
}
В Joomla 4 в принципе осталось то же самое, за небольшими изменениями:
-
данные мы получаем из хелпера и передаём не в «точке входа» (которой теперь нет по определению), а в файле
src/Dispatcher/Dispatcher.php. Те самые$data['placemarks']в макете вывода становятся просто$placemarks. -
«рядом» с Вашими переменными передаются следующие:
-
$module— объект модуля. Оттуда Вы можете взять id модуля ($module->id), заголовок модуля, его позицию и т.д. -
$app— объект приложения. Это значит, что Вам не нужно самостоятельно вызыватьJoomlaCMSFactory::getApplication(). Он уже есть для Вашего удобства. -
$input— также в макете модуля теперь сразу доступен объект Input (через него мы получаем GET, POST параметры, SERVER и т.д.), который раньше приходилось вызывать самостоятельно. -
$params— параметры модуля. Получаем их как раньше:$params->get('param_name' , 'default_value_if_value_is_empty'). Эти параметры мы собираем с помощью различных типов полей Joomla в xml-манифесте модуля. -
$template— параметры настроек стиля текущего шаблона. У шаблонов Joomla есть templateDetails.xml, в которых можно задавать различные параметры шаблона: логотипы, шрифты, пользовательские скрипты в <head> и <body> и всё, что душе угодно. Теперь в модуле Вы имеете возможность без лишних шевелений получить доступ к этим параметрам. Однако, стоит помнить, что многие студийные шаблоны (JoomShaper Helix и иже с ними) не используют стандартное место хранение параметров, поэтому там может оказаться пусто.
-
Свои типы полей Joomla для модуля
Как и в Joomla 3, в Joomla 4, если Вам не хватает стандартных типов полей, у Вас есть возможность создавать свои типы полей. Это могут быть нестандартные выборки из базы данных, получение значений списка из сторонних сервисов по API и т.д.
Возможность создавать свои пользовательские типы полей открывает широкие возможности Joomla. Наглядный пример:
Joomla 3
В Joomla 3 Вам надо было указать свой тип поля и назначить атрибут addfieldpath родительскому <fieldset> или напрямую <field>. Например
<field addfieldpath="modules/mod_wtyandexmapitems/fields" type="moduleinfo" name="moduleinfo"/>
Php-файл поля находится в папке с модулем modules/mod_wtyandexmapitems/fields.
Joomla 4
В Joomla 4 атрибут addfieldpath не работает. Вместо него используется атрибут addfieldprefix, в котором нужно указать namespace для пользовательских полей модуля.
Поля мы складываем в src/Fields. У файлов полей должен быть namespace namespace JoomlaModuleWtyandexmapitemsSiteFields. Я использую собственный тип поля, расширяющий тип поля spacer (пробел), для вывода своего логотипа, версии модуля, ссылки на сайт и иногда дополнительной информации.
<field type="moduleinfo" addfieldprefix="JoomlaModuleWtyandexmapitemsSiteFields" name="moduleinfo"/>
А вот пример использования в Joomla 3. Плагин для двухсторонней интеграции Joomla с CRM Битрикс 24 в настройках показывает информацию об аккаунте, из-под которого создан вебхук на стороне Битрикс 24. Если информация отображается, значит плагин настроен верно.
А здесь в настройках плагина отображается список стадий лида (или сделки), получаемый по API из CRM Битрикс 24. Это так же реализовано с помощью пользовательских типов полей (пример из версии для Joomla 3).
Гибридный вариант модуля
Если у Вас совсем нет времени, а завести «со шморгалкой» старый модуль на Joomla 4 всё-таки надо, поддерживается (пока что) как старый, так и гибридный вариант структуры модуля.
-
Пока что можно обойтись без сервис-провайдера. Вообще. Тогда нужен файл «точки входа»
mod_wtyandexmapitems.phpи соответствующая строка в xml-манифесте модуля. -
Пока что можно обойтись без папки src. И подключать хелпер по старинке через
JLoader::register('ModWtyandexmapitemsHelper', __DIR__ . '/helper.php'). Соответственно файл helper.php должен лежать рядом с «точкой входа» в модуль. -
Можно переместить хелпер в папку
src, переименовать файл, назначить ему namespace (и в xml-манифесте модуля тоже) и использовать в «точке входа» простоuse JoomlaModuleWtyandexmapitemsSiteHelperWtyandexmapitemsHelper— namespace хелпера. На момент написания статьи большая часть даже стандартных модулей Joomla переделана именно так, с частичным сохранением старой структуры. Полностью новым канонам пока что соответствует лишь модуль панели управленияmod_quickicon— иконок быстрого доступа.
Полезные дополнения
Об использовании JoomlaCMSFactory
Из статьи Распространенные ошибки при написании плагинов Joomla 4
Вы должны использовать ТОЛЬКО ДВА метода JoomlaCMSFactory в Joomla 4:
-
getContainer()— возвращает контейнер внедрения зависимостей Joomla (DI Container, иногда сокращенно DIC). -
getApplication()— возвращает текущий объект приложения Joomla, обрабатывающий запрос.
Всё. Больше ничего другого использовать не нужно! Всё остальное предоставляется либо через DI-контейнер, либо через сам объект приложения.
Чтобы получить документ приложения используйте JoomlaCMSFactory::getApplication()->getDocument().
Правильное подключение CSS и JS в Joomla 4
-
Статья Как правильно подключать JavaScript и CSS в Joomla 4
-
Статья на хабре Использование WebAssetsManager Joomla 4 и добавление собственных пресетов с помощью плагина. Мы помним, что все CSS и JS файлы должны лежать в папке
media. Подробнее в статьях.
Замена для популярных, но устаревших методов
Многие из этих методов работали ещё со времен Joomla 1.5 (с 2008 года!).
-
JRequest::getUri()заменяем на $uri =JoomlaCMSUri::getInstance()и читаем документацию к нему. -
методы
JRequest::getCmdи аналогичные перекочевали вJoomlaInputInputили (что проще)$app->getInput(). Пока что поддерживается устаревший синтаксис$app->input, но в Joomla 5 (выйдет осенью 2023 года) он может быть удалён (план выпуска релизов и принципы удаления устаревшего кода в Joomla). -
$app->isAdmin()и$app->isSite()стали$app->isClient('Site')и$app->isClient('Administrator'). -
Подключение к базе данных: вместо
JFactory::getDbo()(илиJoomlaCMSFactory::getDbo) используем$app->getContainer()->get('DatabaseDriver')(‘DatabaseDriver’ регистрозависимый). -
Получение объекта пользователя: вместо
JFactory::getUser()(илиJoomlaCMSFactory::getUser()) используем$app->getIdentity()
Заключение
Буду рад, если статья окажется полезной для разработчиков. Также буду признателен замечаниям и исправлениям, если таковые имеются у читателей.
Полезные ресурсы
Ресурсы сообщества:
-
форум русской поддержки Joomla.
-
интернет-портал Joomla-сообщества.
-
https://vc.ru/s/1146097-joomla — Сообщество Joomla на VC.
Telegram:
-
Чат сообщества «Joomla! по-русски».
-
Joomla для профессионалов, разработчики Joomla.
-
Новости о Joomla! и веб-разработке по-русски.
-
Вакансии и предложения работы по Joomla: фуллтайм, частичная занятость и разовые подработки. Размещение вакансий здесь.
-
Англоязычный чат сообщества.
-
Новости Joomla! по-английски






































