Лекция 8. Файл-манифест
Структура манифеста
Для каждого расширения Joomla может существовать файл-манифест. Манифест - это файл XML, содержащий метаданные о расширении, данные для установки и/или описание его настроек. Манифест должен называться <имя расширения>.xml и находиться в корневой директории установочного пакета.
Иерархия элементов в манифесте приведена на рис. 8.1.


Рис. 8.1. Иерархия элементов в файле-манифесте
Корневым тегом манифеста является тег <extension></extension>. Он может иметь следующие атрибуты:
| type | - тип расширения: component, file, language, library, module, package, plugin; |
| version | - версия Joomla, для которой написано расширение: 1.6, 2.5 и т.д.; |
| method | - будут ли при установке перезаписаны файлы расширения, если они уже существуют: upgrade (да), new (сообщить в таком случае об ошибке); |
| client | - для модулей: задает, предназначен этот модуль для бэкенда (administrator) или фронтенда (site); |
| group | - для плагинов: группа. |
Внутри тега <extension> в первую очередь обычно задаются метаданные: <name>, <author>, <copyright>, <license>, <authorEmail>, <authorUrl>, <version>, <description>, однако их можно опустить.
Элемент <scriptfile> задает PHP-скрипт, который будет выполнен до, во время и/или после установки, удаления или обновления расширения. Этот скрипт должен содержать класс <префикс><имя расширения>IntallerScript, где префикс зависит от типа расширения (com_, mod_ и т.д.). Данный класс должен содержать следующие public-методы:
__constructor(JAdapterInstance $adapter); bool preflight(string $route, JAdapterInstance $adapter); bool postflight(string $route, JAdapterInstance $adapter); bool install(JAdapterInstance $adapter); bool update(JAdapterInstance $adapter); bool uninstall(JAdapterInstance $adapter);
где
| adapter | - объект, отвечающий за запуск этого скрипта; |
| $route | - какое событие происходит: install, uninstall, discover_install. Событие discover_install происходит при поиске расширений из менеджера расширений в панели управления (эта функция Joomla позволяет установить расширения, файлы которых предварительно были загружены на сайт вручную). |
Методы preflight() и postflight() будут вызваны соответственно до и после установки/удаления/обновления расширения.
Элементы <install> и <uninstall> задают SQL-скрипты, которые должны быть выполнены при установке и удалении расширения. Таким путем в базе данных создаются таблицы, хранящие данные, использующиеся расширением. Атрибут folder задает папку, в которой находятся эти скрипты в установочном пакете, например, "admin". В эти элементы должен быть вложен элемент <sql>, содержащий по одному элементу <file> для каждого файла SQL. Атрибуты тега <file>: driver - драйвер базы данных и charset - кодировка базы данных. Например:
<install>
<sql>
<file driver="mysql" charset="utf8">sql/install.sql</file>
</sql>
</install>
<uninstall>
<sql>
<file driver="mysql" charset="utf8" folder="sql">sql/uninstall.sql</file>
</sql>
</uninstall>
Элемент <files> задает список файлов, которые должны быть скопированы при установке расширения в соответствующую директорию во фронтенде. Для каждого файла добавляется вложенный элемент <filename>, для каждой папки - <folder>, причем содержимое папки уже не описывается. Пример для типичного компонента MVC:
<files folder="site"> <folder>models</folder> <folder>views</folder> <folder>controllers</folder> <filename>mycomponent.php</filename> <filename>router.php</filename> </files>
Языковые файлы описываются внутри элемента <languages>. В установочном пакете эти файлы должны находиться в папке /language/<код языка>. Для каждого из них создается вложенный элемент <language> с атрибутом tag, содержащим код языка в формате <ln-LN>:
<languages folder="site">
<language tag="ru-RU">language/ru-RU/ru-RU.com_mycomponent.ini</language>
</languages>
Медиа-файлы - изображения, файлы Javascript и CSS, флэш - описываются внутри элемента <media>. Атрибут destination задает название папки, в которую будут скопированы перечисленные файлы. Эта папка должна находиться внутри папки /media в корне сайта. Если она не существует, то будет создана при установке расширения.
<media destination="com_mycomponent"> <folder>css</folder> <folder>images</folder> <folder>js</folder> <filename>pic1.jpg</filename> </media>
Файлы-манифесты компонентов могут включать элемент <administration>. Он содержит такие же элементы <languages> и <files>, как и описанные ранее, а также элементы для описания меню компонента в панели управления: <menu> и <submenu>.
Элемент <menu>, вложенный непосредственно в <administration>, описывает пункт в меню "Компоненты", ссылающийся на главную страницу бэкенда компонента. Атрибутом может быть img - относительный путь к пиктограмме пункта меню (по умолчанию будет присвоено значение "class:component").
Элемент <submenu> может содержать несколько вложенных элементов <menu>, описывающих подпункты этого пункта меню. У таких вложенных тегов <menu> может быть несколько атрибутов, среди которых в первую очередь отметим img и link - ссылка, переход по которой произойдет при щелчке на данном пункте меню. Если ссылка задана, то итоговый URL будет сформирован как index.php?<ссылка>. Если же атрибут link не задан, то установщик проверит наличие следующих атрибутов этого же тега: act, task, controller, view, layout, sub и добавит к строке "index.php?option=com_<имя компонента>&" соответствующие пары "имя-значение", разделенные амперсандом. Например, следующие элементы описывают пункт меню с одной и той же ссылкой index.php?option=com_mycomponent&task=edit:
<menu task="edit">COM_MYCOMPONENT_EDIT</menu> <menu link="option=com_mycomponent&task=edit">COM_MYCOMPONENT_EDIT</menu>
Текст пункта меню задается внутри тега <menu> и обязательно должен быть ключом, значение которого должно быть переведено в языковом файле, обычно - /administrator/languages/<код языка>/<код языка>.com_<имя компонента>.sys.ini.
Элемент <config> описывает настройки расширения. Обратите внимание, что для компонентов этот элемент должен находиться не в файле-манифесте, а в отдельном файле config.xml в корневой директории бэкенда компонента. Для модулей <config> располагается в файле-манифесте и вложен в тег <extension>.
В <config> может быть вложен элемент <fields>. Его атрибут addfieldpath позволяет задать папку, в которой находится файл, определяющий собственный тип поля.
В <fields> или непосредственно в <config> вложен элемент <fieldset>, соответствующий HTML-элементу <fieldset>. Каждый <fieldset> - это группа элементов формы редактирования свойств расширения, например: "Основные настройки", "Расширенные настройки" и т.д. Атрибут name задает имя этого элемента, label - отображаемый текст.
Вложенные в <fieldset> элементы <field> задают поля формы. Каждый <field> соответствует одной настройке расширения. Допустимые атрибуты:
| name | - имя |
| type | - тип |
| default | - значение по умолчанию |
| label | - текст, который будет выводиться рядом с соответствующим элементом управления на форме |
| description | - описание, которое будет выводиться во всплывающей подсказке. |
Некоторые стандартные типы полей:
| calendar | - текстовое поле, рядом с которым выводится пиктограмма для вывода календаря; |
| category | - выпадающий список категорий; |
| editors | - выпадающий список доступных WYSIWYG-редакторов; |
| filelist | - выпадающий список файлов из заданной директории; |
| folderlist | - выпадающий список папок из заданной директории; |
| imagelist | - выпадающий список файлов изображений из заданной директории; |
| languages | - выпадающий список установленных языковых файлов фронтенда или бэкенда; |
| list | - выпадающий список каких-либо строк; |
| password | - поле для ввода пароля; |
| radio | - переключатель; |
| spacer | - разделитель; |
| sql | - выпадающий список элементов, полученных в результате выполнения заданного SQL-запроса; |
| text | - текстовое поле; |
| textarea | - многострочное текстовое поле; |
| timezones | - список часовых поясов. |
Для списков и переключателей в тег <field> должны быть вложены несколько элементов <option>, задающих значения, из которых пользователь может выбрать.
Например, так описывается выпадающий список для выбора порядка сортировки - по возрастанию или по убыванию:
<field name="entries_order" type="list" default="DESC" label="COM_MYCOMPONENT_ENTRIES_ORDER" description="COM_MYCOMPONENT_ENTRIES_ORDER_DESC"> <option value="DESC">COM_MYCOMPONENT_ENTRIES_ORDER_DESC</option> <option value="ASC">COM_MYCOMPONENT_ENTRIES_ORDER_ASC</option> </field>
Для таких элементов, как filelist, folderlist, imagelist, вложенные элементы <option> не нужны, т.к. список значений определяется исходя из атрибутов этих тегов. Например, выпадающий список для выбора одного из доступных WYSIWYG-редакторов описывается так:
<field name="editors" type="editors" label="COM_MYCOMPONENT_EDITOR" />
Для создания собственного типа поля необходимо создать файл <имя типа>.php и в нем описать класс, производный от одного из классов подпакета Form: JFormFieldList, JFormFieldMedia и др. (полный список классов см. в документации). В классе должен быть перегружен метод родительского класса, отвечающий за вывод поля формы. Простой пример приведен в документации Joomla.
Практика
В таблицах #__extensions и #__modules, в которые мы добавляли записи о наших расширениях, есть поле params, позволяющий хранить значения параметров. Например, для модуля mod_myquestions в этом поле хранится значение наподобие {"random":"0","items":"3","maxlen":"100","author":"1","date":"1"}. Нетрудно заметить, что данная строка представляет собой совокупность пар "ключ - значение". Таким образом, заданные значения настроек расширений сохраняются в базе данных. Наша задача - предоставить администратору сайта интерфейс для изменения этих значений.
Кроме того, мы создадим установочные пакеты для модуля и для компонента, представляющие собой ZIP-архивы определенной структуры.
Манифест для компонента
Настройки компонента
Зададим два параметра компонента myquestions - адреса электронной почты администратора сайта и эксперта.
Создайте файл /administrator/components/com_myquestions/config.xml:
<?xml version="1.0" encoding="utf-8"?>
<config>
<fieldset name="component" label="COM_MYQUESTIONS_FIELDSETCONFIG_LABEL"
description="COM_MYQUESTIONS_FIELDSETCONFIG_LABEL_DESC">
<field name="email_admin" type="text" label="COM_MYQUESTIONS_FIELD_EMAILADMIN_LABEL"
description="COM_MYQUESTIONS_FIELD_EMAILADMIN_LABEL_DESC" default="admin@mysite.ru"/>
<field name="email_expert" type="text" label="COM_MYQUESTIONS_FIELD_EMAILEXPERT_LABEL"
description="COM_MYQUESTIONS_FIELD_EMAILEXPERT_LABEL_DESC" default="expert@mysite.ru"/>
</fieldset>
</config>
Добавьте в файл /administrator/language/ru-RU/ru-RU.com_myquestions.ini код:
COM_MYQUESTIONS_CONFIGURATION="Настройки системы «вопрос – ответ»" COM_MYQUESTIONS_FIELDSETCONFIG_LABEL="Настройки системы" COM_MYQUESTIONS_FIELDSETCONFIG_LABEL_DESC="Настройки системы" COM_MYQUESTIONS_FIELD_EMAILADMIN_LABEL="E-mail администратора" COM_MYQUESTIONS_FIELD_EMAILADMIN_LABEL_DESC="На этот адрес будут приходить уведомления о новых вопросах, и с этого адреса будут отправляться уведомления экспертам и пользователям" COM_MYQUESTIONS_FIELD_EMAILEXPERT_LABEL="E-mail эксперта" COM_MYQUESTIONS_FIELD_EMAILEXPERT_LABEL_DESC="На этот адрес будут приходить уведомления о новых вопросах, отправленные модератором"
Для отображения в панели инструментов кнопки "Настройки" используется метод JToolBarHelper::preferences(). Измените функцию TOOLBAR_myquestions::_DEFAULT() в файле /administrator/components/com_myquestions/toolbar.myquestions.html.php следующим образом:
function _DEFAULT()
{
JToolBarHelper::title(JText::_('COM_MYQUESTIONS_TOOLBAR_TITLE'), 'generic.png');
JToolBarHelper::editList('reply','COM_MYQUESTIONS_REPLY');
JToolBarHelper::deleteList(JText::_('COM_MYQUESTIONS_TOOLBAR_REMOVE_QUESTIONS_CONFIRMATION'));
JToolBarHelper::preferences('com_myquestions');
}
Теперь на панели инструментов над списком вопросов появилась кнопка "Настройки", при нажатии на которую выводится окно, в котором можно задавать значения настроек компонента ( рис. 8.2).

