Создание компонента для Joomla

Часть 13 - скрипт установки / обновления / удаления и сервер обновлений

Joomla

Часть 13 - скрипт установки / обновления / удаления и сервер обновлений

Создаем файл-скрипт для компонента

Установка, обновление и удаление компонента может потребовать дополнительных операций, которые невозможно достичь основными операциями, описанными в установочном 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.

Сообщение после установки компонента

Код для этой части

Скачать com_helloworld часть 13

Актуальный код части 13 на GitHub

Dmitry Rekun
Работаю в банковской сфере, а с веб-разработкой (непосредственно с Joomla) столкнулся в 2007 году. Теперь это моё хобби и время от времени вторая работа. Какое-то время вёл свой блог, но решил попробовать работать в команде. И вот c 2012 года я здесь :)