Создаем файл-скрипт для компонента
Установка, обновление и удаление компонента может потребовать дополнительных операций, которые невозможно достичь основными операциями, описанными в установочном xml-файле. Начиная с версии 2.5 в Joomla появилась такая возможность при помощи файла-скрипта установки/обновления/удаления. Суть в том, что этот файл-скрипт содержит класс, который использует пять методов:
- preflight - исполняется перед установкой и обновлением
- install - исполняется во время установки
- update - исполняется во время обновления
- uninstall - исполняется во время удаления
- postflight - исполняется после установки и обновления
Написание скрипта сводится к тому, что мы должны объявить класс с именем com_ИмяКомпонентаInstallerScript
с этими пятью методами. Естественно, вы можете использовать только один или несколько из этих методов. В качестве примера мы используем все. Создаем в корне директории файл script.php с кодом:
<?php
// Запрет прямого доступа.
defined('_JEXEC') or die;
/**
* Файл-скрипт для компонента HelloWorld.
*/
class Com_HelloWorldInstallerScript
{
/**
* Метод для установки компонента.
*
* @param object $parent Класс, который вызывает этом метод.
*
* @return void
*/
public function install($parent)
{
$parent->getParent()->setRedirectURL('index.php?option=com_helloworld');
}
/**
* Метод для удаления компонента.
*
* @param object $parent Класс, который вызывает этом метод.
*
* @return void
*/
public function uninstall($parent)
{
echo '<p>' . JText::_('COM_HELLOWORLD_UNINSTALL_TEXT') . '</p>';
}
/**
* Метод для обновления компонента.
*
* @param object $parent Класс, который вызывает этом метод.
*
* @return void
*/
public function update($parent)
{
echo '<p>' . JText::sprintf('COM_HELLOWORLD_UPDATE_TEXT', $parent->get('manifest')->version) . '</p>';
}
/**
* Метод, который исполняется до install/update/uninstall.
*
* @param object $type Тип изменений: install, update или discover_install
* @param object $parent Класс, который вызывает этом метод. Класс, который вызывает этом метод.
*
* @return void
*/
public function preflight($type, $parent)
{
echo '<p>' . JText::_('COM_HELLOWORLD_PREFLIGHT_' . strtoupper($type) . '_TEXT') . '</p>';
}
/**
* Метод, который исполняется после install/update/uninstall.
*
* @param object $type Тип изменений: install, update или discover_install
* @param object $parent Класс, который вызывает этом метод. Класс, который вызывает этом метод.
*
* @return void
*/
public function postflight($type, $parent)
{
echo '<p>' . JText::_('COM_HELLOWORLD_POSTFLIGHT_' . strtoupper($type) . '_TEXT') . '</p>';
}
}
Этот скрипт перенаправит пользователя после установки на компонент com_helloworld, а в остальных случаях просто отобразит соответствующее сообщение. В методе update()
мы использовали $parent->get('manifest')->version
для отображения новой версии компонента.
Для того, чтобы скрипт работал, необходимо добавить в наш установочный файл helloworld.xml строки:
<!-- Запускается при установке/удалении/обновлении -->
<scriptfile>script.php</scriptfile>
Добавляем сервер обновлений
Для использования сервера обновлений, нам необходимо добавить информацию в helloworld.xml:
<updateservers>
<!-- Заметка: Не допускается пробелов или переносов строк между тэгам server -->
<server type="extension" priority="1" name="Сайт обновлений компонента Hello World!">http://вашдомен.ru/update/helloworld-update.xml</server>
</updateservers>
Также необходимо разместить на вашем сервере соответствующий xml-файл. В нашем случае по адресу http://вашдомен.ru/update/ должен находиться файл helloworld-update.xml:
<?xml version="1.0" encoding="utf-8"?>
<updates>
<update>
<name>HelloWorld</name>
<description>Компонент Hello World!</description>
<element>com_helloworld</element>
<type>component</type>
<version>0.0.13</version>
<infourl title="Hello World! URL">http://вашдомен.ru</infourl>
<downloads>
<downloadurl type="full" format="zip">http://вашдомен.ru/files/com_helloworld-0.0.13-final.zip</downloadurl>
</downloads>
<maintainer>Вася Пупкин</maintainer>
<maintainerurl>Ваш сайт</maintainerurl>
<targetplatform name="joomla" version="2.5" />
</update>
<update>
<name>HelloWorld</name>
<description>Компонент Hello World!</description>
<element>com_helloworld</element>
<type>component</type>
<version>0.0.13</version>
<infourl title="Hello World! URL">http://вашдомен.ru</infourl>
<downloads>
<downloadurl type="full" format="zip">http://вашдомен.ru/files/com_helloworld-0.0.13-final-j3.zip</downloadurl>
</downloads>
<maintainer>Вася Пупкин</maintainer>
<maintainerurl>Ваш сайт</maintainerurl>
<targetplatform name="joomla" version="3.1" />
</update>
</updates>
Давайте рассмотрим все элементы, которые могут использоваться для раздела update
:
- name
- Название расширения, которое отобразится в колонке "Название" в Менеджере расширений в закладке "Обновление" (обязательно)
- description
- Короткое описание расширения (необязательно). Если вы будете использовать <![CDATA[]]>, то двойные кавычки сломают HTML форматирование
Используйте одинарные кавычки в ваших HTML сущностях - element
- Устанавливаемое название расширения (обязательно)
- type
- Тип расширения (component, module, plugin, и т.д.) (обязательно)
- folder
- Относится к плагинам. Этот тег указывает на то, какой тип плагина устанавливается: content, system, и т.д. (обязательно для плагинов)
- client
- ID расширения, который можно найти в таблице #__extensions. На сегодняшний день это 0 для "site" и 1 для "administrator". Плагины автоматически устанавливаются со значением 0, но вы должны указать значение client для обновления, иначе по умолчанию это 1. Компоненты автоматически устанавливаются со значением 1.
- version
- версия релиза (обязательно)
- infourl
- Адрес, по которому можно найти информацию об обновлении (необязательно). Отображается в Менеджере расширений в закладке "Обновление".
- downloads
- Раздел со списком адресов для скачивания
- downloadurl
- Адрес, с которого происходит скачивание расширения; у тега <downloadurl> есть два обязательных параметра:
type - Тип пакета (полный или обновление)
format - Формат пакета (zip, tar, и т.д.) - tags
- Необязательно (использование неизвестно)
- maintainer
- Поддерживающий расширение (аналогично тегу <author> в манифест файле) (необязательно)
- maintainerurl
- Веб-сайт поддерживающего расширение аналогично тегу <authorUrl> в манифест файле) (необязательно)
- section
- Необязательно (использование неизвестно)
- targetplatform
- Целевая платформа. Обязательны следующие элементы:
name - Название зависимости платформы. Так как мы пишем для Joomla, то здесь всегда будет "joomla"
version - Версия Joomla, которую поддерживает расширение.
Для каждой версии Joomla и для каждой версии вашего расширения необходимо иметь отдельные определения раздела <update>
. Значения element
, type
, client
и folder
должны совпадать с соответствующими значениями в таблице #__extensions
.
На данный момент нам достаточно одного раздела <update>
.
Добавляем языковые константы
Откройте файл admin/language/en-GB/en-GB.com_helloworld.sys.ini и добавьте:
COM_HELLOWORLD_POSTFLIGHT_DISCOVER_INSTALL_TEXT="HelloWorld postlight discover install script"
COM_HELLOWORLD_POSTFLIGHT_INSTALL_TEXT="HelloWorld postflight install script"
COM_HELLOWORLD_POSTFLIGHT_UNINSTALL_TEXT="HelloWorld postflight uninstall script"
COM_HELLOWORLD_POSTFLIGHT_UPDATE_TEXT="HelloWorld postflight update script"
COM_HELLOWORLD_PREFLIGHT_DISCOVER_INSTALL_TEXT="HelloWorld preflight discover install script"
COM_HELLOWORLD_PREFLIGHT_INSTALL_TEXT="HelloWorld preflight install script"
COM_HELLOWORLD_PREFLIGHT_UNINSTALL_TEXT="HelloWorld preflight uninstall script"
COM_HELLOWORLD_PREFLIGHT_UPDATE_TEXT="HelloWorld preflight update script"
COM_HELLOWORLD_UNINSTALL_TEXT="HelloWorld Uninstall script"
COM_HELLOWORLD_UPDATE_TEXT="HelloWorld Update script. HelloWorld now updated to version %s."
Откройте файл admin/language/ru-RU/ru-RU.com_helloworld.sys.ini и добавьте:
COM_HELLOWORLD_POSTFLIGHT_DISCOVER_INSTALL_TEXT="HelloWorld скрипт postlight discover install."
COM_HELLOWORLD_POSTFLIGHT_INSTALL_TEXT="HelloWorld скрипт postflight install."
COM_HELLOWORLD_POSTFLIGHT_UNINSTALL_TEXT="HelloWorld скрипт postflight uninstall."
COM_HELLOWORLD_POSTFLIGHT_UPDATE_TEXT="HelloWorld скрипт postflight update."
COM_HELLOWORLD_PREFLIGHT_DISCOVER_INSTALL_TEXT="HelloWorld скрипт preflight discover install."
COM_HELLOWORLD_PREFLIGHT_INSTALL_TEXT="HelloWorld скрипт preflight install."
COM_HELLOWORLD_PREFLIGHT_UNINSTALL_TEXT="HelloWorld скрипт preflight uninstall."
COM_HELLOWORLD_PREFLIGHT_UPDATE_TEXT="HelloWorld скрипт preflight update."
COM_HELLOWORLD_UNINSTALL_TEXT="HelloWorld скрипт Uninstall."
COM_HELLOWORLD_UPDATE_TEXT="HelloWorld скрипт Update. HelloWorld обновлен до версии %s."
Собираем пакет установки компонента
Не забудьте поменять номер версии в файле helloworld.xml:
<version>0.0.13</version>
Добавьте поддержку скрипта установки/удаления/обновления:
<!-- Запускается при установке/удалении/обновлении -->
<scriptfile>script.php</scriptfile>
Также добавьте поддержку сервера обновлений:
<updateservers>
<!-- Заметка: Не допускается пробелов или переносов строк между тегам server -->
<server type="extension" priority="1" name="Сайт обновлений компонента Hello World!">http://вашдомен.ru/update/helloworld-update.xml</server>
</updateservers>
helloworld.xml
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="2.5.0" method="upgrade">
<name>COM_HELLOWORLD</name>
<!-- Следующие элементы необязательны -->
<creationDate>Июль 2012</creationDate>
<author>Вася Пупкин</author>
<authorEmail>Ваш e-mail</authorEmail>
<authorUrl>Ваш сайт</authorUrl>
<copyright>Информация о копирайте</copyright>
<license>Информация о лицензии</license>
<!-- Версия записывается в таблицу компонентов -->
<version>0.0.13</version>
<!-- Описание необязательно -->
<description>COM_HELLOWORLD_DESCRIPTION</description>
<!-- Запускается при установке/удалении/обновлении -->
<scriptfile>script.php</scriptfile>
<!-- Запускается при установке -->
<install>
<sql>
<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
</sql>
</install>
<!-- Запускается при удалении -->
<uninstall>
<sql>
<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
</sql>
</uninstall>
<!-- Запускается при обновлении -->
<update>
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>
<!-- Раздел основных файлов сайта -->
<!-- Обратите внимание на значение аттрибута folder: Этот аттрибут описывает папку нашего пакета-установщика из которой должны копироваться файлы.
Поэтому указанные в этом разделе файлы будут скопированы из папки /site/ нашего пакета-установщика в соответствующую папку установки. -->
<files folder="site">
<filename>index.html</filename>
<filename>controller.php</filename>
<filename>helloworld.php</filename>
<folder>language</folder>
<folder>models</folder>
<folder>views</folder>
</files>
<media destination="com_helloworld" folder="media">
<filename>index.html</filename>
<folder>images</folder>
</media>
<!-- Администрирование -->
<administration>
<!-- Раздел Меню -->
<menu img="../media/com_helloworld/images/hello-16x16.png">COM_HELLOWORLD_MENU</menu>
<!-- Раздел основных файлов администрирования -->
<!-- Обратите внимание на значение аттрибута folder: Этот аттрибут описывает папку нашего пакета-установщика из которой должны копироваться файлы.
Поэтому указанные в этом разделе файлы будут скопированы из папки /admin/ нашего пакета-установщика в соответствующую папку установки. -->
<files folder="admin">
<filename>index.html</filename>
<filename>access.xml</filename>
<filename>config.xml</filename>
<filename>controller.php</filename>
<filename>helloworld.php</filename>
<folder>controllers</folder>
<folder>helpers</folder>
<folder>models</folder>
<folder>sql</folder>
<folder>tables</folder>
<folder>views</folder>
</files>
<languages folder="admin">
<language tag="en-GB">language/en-GB/en-GB.com_helloworld.ini</language>
<language tag="en-GB">language/en-GB/en-GB.com_helloworld.sys.ini</language>
<language tag="ru-RU">language/ru-RU/ru-RU.com_helloworld.ini</language>
<language tag="ru-RU">language/ru-RU/ru-RU.com_helloworld.sys.ini</language>
</languages>
</administration>
<!-- Сервер обновлений -->
<updateservers>
<!-- Заметка: Не допускаются пробелы или переносы строк между тегам server -->
<server type="extension" priority="1" name="Сайт обновлений компонента Hello World!">http://вашдомен.ru/update/helloworld-update.xml</server>
</updateservers>
</extension>
Содержимое директории с кодом:
helloworld.xml
script.php
site/index.html
site/helloworld.php
site/controller.php
site/language/index.html
site/language/en-GB/index.html
site/language/en-GB/en-GB.com_helloworld.ini
site/language/ru-RU/index.html
site/language/ru-RU/ru-RU.com_helloworld.ini
site/models/index.html
site/models/helloworld.php
site/views/index.html
site/views/helloworld/index.html
site/views/helloworld/view.html.php
site/views/helloworld/tmpl/index.html
site/views/helloworld/tmpl/default.xml
site/views/helloworld/tmpl/default.php
admin/index.html
admin/access.xml
admin/config.xml
admin/controller.php
admin/helloworld.php
admin/controllers/index.html
admin/controllers/helloworld.php
admin/controllers/helloworlds.php
admin/helpers/index.html
admin/helpers/helloworld.php
admin/language/index.html
admin/language/en-GB/index.html
admin/language/en-GB/en-GB.com_helloworld.ini
admin/language/en-GB/en-GB.com_helloworld.sys.ini
admin/language/ru-RU/index.html
admin/language/ru-RU/ru-RU.com_helloworld.ini
admin/language/ru-RU/ru-RU.com_helloworld.sys.ini
admin/models/index.html
admin/models/helloworld.php
admin/models/helloworlds.php
admin/models/fields/index.html
admin/models/fields/helloworld.php
admin/models/forms/index.html
admin/models/forms/helloworld.js
admin/models/forms/helloworld.xml
admin/models/rules/index.html
admin/models/rules/greeting.php
admin/sql/index.html
admin/sql/install.mysql.utf8.sql
admin/sql/uninstall.mysql.utf8.sql
admin/sql/updates/index.html
admin/sql/updates/mysql/index.html
admin/sql/updates/mysql/0.0.1.sql
admin/sql/updates/mysql/0.0.4.sql
admin/sql/updates/mysql/0.0.9.sql
admin/sql/updates/mysql/0.0.10.sql
admin/sql/updates/mysql/0.0.12.sql
admin/tables/index.html
admin/tables/helloworld.php
admin/views/index.html
admin/views/helloworld/index.html
admin/views/helloworld/view.html.php
admin/views/helloworld/submitbutton.js
admin/views/helloworld/tmpl/index.html
admin/views/helloworld/tmpl/edit.php
admin/views/helloworlds/index.html
admin/views/helloworlds/view.html.php
admin/views/helloworlds/tmpl/index.html
admin/views/helloworlds/tmpl/default.php
admin/views/helloworlds/tmpl/default_body.php
admin/views/helloworlds/tmpl/default_foot.php
admin/views/helloworlds/tmpl/default_head.php
language/index.html
language/en-GB/index.html
language/en-GB/en-GB.com_helloworld.sys.ini
language/ru-RU/index.html
language/ru-RU/ru-RU.com_helloworld.sys.ini
media/index.html
media/images/index.html
media/images/hello-16x16.png
media/images/hello-48x48.png
Запакуйте директорию в архивный файл (zip, tar, tar.gz, bz2) или скачайте его напрямую c GitHub. Далее установите его, используя менеджер расширений Joomla. Теперь при установке компонента должны появиться сообщения:
Hello World! скрипт preflight update.
Hello World! скрипт Update. Hello World! обновлен до версии 0.0.13.
Hello World! скрипт postflight update.