Рис. 8.2. Кнопка "Настройки" в панели инструментов
Внесем изменения в код компонента, чтобы использовать значения настроек. Измените код функции QuestionController::send() в файле /administrator/components/com_myquestions/controller.php следующим образом:
$mailer =& JFactory::getMailer();
$params = JComponentHelper::getParams($option);
$mailer->setSender($params->get('email_admin','admin@mysite.ru'));
if ($task == 'sendToExpert')
{
$mailer->addRecipient($params->get('email_expert','expert@mysite.ru'));
$mailer->setSubject(JText::_('COM_MYQUESTIONS_NEW_QUESTION'));
$mailer->setBody(JText::sprintf('COM_MYQUESTIONS_EMAIL_EXPERT_BODY',$q));
}
С помощью метода JComponentHelper::getParams() мы получаем объект JParameter, а затем используем его метод get() для получения параметров, задавая значения по умолчанию.
Изменим также код фронтенда. Откройте файл /components/com_myquestions/controller.php и измените функцию QuestionController::addQuestion() следующим образом:
…
$mailer =& JFactory::getMailer();
$option = JRequest::getVar('option','com_myquestions');
$params = JComponentHelper::getParams($option);
$mailer->setSender($params->get('email_admin','admin@mysite.ru'));
$mailer->addRecipient($params->get('email_admin','admin@mysite.ru'));
…
Задайте с помощью кнопки "Настройки" собственные значения адресов электронной почты администратора сайта и эксперта. Добавьте на сайт вопрос, отправьте уведомление о нем эксперту, об ответе - автору вопроса и убедитесь, что в папке <путь к Денверу>/tmp/!sendmail появилось три письма с заданными вами значениями адресов электронной почты в соответствующих полях.
Упаковка компонента
Создайте в любом месте на диске новую папку, а в ней - папки admin и site, а также файл myquestions.xml:
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="1.7">
<name>com_myquestions</name>
<author>Me</author>
<creationDate>2012</creationDate>
<copyright>Copyright (C) 2012 Me</copyright>
<license>GNU General Public License version 2 or later</license>
<authorEmail>admin@mysite.ru</authorEmail>
<authorUrl>www.mysite.ru</authorUrl>
<version>1.7.0</version>
<description>COM_MYQUESTIONS_XML_DESCRIPTION</description>
<install folder="admin">
<sql>
<file driver="mysql" charset="utf8">sql/install.sql</file>
</sql>
</install>
<uninstall folder="admin">
<sql>
<file driver="mysql" charset="utf8">sql/uninstall.sql</file>
</sql>
</uninstall>
<files folder="site">
<filename>controller.php</filename>
<filename>myquestions.html.php</filename>
<filename>myquestions.php</filename>
<filename>router.php</filename>
<folder>models</folder>
<folder>views</folder>
</files>
<languages folder="site">
<language tag="ru-RU">language/ru-RU/ru-RU.com_myquestions.ini</language>
</languages>
<administration>
<menu img="class:component">COM_MYQUESTIONS_MENU</menu>
<submenu>
<menu img="class:component" link="option=com_myquestions">COM_MYQUESTIONS_MENU_QUESTIONS</menu>
<menu img="class:component" link="option=com_myquestions&task=showcat">COM_MYQUESTIONS_MENU_CATEGORIES</menu>
</submenu>
<files folder="admin">
<filename>admin.myquestions.html.php</filename>
<filename>admin.myquestions.php</filename>
<filename>config.xml</filename>
<filename>controller.php</filename>
<filename>toolbar.myquestions.html.php</filename>
<filename>toolbar.myquestions.php</filename>
<folder>tables</folder>
<folder>sql</folder>
</files>
<languages folder="admin">
<language tag="ru-RU">language/ru-RU/ru-RU.com_myquestions.ini</language>
<language tag="ru-RU">language/ru-RU/ru-RU.com_myquestions.sys.ini</language>
</languages>
</administration>
</extension>
Листинг .
Теги, задающие метаданные, такие как author, creationDate и другие, скопированы из файла /modules/mod_myquestions/mod_myquestions.xml.
Тег <install> задает SQL-файл, который будет выполнен при установке компонента. Обратите внимание, что явно указана его кодировка - utf-8 и, следовательно, этот файл нужно будет сохранить в указанной кодировке. Заметьте также, что тег <install> имеет атрибут folder со значением admin, что означает, что инсталлятор будет искать SQL-файл в папке admin установочного пакета. Кроме того, файл задан как sql/install.sql, то есть он находится в папке sql внутри папки admin. Тег <uninstall> имеет аналогичное содержимое.
Далее следует тег files со значением атрибута folder, равным site, т.е. описаны папки и файлы, которые находятся в папке site установочного пакета. Обратите внимание, что содержимое подпапок (models и views) не описывается, указывается только имя подпапки.
Содержимое тега <languages> описывает языковые файлы. Так как задан атрибут site, то эти файлы будут скопированы из папки site установочного пакета.
Оставшуюся часть файла myquestions.xml занимает тег <administration>. Вложенные в него теги <files> и <languages> аналогичны тегам, описывавшим фронтенд, за исключением атрибутов folder, имеющих значение admin. Тег <menu> описывает пункт меню, который появится в меню "Компоненты" панели управления, а также два его подпункта. Обратите внимание, что при задании ссылок для пунктов меню вместо амперсанда необходимо указывать его HTML-эквивалент &.
Добавьте в файл /administrator/language/ru-RU/ru-RU.com_myquestions.sys.ini строки:
COM_MYQUESTIONS="Моя система «вопрос – ответ»" COM_MYQUESTIONS_XML_DESCRIPTION="Моя система «вопрос – ответ»"
В папку admin скопируйте содержимое папки /administrator/components/com_myquestions, а в папку site - /components/com_myquestions.
Кроме того, создайте в папке site папку language, в ней - папку ru-RU. Скопируйте в нее файл ru-RU.com_myquestions.ini из language/ru-RU.
Создайте в папке admin папку language, в ней - папку ru-RU и скопируйте в нее файлы ru-RU.com_myquestions.sys.ini и ru-RU.com_myquestions.ini из /administrator/language/ru-RU.
Наконец, создайте в папке admin подпапку sql, а в ней создайте файлы install.sql и uninstall.sql.
Получившееся дерево папок показано на рис. 8.3.

