Советы по разработке расширений для CMS Joomla! 1.5

Мой перевод статьи на английском: Joomla! 1.5 extensions development hints. Это мой первый опыт написания переводов, так что сильно не ругать. Если где не прав - поправьте :)

0. пробежаться по основной документации к Joomla!

Joomla! Руководство для начинающих

Joomla - сеть разработчиков,
которая включает в себя очень полезные ресурсы:
Joomla framework API
учебники по Joomla! в Wiki

Форум Joomla!

1. структура проекта

При разработке полезно держать весь код в одном месте. Это легко сделать с вашим IDE и VCS

При этом рекомендуется использовать следующую структуру:

 project-root
	com_component
		site
			...
			lang
				...
				en-GB.com_component.ini
				de-DE.com_component.ini
			component.php
		admin
			...
			lang
				...
				en-GB.com_component.ini
				de-DE.com_component.ini
			admin.component.php
			install.sql
			uninstall.sql
		component.xml
	mod_module
		...
		lang
			...
			en-GB.mod_module.ini
			de-DE.mod_module.ini
		module.php
		module.xml
	plg_plugin
		...
		lang
			...
			en-GB.plg_group_plugin.ini
			de-DE.plg_group_plugin.ini
		plugin.php
		plugin.xml
	tpl_temlate
		template.xml
	...

После создания структуры проекта подготовьте установочные пакеты с помощью учебников по Joomla! и установите их на Joomla!.

Мы будем работать с локальной установкой (или выделенным сервером в вашей локальной сети), поскольку другие варианты реализации затрудняют разработку.

После инсталляции расширений, замените файлы расширений, установленных на Joomla! на символические ссылки GNU/Linux или символические ссылки Windows Vista на файлы вашего проекта.

Примечание: Не забудьте использовать опцию "Options +FollowSymLinks" в конфигурационном файле веб-сервера Apache для каталога, в котором установлена Joomla! для использования символических ссылок.

В Joomla!, имена файлов расширений имеют специфическую структуру. В приведенном примере, имена расширений в именах файлов и папок заменены словами «component», «module», и «plug-in»

Словом «group» в файлах плагина заменяет название группы, к которой подключаемый модуль относится [content, editors, search, system, user]. Каждая группа определяет набор событий, в которых данный плагин будет задействован.

Готовый к употреблению проект имеет следующую структуру имен:

(символ «<==» означает символическую ссылку)
PRJ-ROOT/COM_COMPONENT/SITE <== J_ROOT/COMPONENTS/COM_COMPONET
PRJ-ROOT/COM_COMPONENT/SITE/LANG/en-GB.com_component.ini <== J_ROOT/LANGUAGE/en-GB/en-GB.com_component.ini
PRJ-ROOT/COM_COMPONENT/SITE/LANG/de-DE.com_component.ini <== J_ROOT/LANGUAGE/de-DE/de-DE.com_component.ini

PRJ-ROOT/COM_COMPONENT/ADMIN <== J_ROOT/ADMINISTRATOR/COMPONENTS/COM_COMPONET
PRJ-ROOT/COM_COMPONENT/ADMIN/LANG/en-GB.com_component.ini <== J_ROOT/ADMINISTRATOR/LANGUAGE/en-GB/en-GB.com_component.ini
PRJ-ROOT/COM_COMPONENT/ADMIN/LANG/de-DE.com_component.ini <== J_ROOT/ADMINISTRATOR/LANGUAGE/de-DE/de-DE.com_component.ini

PRJ-ROOT/MOD_MODULE <== J_ROOT/MODULES/MOD_MODULE
PRJ-ROOT/MOD_MODULE/LANG/en-GB.mod_module.ini <== J_ROOT/LANGUAGE/en-GB/en-GB.mod_module.ini
PRJ-ROOT/MOD_MODULE/LANG/de-DE.mod_module.ini <== J_ROOT/LANGUAGE/de-DE/de-DE.mod_module.ini

