Пример создания компонента для Joomla 1.6 часть 1
10.11.2010 →В этом примере будет рассмотрен полный цикл создания компонента для Joomla 1.6. Будет задействован интерфейс администритароа, БД и остальное. Суть компонента будет состоять в том, что в аминистративной панели Joomla можно будет созавать свои фразы, которые будут заноситься в БД, ну а на сайте можно будет выводить их. Соответсвенно так его и можно будет назвать com_phrase.
Начнем с административной части компонента. В принципе, различия между структурой компонентов Joomla 1.6 и 1.5 не существенные. Создаем точку входа:
{Joomla root}/administrator/components/com_phrase/phrase.php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('Доступ запрещен!');
// Подключаем библеотеку контроллера Joomla
jimport('joomla.application.component.controller');
// Получаем экземпляр класса контроллера с префиксом Hello
$controller = JController::getInstance('Phrase');
// Обрабатываем запрос (task)
$controller->execute(JRequest::getCmd('task'));
// Переадресуем, если установлено контроллером
$controller->redirect();
Создаем основной контроллер, он будет достаточно простым, т.к. задач не много.
{Joomla root}/administrator/components/com_phrase/controller.php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('Restricted access');
// Подключаем библеотеку контроллера Joomla
jimport('joomla.application.component.controller');
/**
* Основной контроллер
*/
class PhraseController extends JController
{
/**
* отображает задачу
*
* @return void
*/
function display($cachable = false)
{
// устанавливаем вид (представление) по умолчанию, если не установленно ставим PhraseList
JRequest::setVar('view', JRequest::getCmd('view', 'PhraseList'));
// вызываем родительский метод
parent::display($cachable);
}
}
В переменной $cachable можно установить будет ли кэшироваться компонент или нет.
Дальше нужно создать Вид, из контроллера видно что по умолчанию устанавливается PhraseList. Соответсвенно и Вид, который будет по умолчанию, должен называться точно так же. Добавляем
{Joomla root}/administrator/components/com_phrase/views/phraselist/view.html.php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('Restricted access');
// Подключаем библиотеку представления Joomla
jimport('joomla.application.component.view');
// Создаем свой класс
class PhraseViewPhraseList extends JView {
/**
* элементы, которые будут отображены
*/
protected $items;
/**
* пагинация для элементов
*/
protected $pagination;
/**
* Phrase view display method
* @return void
*/
function display($tpl = null)
{
// Берем данные из модели
$items = $this->get('Items');
// Берем пагинацию из модели
$pagination = $this->get('Pagination');
// Нзаначаем данные для разметки
$this->items = $items;
$this->pagination = $pagination;
// Подключаем тулбар
$this->_setToolBar();
// Отображаем разметку Вида
parent::display($tpl);
}
/**
* Установки тулбара (кнопок)
*/
protected function _setToolBar()
{
JToolBarHelper::title(JText::_('com_Phrase_Manager'));
JToolBarHelper::deleteListX('com_Phrase_Are_you_sure_you_want_to_delete_these_greetings', 'phraselist.remove', 'JTOOLBAR_DELETE');
JToolBarHelper::editListX('phraselist.edit', 'JTOOLBAR_EDIT');
JToolBarHelper::addNewX('phraselist.add', 'JTOOLBAR_NEW');
}
}
Здесь как видно мы подключаем модель, которая еще пока не созданна. Если использовать текущую модель для Вида, то соответсвенно имя файла и класс, используемый для модели, должны соответсвовать Виду. Создаем модель с нужными методами.
{Joomla root}/administrator/components/com_phrase/models/phraselist.php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('Restricted access');
// подключаем библеотеку modellist Joomla
jimport('joomla.application.component.modellist');
// Создаем класс модели
class PhraseModelPhraseList extends JModelList {
/**
* Модель для списка фраз
*
* @var string
*/
protected $_context = 'com_phrase.phraselist';
/**
* Метод для создания SQL запроса
*
* @return string An SQL query
*/
protected function getListQuery() {
// Create a new query object.
$db = JFactory::getDBO();
$query = $db->getQuery(true);
// Select some fields
$query->select('id,phrase');
// From the hello table
$query->from('#__phrase');
return $query;
}
/**
* Метод для создания пагинации
*
* @return void
*/
protected function populateState() {
// Инициализация переменных.
$app = JFactory::getApplication('administrator');
// Задаем пагинацию и чекбоксы
$this->setState('list.start', $app->getUserStateFromRequest($this->_context . '.list.start', 'limitstart', 0, 'int'));
$this->setState('list.limit', $app->getUserStateFromRequest($this->_context . '.list.limit', 'limit', $app->getCfg('list_limit', 25), 'int'));
$this->setState('selected', JRequest::getVar('cid', array()));
}
/**
* Метод для удалении записи
*
*/
public function remove()
{
// Берем выбранные элементы
$selected = $this->getState('selected');
// Подключение таблицы
$table = $this->getTable('Phrase');
foreach($selected as $id)
{
// Загружаем таблицу и проверяем на наличие ошибок.
if (!$table->load($id))
{
$this->setError($table->getError());
return false;
}
// Удаляем запись или выводим ошибку.
if (!$table->delete())
{
$this->setError($table->getError());
return false;
}
}
return true;
}
}
В Joomla 1.6, в отличии от 1.5, расширенный класс JModel. Это позволяет более компактно использовать нужные модели, например для модели списка можно испольозвать класс JModelList, для форм класс JModelForm и т.д.
В этом случае нужно отобразить список фраз, соответсвенно можно использовать JModelList и его методы. Здесь достаточно будет задать нужный запрос в методе getListQuery(), инициализировать переменные для пагинации и чекбоксов и написать метод для удаления записи remove(). Остальное будет делаться родительским классом JModelList, если посмотреть Вид (.../views/phraselist/view.html.php), то в нем будет используются именно методы JModelList.
// Берем данные из модели
$items = $this->get('Items');
// Берем пагинацию из модели
$pagination = $this->get('Pagination');
Здесь используются методы JModelList::getItems() и JModelList::getPagination().
В методе удаления подключается таблица
$table = $this->getTable('Phrase');
Нужно создать ее
{Joomla root}/administrator/components/com_phrase/tables/phrase.php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('Restricted access');
// подключаем билбеотеку таблиц Joomla
jimport('joomla.database.table');
/**
* Создаем класс TablePhrase
*/
class TablePhrase extends JTable
{
/**
* Primary Key
*
* @var int
*/
var $id = null;
/**
* @var string
*/
var $phrase = null;
/**
* Constructor
*
* @param object Database connector object
*/
function TablePhrase(&$db)
{
parent::__construct('#__phrase', 'id', $db);
}
}
Здесь различий с Joomla 1.5 практически нет. В переменных задаем поля таблицы, в конструкторе название таблицы.
Осталось сделать разметку вывода для Вида PhraseList. Можно разделить ее на части, так как список будет выводиться в таблицу, то соответсвенно можно сделать основную разметку и 3 вспомогательных.
{Joomla root}/administrator/components/com_phrase/views/phraselist/tmpl/default.php (основная)
<?php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('Restricted access');
// Подключаем TollTip
JHtml::_('behavior.tooltip');
?>
<form action="<?php echo JRoute::_('index.php?option=com_phrase'); ?>" method="post" name="adminForm">
<table class="adminlist">
<thead><?php echo $this->loadTemplate('head');?></thead>
<tfoot><?php echo $this->loadTemplate('foot');?></tfoot>
<tbody><?php echo $this->loadTemplate('body');?></tbody>
</table>
<input type="hidden" name="task" value="" />
<input type="hidden" name="boxchecked" value="0" />
</form>
{Joomla root}/administrator/components/com_phrase/views/phraselist/tmpl/default_head.php
<?php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('Restricted access');
?>
<tr>
<th width="5">
<?php echo JText::_('PHRASE_ID'); ?>
</th>
<th width="20">
<input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count($this->items); ?>);" />
</th>
<th>
<?php echo JText::_('PHRASE'); ?>
</th>
</tr>
{Joomla root}/administrator/components/com_phrase/views/phraselist/tmpl/default_body.php
<?php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('Restricted access');
?>
<?php foreach($this->items as $i => $item): ?>
<tr class="row<?php echo $i % 2; ?>">
<td>
<?php echo $item->id; ?>
</td>
<td>
<?php echo JHtml::_('grid.id', $i, $item->id); ?>
</td>
<td>
<a href="/<?php echo JRoute::_('index.php?option=com_phrase&task=phrase.edit&cid[]=' . $item->id); ?>">
<?php echo $item->phrase; ?>
</a>
</td>
</tr>
<?php endforeach; ?>
В теле как раз и происходит вывод записей. Здесь $this->items - это, массив, переданный из Вида view.html.php ($this->items = $items;). Ссылка будет ввести на задачу (task) phrase.edit, ее раберем позже.
{Joomla root}/administrator/components/com_phrase/views/phraselist/tmpl/default_foot.php
Ну вот пол дела сделанно, список готов. Теперь если в БД будет существовать таблица #__phrase с записями в полях id и phrase, то она будет отображать в административной панели Joomla в виде списка.
Продолжение в следующей части
Joomla 1.6 beta 13
02.11.2010 →Вышел очередной релиз Joomla 1.6 (Скачать).
В этом релизе было исправлено 71 ошибок, подробнее смотрите файл CHANGELOG в папке installation. Было закрыто 28 ошибок с баг трекера. В настоящее время осталось 13 нерешенных вопросов, которые задерживают выход релиз кандидата 1 (RC1).
Следующий релиз Joomla 1.6 beta 14 (или может быть Релиз Кандидат 1 RC1) запланирован на 15 ноября 2010г.
Этот релиз выпущен для ознакомления.
Joomla 1.6 beta 12
19.10.2010 →Вышел очередной релиз Joomla 1.6 (Скачать).
В этом релизе было исправлено 27 ошибок, подробнее смотрите файл CHANGELOG в папке installation. С момента выхода предыдущей версии зафиксировано около 52 ошибок.
Следующий релиз Joomla 1.6 beta 13 запланирован на 1 ноября 2010г.
Этот релиз выпущен для ознакомления.
Joomla 1.5.21 [senu takaa ama wepulai]
13.10.2010 →Вышел релиз безопасности Joomla 1.5.21 [senu takaa ama wepulai].
В этом релиза исправлена XSS уязвимость Joomla. Советую обновить дистрибутив, так как это может повлиять на безопасность сайта.
Перед обновлением рекомендую сделать резервную копию файлов и БД.
Скачать с официального сайта (joomla.org):
Joomla 1.6 beta 11
12.10.2010 →Вышел очередной релиз Joomla 1.6 (Скачать).
В этом релизе было исправлено 33 ошибок, подробнее смотрите файл CHANGELOG в папке installation. С момента выхода предыдущей версии зафиксировано около 21 ошибки.
Следующий релиз Joomla 1.6 beta 12 запланирован на 18 октября 2010г.
Этот релиз выпущен для ознакомления.
Переопределение шаблонов вывода компонентов и модулей
08.10.2010 →Переопределение вывода компонентов в шаблоне Joomla
Структура компонента в Joomla
Для того что бы изменить вывод определенных компонентов в Joomla нужно разобраться в структуре компонента. В качестве примера можно рассмотреть стандартный компонент отображения материалов com_content.
/components /com_content /views /article /tmpl default.php (разметка или шаблон компонента) form.php (разметка) view.html.php (вид, который выводит HTML) view.pdf.php (вид, который выводит PDF) /category /tmpl blog.php (разметка) blog_items.php (дочерняя разметка) default.php (разметка) view.html.php (HTML вид) view.feed.php (RSS вид)
Из структуры видно, что каждый вид имеет свою директорию (articles, category, ...). В каждом виде есть директория tmpl, в которой хранятся разметки вывода содержимого (или просто шаблоны). В виде материала (/article) это /tmpl/default.php - разметка используемая для вывода материала по умолчанию и /tmpl/form.php - разметка используемая для добавления материала с сайта. В виде категории (/category) так же присутствует две разметки /tmpl/blog.php - для вывода материалов из категории в виде блога и /tmpl/default.php - для вывода материалов в виде списка. При создании пункта меню, выбирая тип "материалы" получается следующая картина.
Так же можно заметить что существуют дополнительные файлы разметки, которые отсутствуют в списке, при создании пункта меню (например article/tmpl/pagebreak.php). Это связано с инструкциями, которые описаны в pagebreak.xml, в которых скрывается данная разметка из списка для пункта меню. Но это отдельная тема и ее затрагивать пока не стоит. Так же есть дочерние шаблоны (например category/tmpl/blog_item.php и другие) о них немного позже.
Создание своей разметки в шаблоне Joomla для компонентов
Переопределение разметки вывода происходит в самом шаблоне в директории /html. Например, для стандартного шаблона rhuk_milkyway это будет {root}/templates/rhuk_milkyway/html/. Здесь важно понимать, что если вы переопределили вывод разметки в одном шаблоне, то он не будет переопределяться для других шаблонов.
Структура переопределения разметки вывода будет выглядеть следующим образом (для примера используется стандартный шаблон rhuk_milkyway):
/templates /rhuk_milkyway /html /com_content (эта директория совпадает с названием компонента) /articles (эта директория совпадает с названием вида (представления) компонента) default.php (этот файл совпадает с названием файла, разметку которого нужно переопределить) form.php ...
Можно разобрать конкретный пример на стандартном шаблоне rhuk_milkyway. Изначально в шаблоне нет никакого переопределения и нужно поменять разметку в стандартном виде материала. Для этого нужно просто скопировать файл из стандартного компонента {root}/components/com_content/views/article/tmpl/default.php в созданную директорию /templates/rhuk_milkyway/html/com_content/article/default.php и дальше менять уже разметку в вашем шаблоне, не затрагивая основные файлы компонента.
Так можно переопределять вывод любого компонента, если он это поддерживает.
Переопределение дочерних разметок
В некоторых видах могут быть дочерние разметки, допустим если взять стандартный вид категории, можно увидет 3 файла, которые начинаются одинаково (blog.php, blog_item.php и blog_links.php). На самом деле это одна разметка, просто она разбита на 3 части, оснавная - blog.php и две дочерние которые она использует. Если открыть blog.php, то можно увидеть использование метода LoadTemplate, где потключаются дополнительные разметки.
Переопределение их происходить точно так же как и обыной разметки. Допустим если нужно переопределить разметку материала в блоге, копируем {root}/components/com_content/views/category/tmpl/blog_item.php в нужный шаблон /templates/rhuk_milkyway/html/com_content/category/blog_item.php.