Рис. 8.3. Дерево папок установочного пакета
В файл install.sql вставьте код
DROP TABLE IF EXISTS `#__myquestions`; DROP TABLE IF EXISTS `#__myquestions_categories`;
CREATE TABLE `#__myquestions`
(
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(255) NOT NULL,
`date` DATETIME NOT NULL,
`question` TEXT NOT NULL,
`city` VARCHAR(50) NULL,
`email` VARCHAR(50) NOT NULL,
`IP` VARCHAR(15) NOT NULL,
`id_cat` INT NOT NULL,
`published` TINYINT(1) NULL DEFAULT '1',
`expiration_date` DATETIME NULL DEFAULT '0000-00-00 00:00:00',
`senttoexpert` TINYINT(1) NULL DEFAULT '0',
`answer` TEXT NULL DEFAULT '',
`senttoauthor` TINYINT(1) NULL DEFAULT '0'
);
CREATE TABLE `#__myquestions_categories`
(
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(255) NOT NULL,
`desc` TEXT NOT NULL DEFAULT ''
);
INSERT INTO `#__myquestions_categories`(`name`, `desc`) VALUES('Без категории','');
В сущности, это тот самый код, который использовался нами ранее для создания таблиц, но вместо реального префикса таблиц указан символический. До создания таблиц мы выполняем запросы для удаления таблиц с теми же названиями, если они существуют, чтобы избежать ошибок при переустановке компонента.
В таблицу #__myquestions_categories сразу же вставляется запись для категории под названием "Без категории". Так как таблица только что создана, эта запись получит id, равный 1, то совпадающий с id категории, который в нашем компоненте присваивается новому вопросу при добавлении.
Запросы из скрипта uninstall.sql удаляют обе таблицы:
DROP TABLE `#__myquestions`; DROP TABLE `#__myquestions_categories`;
Упакуйте папки admin, site и файл myquestions.xml в архив com_myquestions.zip. Установочный пакет компонента готов. Для проверки его работоспособности создайте новую установку Joomla и установите на нее ваш компонент с помощью менеджера расширений в панели управления.
Манифест для модуля
Настройки модуля
Создайте файл /modules/mod_myquestions/mod_myquestions.xml:
<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="1.7">
<name>mod_myquestions</name>
<author>Me</author>
<creationDate>2012</creationDate>
<copyright>Copyright (C) 2012 Me</copyright>
<license>GNU General Public License version 2 or later</license>
<authorEmail>admin@mysite.ru</authorEmail>
<authorUrl>www.mysite.ru</authorUrl>
<version>1.7.0</version>
<description>MOD_MYQUESTIONS_XML_DESCRIPTION</description>
<config>
<fields name="params">
<fieldset name="basic">
<field name="random" type="radio" default="0" label="MOD_MYQUESTIONS_RANDOMIZE_LABEL"
description="MOD_MYQUESTIONS_RANDOMIZE_LABEL_DESC">
<option value="0">JNO</option>
<option value="1">JYES</option>
</field>
<field name="items" type="text" default="1" label="MOD_MYQUESTIONS_ITEMS_LABEL"
description="MOD_MYQUESTIONS_ITEMS_LABEL_DESC"/>
<field name="maxlen" type="text" default="100" label="MOD_MYQUESTIONS_MAXLEN_LABEL"
description="MOD_MYQUESTIONS_MAXLEN_LABEL_DESC"/>
<field name="author" type="radio" default="1" label="MOD_MYQUESTIONS_AUTHOR_LABEL"
description="MOD_MYQUESTIONS_AUTHOR_LABEL_DESC">
<option value="0">JNO</option>
<option value="1">JYES</option>
</field>
<field name="date" type="radio" default="1" label="MOD_MYQUESTIONS_DATE_LABEL"
description="MOD_MYQUESTIONS_DATE_LABEL_DESC">
<option value="0">JNO</option>
<option value="1">JYES</option>
</field>
</fieldset>
</fields>
</config>
</extension>
Значения атрибутов тега <extension> определяют, что расширение, для которого написан этот манифест, - это модуль и что он написан для Joomla 1.7.
Описаны пять параметров модуля, три из которых - random, author и date - являются переключателями, а остальные два - items и maxlen - текстовыми полями. Для переключателей с помощью тега <option> задаются все возможные значения.
Теперь создайте языковой файл для модуля /language/ru-RU/ru-RU.mod_myquestions.ini:
MOD_MYQUESTIONS_XML_DESCRIPTION="Выводит вопросы из системы Вопрос - ответ" MOD_MYQUESTIONS_RANDOMIZE_LABEL="Случайный вопрос" MOD_MYQUESTIONS_RANDOMIZE_LABEL_DESC="Выводить один случайный вопрос?" MOD_MYQUESTIONS_ITEMS_LABEL="Количество вопросов"; MOD_MYQUESTIONS_ITEMS_LABEL_DESC="Сколько вопросов выводить?" MOD_MYQUESTIONS_MAXLEN_LABEL="Длина вопроса" MOD_MYQUESTIONS_MAXLEN_LABEL_DESC="Сколько первых символов вопроса отображать?" MOD_MYQUESTIONS_AUTHOR_LABEL="Автор вопроса" MOD_MYQUESTIONS_AUTHOR_LABEL_DESC="Выводить имя автора?" MOD_MYQUESTIONS_DATE_LABEL="Дата вопроса" MOD_MYQUESTIONS_DATE_LABEL_DESC="Выводить дату написания вопроса?"
В панели управления перейдите в "Расширения" - "Менеджер модулей". Выберите из списка модуль "Новые вопросы", и в правой части открывшейся страницы будет отображена группа элементов формы для установки параметров модуля ( рис. 8.4).