PRJ-ROOT/PLG_PLUGIN/plugin.php <== J_ROOT/PLUGINS/GROUP/plugin.php
PRJ-ROOT/PLG_PLUGIN/LANG/en-GB.plg_group_plugin.ini <== J_ROOT/ADMINISTRATOR/LANGUAGE/en-GB/en-GB.plg_group_plugin.ini
PRJ-ROOT/PLG_PLUGIN/LANG/de-DE.plg_group_plugin.ini <== J_ROOT/ADMINISTRATOR/LANGUAGE/de-DE/de-DE.plg_group_plugin.ini

Как вы видите, файлы локализаций установлены в административной части Joomla!.

2. интернационализация (i18n)

Большинство расширений требуют многоязыковой поддержки. Этот механизм прост в использовании в Joomla!, Но у него есть несколько решений решений.

Для использования поддержки интернационализации текстовых сообщений, в код расширений вместо вставки простых строк мы должны использовать следующие постройки: JText ::_(' текстовое сообщение '); Эта конструкция проверяет текущую локализацию, и, используя соответствующий файл локали, возвращает строку.

Например, если текущая локаль "en-GB", ищется файл:

Если не удается найти соответствующую строку, выводится оригинальная строка, переданная в параметре.

Структура файла локализации:

идентификатор=значение

идентификатор - это оригинальная строка, которая должна быть написана В ВЕРХНЕМ РЕГИСТРЕ. значение - это значение для локали.

Пример:

Нам нужно вывести 2 интернационализированные строки:

echo JText::_(’This is test message.’);
echo JText::_(’Hello world.’);

Затем мы создаем файлы локализации для соответствующих локалей:

en-EN.com_component.ini:

THIS IS TEST MESSAGE=This is test message.
HELLO WORLD.=Hello all.

de-DE.com_component.ini:

THIS IS TEST MESSAGE=Das ist testen Meldung.
HELLO WORLD.=Halo eine Welt.

Хочу отметить, что для того, чтобы использовать этот механизм подключаемых модулей вы должны вызывать метод loadLanguage класса Jplugin:

