07 - Вывод информации в административной части часть 2 joomla 3.x
В этой части мы займёмся функционалом, а именно заставим кнопки публикация, сортировка работать. Заодно уместно будет заполнить языковой файл что бы было эстетичнее. И так откроем файл административной части models/mycomponent.php в ней мы получаем все данные пользователя которые он совершил, и вызываем сценарии joomla которые исполнят запрос пользователя. И через function getTable обратимся к папке tables которая укажет с какой таблицей работать.
<?php
// Запрет к прямому доступу. Если кто то попытается обратиться
// к файлу напрямую, joomla выдаст пустую страницу.
defined('_JEXEC') or die;
/**
* Mycomponent Model
*/
class MycomponentsModelMycomponent extends JModelAdmin
{
/**
* Returns возвращает ссылку на объект.
*
* @param type Тип таблицы для создания экземпляра
* @param string Префикс для имени класса таблицы.
* @param array Массив для модели.
* @return JTable Объекты базы данных
*/
protected $text_prefix = 'COM_MYCOMPONENT';
//Возвращает ссылку на объект таблицы, при его создании.
public function getTable($type = 'Mycomponent', $prefix = 'MycomponentsTable', $config = array())
{
return JTable::getInstance($type, $prefix, $config);
}
/**
* Метод получения данных
*
* @param array $data Данные для формы.
* @param boolean $loadData Форма для того что бы загрузить свои данные(по умолчанию).
* @return mixed Вернуть данные в случае успешного завершения.
*/
public function getForm($data = array(), $loadData = true)
{
// Получить форму
$form = $this->loadForm('com_mycomponents.mycomponent', 'mycomponent',
array('control' => 'jform', 'load_data' => $loadData));
if (empty($form))
{
return false;
}
return $form;
}
/**
* Метод, чтобы получить данные, которые должны быть выведены в форме.
*
* @return mixed Данные по форме.
*/
protected function loadFormData()
{
// Проверка сессий для ранее введёных данных формы
$data = JFactory::getApplication()->getUserState('com_mycomponents.edit.mycomponent.data',
array());
if (empty($data))
{
$data = $this->getItem();
}
return $data;
}
}
Теперь откройте файл tables/mycomponent.php в этом файле мы указываем с какой таблицей будем работать. Вообще такие действия как публикация, сортировка, в компонентах я где только не находил и в папке tables и в контроллере, и в моделе. Как я понял единой какой то конструкции нет, в одном компоненте так в другом эдак. Я переписывал компонент на 1.6 читая официальный мануал. Но там крайне мало описано как сделать сортировку, пагинацию, и кучу всего другого, поэтому приходилось разбирать стандартные компоненты joomla это banners и weblincs. Можете почитать про разные функции joomla откуда они берутся и что делают. Вообще в joomla есть своя библиотека с указанием что нужно сделать нам достаточно только вызвать класс и указать что с ним делать!
<?php
// Запрет к прямому доступу. Если кто то попытается обратиться
// к файлу напрямую, joomla выдаст пустую страницу.
defined('_JEXEC') or die;
/**
* Класс таблицы
*/
class MycomponentsTableMycomponent extends JTable
{
/**
* Конструктор
*
* Параметры объекта базы данных. Это то с чем мы будем работать.
*/
public function __construct(&$db)
{
parent::__construct('#__mycomponent', 'id', $db);
}
//Параметры для управления публикацией
public function publish($pks = null, $state = 1, $userId = 0)
{
$k = $this->_tbl_key;
JArrayHelper::toInteger($pks);
$userId = (int) $userId;
$state = (int) $state;
// Если нет первичных ключей установить проверить, если экземпляр ключ установлен.
if (empty($pks))
{
if ($this->$k) {
$pks = array($this->$k);
}
// Ничего не выбрано, нечего устанавливать, вернуть ложь нечего опубликовывать
else {
$this->setError(JText::_('JLIB_DATABASE_ERROR_NO_ROWS_SELECTED'));
return false;
}
}
$where = $k.'='.implode(' OR '.$k.'=', $pks);
if (!property_exists($this, 'checked_out') || !property_exists($this, 'checked_out_time')) {
$checkin = '';
}
else {
$checkin = ' AND (checked_out = 0 OR checked_out = '.(int) $userId.')';
}
// Обновить состояние публикации
$this->_db->setQuery(
'UPDATE '.$this->_db->quoteName($this->_tbl) .
' SET '.$this->_db->quoteName('state').' = '.(int) $state .
' WHERE ('.$where.')' .
$checkin
);
try
{
$this->_db->execute();
}
catch (RuntimeException $e)
{
$this->setError($e->getMessage());
return false;
}
if ($checkin && (count($pks) == $this->_db->getAffectedRows()))
{
// Проверка строк чекбокс
foreach($pks as $pk)
{
$this->checkin($pk);
}
}
// Если JTable значение экземпляра в списке первичных ключей,
// которые были установлены, установить экземпляр.
if (in_array($this->$k, $pks)) {
$this->state = $state;
}
$this->setError('');
return true;
}
}
Теперь добавим перевод что бы всё отобразилось на русском. В joomla 1.6 языковой фал чуток отличается, допустим в 1.5 было так TEKST=текст то в 3.x будет так COM_MYCOMPONENT="мой компонент" обязательно указать COM_MYCOMPONENT и текст заключить в кавычки, так же скобки () не допускаются. Ещё один момент вот подобные строки COM_MYCOMPONENTS_N_ITEMS_DELETED уже зарезервированны joomla их достаточно просто вписать в языковой файл. Откройте файл административной части language/ru-RU/ru-RU.com_mycomponents.ini.
COM_MYCOMPONENT="Мой компонент" COM_MYCOMPONENT_RAZDEL="Гостиницы" COM_MYCOMPONENT_ID="id" COM_MYCOMPONENT_ORDERING="Порядок" COM_MYCOMPONENT_PUBLISHED="Публикация" COM_MYCOMPONENTS_N_ITEMS_DELETED="%d материалов удалено." COM_MYCOMPONENTS_N_ITEMS_DELETED_1="%d материал удалён." COM_MYCOMPONENTS_N_ITEMS_DELETED_2="%d ссылки успешно удалены" COM_MYCOMPONENTS_N_ITEMS_PUBLISHED="%d материалов опубликовано." COM_MYCOMPONENTS_N_ITEMS_PUBLISHED_1="%d материал опубликован." COM_MYCOMPONENTS_N_ITEMS_PUBLISHED_2="%d материала опубликовано." COM_MYCOMPONENTS_N_ITEMS_UNPUBLISHED="%d материалов снято с публикации." COM_MYCOMPONENTS_N_ITEMS_UNPUBLISHED_1="%d материал снят с публикации." COM_MYCOMPONENTS_N_ITEMS_UNPUBLISHED_2="%d материала снято с публикации." COM_MYCOMPONENT_RAZDEL_NEW="Новый раздел" COM_MYCOMPONENT_RAZDEL_EDIT="Редактирование раздела" COM_MYCOMPONENT_DETALIS="Детали" COM_MYCOMPONENT_OPISANIE="Описание гостиницы" COM_MYCOMPONENT_ADRES="Адрес" COM_MYCOMPONENT_SEARCH_IN_TITLE="Поиск по заголовку"
Всё теперь вы можете проверить компонент. В нём будут работать все кнопки, публикация, сортировка, постраничная навигация, и языковой файл. Можно сказать что наш компонент практически готов останется последний завершающий этап, это добавление материала.