Рис. 8.4. Установка параметров модуля
Упаковка модуля
Для упаковки модуля добавьте в файл /modules/mod_myquestions/mod_myquestions.xml выделенный код:
<description>MOD_MYQUESTIONS_XML_DESCRIPTION</description>
<files>
<filename module="mod_myquestions">mod_myquestions.php</filename>
<filename>mod_myquestions.xml</filename>
</files>
<languages>
<language tag="ru-RU">language/ru-RU/ru-RU.mod_myquestions.ini</language>
<language tag="ru-RU">language/ru-RU/ru-RU.mod_myquestions.sys.ini</language>
</languages>
Создайте в папке /modules/mod_myquestions папку language, в ней - папку ru-RU. Скопируйте в нее файл ru-RU.mod_myquestions.ini из папки language/ru-RU. Создайте файл /modules/mod_myquestions/language/ru-RU/ru-RU.mod_myquestions.sys.ini:
MOD_MYQUESTIONS="Новые вопросы" MOD_MYQUESTIONS_XML_DESCRIPTION="Выводит вопросы из системы Вопрос - ответ"
Создайте из содержимого папки /modules/mod_myquestions архив mod_myquestions.zip. Это и есть установочный пакет для модуля. Обратите внимание, что в архиве должно находиться именно содержимое папки mod_myquestions, а не сама эта папка.
Ключевые термины
Манифест - файл XML, содержащий метаданные о расширении, данные для установки и/или описание его настроек.
Краткие итоги
Для каждого расширения Joomla может существовать файл-манифест, содержащий метаданные о расширении, данные для установки и/или описание его настроек. Манифест должен называться <имя расширения>.xml и находиться в корневой директории установочного пакета.
Настройки расширения описаны для модулей непосредственно в манифесте, а для компонентов - в отдельном файле config.xml в корневой директории бэкенда компонента.
Установочные пакеты для модуля и для компонента представляют собой ZIP-архивы определенной структуры.
Для компонента установочный пакет включает манифест и папки admin и site, содержащие файлы и папки бэкенда и фронтенда соответственно и, возможно, некоторые дополнительные файлы и папки, например, SQL-скрипты.
Для модуля установочный пакет просто включает все его папки и файлы.
Вопросы
- Какие данные содержит манифест расширения Joomla?
- Где описаны настройки модулей и компонентов?
- Какова структура установочного пакет для модуля и для компонента?
Упражнения
Адаптируйте код из раздела "Практика" для своего варианта (см. список вариантов в "Варианты заданий для лабораторных работ" ).
Заключение
В рамках курса были рассмотрены основы программирования под CMS Joomla. Были предложены для изучения такие темы, как архитектура Joomla, работа с базой данных, генерация элементов HTML, организация иерархии пунктов меню, создание и отправка электронных писем, генерация SEF-ссылок, основы реализации архитектуры MVC с помощью Joomla, разработка простых модулей, организация постраничного вывода списков, управление навигационной цепочкой, создание манифестов расширений и установочных пакетов. Изучен ряд классов фреймворка Joomla. Таким образом, успешное освоение материалов данного курса достаточно для разработки небольших компонентов и модулей для Joomla.
Общий глоссарий
| JAdministrator | - приложение, управляющее функциями для администрирования Joomla. |
| JApplication | - класс, позволяющий работать с очередью сообщений, осуществлять перенаправление браузера, получать параметры конфигурации сайта, определять тип запущенного приложения Joomla. |
| JController | - абстрактный класс для реализации контроллеров. |
| JDatabase | - абстрактный класс, предоставляющий доступ к соединению с базой данных, создающемуся при инициализации приложения Joomla. |
| JDatabaseQuery | - класс, методы которого совпадают с ключевыми словами языка SQL и позволяют упростить создание сложных SQL-запросов. |
| JDate | - класс для работы с датами. |
| JDocument | - класс для работы с документом. |
| JEditor | - класс для работы с WYSIWYG-редактором. |
| JError | - класс для работы с ошибками. |
| JFactory | - класс Joomla, реализующий паттерн "фабрика" и позволяющий получить доступ к глобальным объектам фреймворка. |
| JHTML | - класс для вывода элементов XHTML. |
| JHTMLBehavior | - поддерживающий класс, который позволяет вывести календарь, дерево элементов, файловый загрузчик и некоторые другие элементы управления. |
| JHTMLEmail | - поддерживающий класс, содержащий метод для скрытия адреса электронной почты в целях его защиты от спам-ботов. |
| JHTMLForm | - поддерживающий класс, содержащий метод, который возвращает код скрытого поля формы для уменьшения риска CSRF-атак. |
| JHTMLGrid | - поддерживающий класс, позволяющий вывести в таблице в панели управления такие элементы, как чекбокс, пиктограмма для переключения состояния "опубликовано"/"не опубликовано", отобразить заголовок столбца как ссылки для сортировки по этому столбцу и др. |
| JHTMLImage | - поддерживающий класс, содержащий методы для поиска изображения в фронтенде и бэкенде. |
| JHTMLList | - поддерживающий класс для создания списков некоторых конкретных значений. |
| JHTMLSelect | - поддерживающий класс для генерации кода списков. |
| JInstallation | - приложение, которое запускается при установке Joomla. |
| JMail | - класс для создания и отправки электронных писем. |
| JMailHelper | - класс для очистки данных перед добавлением к электронному письму и проверки, является ли заданная строка корректным адресом электронной почты. |
| JModel | - абстрактный класс для реализации моделей. |
| JPagination | - класс для вывода элементов формы для разбивки на страницы списков элементов. |
| JPathway | - класс для управления навигационной цепочкой. |
| JRequest | - класс Joomla, использующийся для работы с переменными HTTP-запроса. |
| JRoute | - класс для создания SEF-ссылок. |
| JSite | - приложение, отвечающее за компоновку и отображение фронтенда. |
| JTable | - класс, реализующий паттерн Active Record и использующийся для управления таблицами базы данных. |
| JToolBarHelper | - класс Joomla, содержащий методы, которые генерируют HTML-код для построения кнопок панелей инструментов. |
| JURI | - класс для работы с URI. |
| JUser | - класс для работы с данными о пользователе. |
| JView | - абстрактный класс для реализации представлений. |
| XML-RPC | - приложение, позволяющее администрировать сайт Joomla удаленно. |
| Библиотека | - файл, который требуется для работы фреймворка или сторонних расширений. |
| Бэкенд | - система администрирования сайта. |
| Документ | - буфер, использующийся для хранения содержимого веб-страницы, которая будет показана пользователю после выполнения запроса. |
| Иерархия пунктов меню | - дерево, состоящее из пунктов меню и организованное с помощью вложенных множеств. |
| Ключ | - эквивалент текста, подлежащего переводу. |
| Компонент | - основной тип расширений Joomla, вызов которого происходит при каждом обращении к Joomla. |
| Манифест | - файл XML, содержащий метаданные о расширении, данные для установки и/или описание его настроек. |
| Модуль | - расширение Joomla, использующееся для отображения небольших фрагментов контента, обычно в левой или правой колонке или верхней или нижней областях страницы. |
| Основной метод класса JHTML | - метод JHTML::_(), который вызывает метод, определяющийся его первым параметром, и передает ему свои остальные параметры. |
| Очередь сообщений | - массив строк, которые будут выведены на экран при следующей загрузке какой-либо страницы. |
| Перевод | - строка, содержащая перевод текста, соответствующего заданному ключу, на какой-либо язык. |
| Плагин | - расширение Joomla, позволяющее зарегистрировать функции и классы для обработки каких-либо событий, вызванных Joomla, например, поиск по сайту. |
| Поддерживающие классы | - классы для вывода элементов XHTML и поведений Javascript. |
| Префикс таблиц базы данных | - строка, которая присоединяется к названию каждой таблицы Joomla в базе данных. |
| Приложение | - глобальный объект, использующийся для обработки запросов. |
| Реальный префикс | - то конкретное сочетание символов, которое используется в названиях таблиц базы данных. |
| Регистрация задачи | - сопоставление ее какому-либо методу класса, производного от JController. |
| Связывание | - процесс присвоения каждому полю производного от JTable класса значения элемента массива переменных запроса, так что ключ элемента совпадает с названием поля. |
| Символический префикс | - сочетание "#__" (решетка и два знака подчеркивания), которое используется в запросах вместо реального префикса. |
| Уровень приложения | - часть архитектуры Joomla, которая состоит из приложений, расширяющих абстрактный класс JApplication. |
| Уровень расширений | - часть архитектуры Joomla, которая состоит из расширений фреймворка Joomla и приложений. |
| Уровень фреймворка | - часть архитектуры Joomla, которая обеспечивает ее базовую функциональность с помощью набора библиотек и плагинов и собственно ядра Joomla. |
| Фреймворк Joomla ("ядро") | - набор классов, обеспечивающих базовую функциональность Joomla (JDatabase, JUser, JForm, JEditor и т.д.). |
| Фронтенд | - часть сайта, доступная пользователю. |
| Функция генерации SEF-ссылок | - функция, которая принимает массив элементов HTTP-запроса и возвращает массив сегментов SEF-ссылки. |
| Функция декодирования SEF-ссылок | - функция, которая из массива сегментов SEF-ссылки создает массив переменных HTTP-запроса. |
| Шаблон | - расширение Joomla, отвечающее за внешний вид сайта. |
| Шаблон SEF-ссылок | - последовательность сегментов. |
| Языковый файл | - расширение Joomla, позволяющее представить ее контент на нескольких языках. |
Список сокращений
| CCK | Content Construction Kit | Конструктор контента |
| CMS | Content Management System | Система управления контентом |
| MVC | Model - View - Controller | Архитектура "Модель - Представление - Контроллер" |
| SEF | Search Engine Friendly | Ссылка, удобная для восприятия поисковыми системами |