/var/log/life.log
Блог программиста из солнечной Бурятии

Один установщик для joomla 1.6 и joomla 1.5

С выходом joomla 1.6 перед разработчиками встаёт проблема: Как продолжить разработку дальше, отдельно для каждой версии joomla, или делать всё в одном?
Для себя я выбрал второй вариант, поэтому дальше пойдут несколько проблем и советов по их решению, возникающих при выборе данного метода.

Самый главный кусок кода, который будет необходим.

1
2
3
4
5
$version = new JVersion;
$joomla = $version->getShortVersion();
if(substr($joomla,0,3) == '1.6'){

}

Изменения в установщике

<install> считается устаревшими, вместо него следует использовать <extension>.
Новый тег <update> для указания на sql файлы, которые будут использоваться при обновлении компонента.
Вместо <params> и <param> теперь следует использовать <fields>, <fieldsets> и <field> .
<installfile> и <uninstallfile> вроде как работают, но на замену <scriptfile> , который более гибок.

Всё это привносит определённые проблемы для объединения. Поиск манифеста начинается с файла com_component_name.xml, если же такого файла нет или там совсем не то, что ожидается, то поиск идёт по всем файлам. В результате для компонента необходимо 2 манифеста com_componet_name.xml для joomla1.6 и com_component_name_15.xml для joomla1.5. com_component_name_15.xml – это манифест, который без изменений можно оставить от 1.5. За основу для joomla1.6 берётся манифест от 1.5. Заменяем <install> на <extension>.<installfile> и <uninstallfile> удаляем и добавляем <scriptfile>. В качестве имени(<name>) необходимо использовать com_component_name, а уже в языковом файле указывать настоящее название компонента.
Для плагинов и модулей также требуется 2 манифеста. mod_module_name.xml имеет формат для 1.6 _mod_module_name.xml в формате 1.5. _mod_module_name.xml необходим лишь для установки, поэтому добавлять туда параметры нет необходимости. Параметры в старом и новом формате следует добавлять в mod_module_name.xml. А в _mod_module_name.xml добавить

1
<filename>mod_module_name.xml</filename>

,чтобы манифест скопировался в joomla 1.5.
Аналогично в config.xml компонента указывается 2 типа параметров.
Скрипт файл представляет из себя класс com_component_nameInstallerScript с необходимыми для компонента методами из списка:
* install – вызывается при установке
* uninstall – вызввается при удалении
* update – вызывается при обновлении
* discover_install – специальная в версия install, которая вызывается если компонет был найден через новую функцию в joomla 1.6 Discover
* preflight – вызывается перед install/update/uninstall
* postflight – вызывается после install/update/uninstall
Пример файла можно посмотреть в wiki

Изменения в языковых фалах.

В версии joomla 1.6 парсер ini файлов от php. Теперь в названия переменных не должны содержать пробелов и спец. символов, значения же должны быть заключены в двойные кавычки. ‘#’ не используется больше в качестве начала комментария, вместо него теперь ‘;’. Иначе языковой файл просто не загрузится. Так же, судя по стандартным компонентам, желательно все переменные начинать с названия компонента. Новый тип языковых файлов sys.ini – используются во время установочного процесса.
Для двойных кавычек следует использовать _QQ_:

1
KEY="<a href="_QQ_"index.php"_QQ_">Click</a>"

Устаревшие методы

Моего компонента это в основном не коснулось, в коде нашлось использование JParameter, в вики советуют теперь использовать JFrom для общения с параметрами т.к. был переход на JSON, но в самой joomla, в тех местах где использовался JParameter, теперь используется JRegestry:

1
2
$registry = new JRegistry;
$registry->loadJSON($params);

Полный список в вики

Плагины

Помимо указанных выше изменений в установочном манифесте, изменилось расположение плагинов, теперь для каждого плагина своя папка. Так же изменилось имя таблицы, в которой были плагины с #__plugins на #__extensions и теперь там не только плагины указаны, но и все компоненты и модули.
Изменились имена событий:
с onLogoutUser на onUserLogout и т.п. весь список.
Особой проблемой это не является и решается достаточно легко.

1
2
3
4
public function onUserAuthenticate($credentials, $options, &$response)
{
    return $this->onAuthenticate( $credentials, $options, $response );
}

ACL

Достаточно много изменений, но меня они почти не коснулись, использование acl понятно описано в вики. У меня в компоненте необходимо определять администратор это или нет. Как это сделать я, по началу не понял, а старый метод перестал работать т.к. поле usertype таблицы users стало deprecated. Поэтому попробовал использовать новый acl, но оказалось, что для администратора нельзя запретить какое либо действие, да и устанавливать правила при установке тоже не гуд. Посмотрев код, нашёл способ определения администратор/не адмимистратор:

1
JAccess::check($uid, 'core.admin');

Ещё немного отличий

Загрузка контролера

1
$controller = JController::getInstance('component_name');

Переименован компонент com_user в com_users.
Появились формы.

Модули

Для модулей особых изменений нет, только обновлённая версия mootools, что с одной стороны хорошо — наконец-то, с другой стороны плохо — большинство модулей используют версию 1,12 и не все уже поддерживаются разработчиками.

Обновления

В joomla 1.6 наконец, как у взрослых, появились автоматические обновления. Для добавления сервера обновлений необходимо в установочный манифест добавить следующее:

1
2
3
<updateservers>
        <server type="type" name="name">http://url.to.update.xml</server>
</updateservers>

type – 2 значения collection либо extension.
На форуме joomla ещё атрибут priority добавлен, но в коде его использования я не нашёл, поэтому не вижу смысла его указывать.
Если collection, то ссылка указывает на xml, который содержит список ссылок на отдельные экстеншены, его формат таков:

1
2
3
<extensionset name="Joomla Core" description="Joomla! Core">
    <extension name="Joomla" element="joomla" type="file" version="1.6RC1" detailsurl="http://update.joomla.org/core/extension.xml" />
</extensionset>

Думаю все атрибуты ясны, аналогичны атрибутам в манифесте.
Для extension формат выглядит следующим образом:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
< ?xml version="1.0" ?>
<updates>
    <update>
        <name>Component</name>
        <description>Component Description</description>
        <element>com_component</element>
        <type>component</type>
        <version>0.0.1</version>

        <infourl title="Component">http://www.comopnent.com/</infourl>
        <downloads>
            <downloadurl type="full" format="tbz2">http://url.to/comopnent.tar.bz2</downloadurl>
        </downloads>
        <tags>
            <tag>testing</tag>
        </tags>

        <maintainer>Maintainer</maintainer>
        <maintainerurl>http://maintainer.url</maintainerurl>
        <section>Testing</section>
        <targetplatform name="joomla" version="1.6" />
    </update>              
</updates>

Вроде всё ясно, кроме section и tags, но их использования в коде с первого взгляда найти не удалось, так что ничего страшного.