Один установщик для joomla 1.6 и joomla 1.5
С выходом joomla 1.6 перед разработчиками встаёт проблема: Как продолжить разработку дальше, отдельно для каждой версии joomla, или делать всё в одном?
Для себя я выбрал второй вариант, поэтому дальше пойдут несколько проблем и советов по их решению, возникающих при выборе данного метода.
Самый главный кусок кода, который будет необходим.
1 2 3 4 5 |
Изменения в установщике
<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, но их использования в коде с первого взгляда найти не удалось, так что ничего страшного.