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="Поиск по заголовку"
Всё теперь вы можете проверить компонент. В нём будут работать все кнопки, публикация, сортировка, постраничная навигация, и языковой файл. Можно сказать что наш компонент практически готов останется последний завершающий этап, это добавление материала.