loadLanguage ( 
[название файла локализации], 
[путь к корневой директории сайта или администраторской части Joomla!] 

Имя файла локализации, по умолчанию plg_group_plugin.ini Путь к корневой директории, может быть: «j_root/administrator» или «j_root» (по умолчанию)

3. Форматы

Форматы являются удобным механизмом, позволяющим нам избегать использования «if construction» в «view» в MVC-модели, которые Joomla! 1,5 начали активно использовать для создания расширений.

По умолчанию структура представления расширений в Joomla(для модулей и компонентов) имеет следующую структуру:

EXTENSION-ROOT
	VIEWS
	   VIEW
               TMPL
		 default.php
	     view.html.php

Здесь "view.html.php" файл является обычной частью презентации, которая, как правило, содержит вызовов "model" (MVC), или, другими словами, когда мы извлекаем данные, которые необходимы для вывода данных, и кое-какую простую логику. Здесь правила для вставки логики в модели или контроллер (MVC).

В каталоге "TMPL" мы храним различные представления. Они содержат разметки, или, другими словами, точное представление данных.

Файл "default.php" является форматом по умолчанию, следовательно, он будет использоваться, если мы не был выбран другой. Вы можете легко создавать дополнительные форматы, добавив в каталог "TMPL" файлы с именами "layoutname.php", где layoutname - любое имя Вашего формата.

Для того чтобы выбрать конкретный формат, вы должны в контроллере(MVC), перед вызовом функции display(), выбрать его имя командой: JRequest::setVar(’layout’, ‘layoutname’);

4. использование AJAX

Трудно представить себе приложение, которое в наши дни разрабатывается без использования AJAX.

Вызывать Ajax-методы куда проще с использованием специализированных библиотек на javascript, таких как jquery, mootols, dojo и т.д...

Мне нравится jquery. Однако Joomla! Разработчики выбрали другой Javascript фреймворк - mootols, и поэтому я настоятельно рекомендую вам использовать для ajax методов вызовы Mootools библиотеки.

Если вы все равно хотите использовать вашу любимую библиотеку на JavaScript, вы должны перевести свою библиотеку режим совместимости.

Например для Jquery это можно сделать так:

var jq = jQuery.noConflict();

Затем вместо «$», вы должны использовать «jq», но в любом случае следует помнить, что большинство расширений для библиотек JavaScript не используют этот режим, и поэтому у вы будете получать ошибку Javascript из-за конфликтов имен.

Пример MVC потока с вызовом Ajax:

- Создаем задачу в контроллере, например: GetAjaxData

“controller.php”:
	function getAjaxData() {
		JRequest::setVar('view', 'viewname');
		JRequest::setVar('layout', 'ajaxlayout');

		parent::display();
	}

- Создаем формат, например: ajaxlayout

“viewname/tmpl/ajaxlayout.php”:
	<?php defined('_JEXEC') or die('Restricted access'); 

	global $mainframe;
	echo <ajax data>;	

	$mainframe->close();
	?>

Важное примечание:

Вы должны добавить вызов: $mainframe->close(); с тем чтобы создать выходной поток или она будет добавлять стандартную страницу Joomla! после результата вашего Ajax-метода.

Таким образом, создавая конкретные форматы, вы можете передавать любые данные. Не забудьте установить соответствующие заголовки.

Для XML это может быть: header('Content-type: text/xml;charset=utf-8');

На стороне клиента, вы дожны создать вызов определенного вами метода, используя вызов Ajax, при помощи URL вроде:

JURI::root().'index.php?option=com_component&task=getajaxdata';

5. расположение таблиц в базе данных

Joomla! использует просте ORM систем.

Для того чтобы использовать этот механизм, вы должны описать структуру вашей БД с наборами объектов, которые наследуют JTable.

Например:

foo.php:
<?php
defined('_JEXEC') or die('Restricted access');

class TableFoo extends JTable {
	var $id = null;
	var $bar = null;

	function TableFoo(& $db) {
		parent::__construct('#__foo', 'id', $db);
	}

	function bind( $from, $ignore=array() ) {
		$from['bar'] = strtoupper($from['bar']);
		return parent::bind($from, $ignore);
	}

	function check() {
		if (empty($this->bar)) {
			$this->setError( ‘Error message’);
			return false;
        		}
		return true;
	}	

	function delete( $oid=null ) {
		$res = parent::delete($oid);

		// Здесь вы можете определить механизм, если требуется
		// удалить выбранные таблицы
		return $res;
    	}
}
?>

Прежде всего необходимо определить public-переменные, которые соответствующие названиям полей таблицы.

Затем вам нужно передать имя таблицы и имя первичного ключа для конструктора.

основные методы:

Bind() используется для передачи данных из внешних источников (например: requst) на объект. Переопределяя этот метод, вы можете выполнять конкретные преобразования данных, прежде чем добавлять к полям объекта.

Check() делает проверку данных в полях, например, он может убедиться в том, что поля, не пустые или заполнены значениями требуемого диапазона, и т.д.

Delete() может добавить определенное поведение во время удаления записей. Например удаление связанных записей.

Кроме того, класс JTable содержит множество других удобных методов, переопределяя которые, вы можете добавить соответствующее поведение для них.

См. документацию Joomla! для подробностей.

можно использовать:

Вы можете получить объект в модели (MVC) следующим образом: $row =& $this->getTable('foo');

чтобы удалить запись, вы вызываете: $row->delete($id);

сохранить записи в базе:

$row->bind($data);
$row->check();
$row->store();

Если потом вам потребуется получить значение первичного ключа, вы можете просто принять значение из объекта: $row->id;

Конечно, лучше добавить к определению вызовов проверку результатов выполнения методов.

Теги: , , , , , ,

Статьи схожей тематики:

Обзор CMS LiveStreet

Обзор CMS Made Simple

Персональный блог

Предлагаю вашему вниманию...

Ссылки на Skype и ICQ

Комментарии(0):

rss-лента

Добавить комментарий

Ваше имя:*
Ваш email:*(не публикуется)
Ваш сайт:
Ваш комментарий:*

Переносы строк и url-адреса преобразуются автоматически, не забудьте отделить их пробелами. html и bb-коды не поддерживаются.