08 - Завершающий этап создания компонента joomla 3.x
Осталось совсем чуть чуть заполнить контроллер, сформировать модель, и оформить вид. Начнём с контроллера, откройте файл административной части controllers/mycomponent.php как видите он совсем небольшой и никаких функций не несёт в себе.
<?php // Запрет к прямому доступу. Если кто то попытается обратиться к файлу // напрямую, joomla выдаст пустую страницу. defined('_JEXEC') or die; /** * Класс контрорллера */ class MycomponentsControllerMycomponent extends JControllerForm { //Метод переопределения, что бы проверить можно ли добавить новую запись. public function batch($model = null) { JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); // Установить модель Mycomponent $model = $this->getModel('Mycomponent', '', array()); // Предустановленная переадресация $this->setRedirect(JRoute::_('index.php?option=com_mycomponents&view=mycomponents' . $this->getRedirectToListAppend(), false)); return parent::batch($model); } }
Теперь перейдём к папке models. Хоть у нас уже есть 2 модели, но они обрабатывают запросы пользователя, но мы теперь создадим вывод данных в xml. forms - нужен для хранения форм. Откройте файл models/fields/mycomponent.php
<?php // Запрет к прямому доступу. Если кто то попытается обратиться // к файлу напрямую, joomla выдаст пустую страницу. defined('_JEXEC') or die; // Импорт типа поля списка jimport('joomla.form.helper'); JFormHelper::loadFieldClass('list'); /** * Поля формы класса для компонента */ class JFormFieldMycomponent extends JFormFieldList { /** * Тип поля. * * Вернуть строку */ protected $type = 'Mycomponent'; /** * Метод, чтобы получить список опций для списка ввода. * * Вернуть массив. */ protected function getOptions() { $db = JFactory::getDBO(); $query = $db->getQuery(true); $query->select('*'); $query->from('#__mycomponent'); $db->setQuery((string)$query); $messages = $db->loadObjectList(); $options = array(); if ($messages) { foreach($messages as $message) { $options[] = JHtml::_('select.option', $message->id, $message->name); } } $options = array_merge(parent::getOptions(), $options); return $options; } }
Теперь сформируем вывод данных в xml файле. Код не прокомментирован. Вообще вы указываете name имя поля в бд указываете что за тип поля текстовый, чекбокс и т.д. а joomla сама выведет данные в указанные поля. Откройте файл models/forms/mycomponent.xml
<?xml version="1.0" encoding="utf-8"?> <form> <fieldset> <field name="id" type="hidden"/> <field name="name" type="text" label="COM_MYCOMPONENT_RAZDEL" size="40" default=""/> <field name="adres" type="text" label="COM_MYCOMPONENT_ADRES" size="40" default=""/> <field name="state" type="list" label="JSTATUS" class="inputbox" size="1" default="1"> <option value="1">JPUBLISHED</option> <option value="0">JUNPUBLISHED</option> </field> <field name="opisanie" type="editor" label="COM_MYCOMPONENT_OPISANIE" filter="safehtml" buttons="true" height="400" width="750"/> </fieldset> </form>
Создаём вид. В зависимости от того создаём мы новые данные или редактируем старые вид определяет метод создания свойств документа. Откройте файл views/mycomponent/view.html.php
<?php // Запрет к прямому доступу. Если кто то попытается обратиться // к файлу напрямую, joomla выдаст пустую страницу. defined('_JEXEC') or die; /** * Класс вида */ class MycomponentsViewMycomponent extends JViewLegacy { protected $state; protected $item; protected $form; /** * Отображение данных */ public function display($tpl = null) { $this->state = $this->get('State'); $this->item = $this->get('Item'); $this->form = $this->get('Form'); // Сообщение об ошибке. if (count($errors = $this->get('Errors'))) { JError::raiseError(500, implode("\n", $errors)); return false; } $this->addToolbar(); parent::display($tpl); } //Создание новых данных protected function addToolbar() { JFactory::getApplication()->input->set('hidemainmenu', true); $user = JFactory::getUser(); $userId = $user->get('id'); $isNew = ($this->item->id == 0); $checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $user->get('id')); $canDo = MycomponentsHelper::getActions($this->item->catid, 0); JToolbarHelper::title(JText::_('COM_MYCOMPONENT_RAZDEL_NEW'), 'priceleafs.png'); // Вывод кнопок навигации if (!$checkedOut && ( $canDo->get('core.edit')|| (count($user->getAuthorisedCategories('com_mycomponents', 'core.create'))) ) ) { JToolbarHelper::apply('mycomponent.apply'); JToolbarHelper::save('mycomponent.save'); } if (empty($this->item->id)) { JToolbarHelper::cancel('mycomponent.cancel'); } else { JToolbarHelper::cancel('mycomponent.cancel', 'JTOOLBAR_CLOSE'); } //Кнопка помощи, в данном случае я указал страницу куда ссылаться. //При нажатии кнопки появится модальное окно с моим сайтом. JToolbarHelper::divider(); $help_url = 'http://joomla-umnik.ru/manual-po-ispolzovaniyu-komponenta'. '-priceleaf-pro-c#sections1'; JToolbarHelper::help('COM_PRICELEAF_VIEW_TYPE1', false, $help_url ); } }
Последние штрихи. Создаём файл views/mycomponent/edit.php это наш шаблон который выведет нам данные которые мы запросили. Мы формируем цикл который поочерёдно выводит нам данные которые мы указали в xml файле. Определяет их тип и вносит туда данные. Это вся конструкция шаблона, если мы хотим что то изменить то меняется всё в xml файле.
<?php // Запрет к прямому доступу. Если кто то попытается обратиться // к файлу напрямую, joomla выдаст пустую страницу. defined('_JEXEC') or die; JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html'); JHtml::_('behavior.tooltip'); JHtml::_('behavior.formvalidation'); JHtml::_('formbehavior.chosen', 'select'); ?> <!--Сохранение данных из поля редактора, если этого не поствить то ничего работать не будет echo $this->form->getField('opisanie')->save(); где opisanie поле в бд --> <script type="text/javascript"> Joomla.submitbutton = function(task) { if (task == 'mycomponent.cancel' || document.formvalidator.isValid(document.id('mycomponent-form'))) { <?php echo $this->form->getField('opisanie')->save(); ?> Joomla.submitform(task, document.getElementById('mycomponent-form')); } else { alert('<?php echo $this->escape(JText::_('JGLOBAL_VALIDATION_FORM_FAILED'));?>'); } } </script> <form action="<?php echo JRoute::_('index.php?option=com_mycomponents&layout=edit&id='. (int) $this->item->id); ?>" method="post" name="adminForm" id="mycomponent-form" class="form-validate"> <div class="width-100 fltlft"> <fieldset class="adminform"> <!--Вывод данных из бд в форму + вкладки навигации в данном случае она одна--> <ul class="nav nav-tabs"> <li class="active"><a href="#details" data-toggle="tab"> <?php echo empty($this->item->id) ? JText::_('COM_MYCOMPONENT_DETALIS') : JText::sprintf('COM_MYCOMPONENT_DETALIS', $this->item->id); ?></a> </li> </ul> <?php foreach($this->form->getFieldset() as $field): ?> <?php if (!$field->hidden): ?> <?php echo $field->label; ?> <?php endif; ?> <?php echo $field->input; ?> <?php endforeach; ?> </fieldset> </div> <div> <input type="hidden" name="task" value="" /> <?php echo JHtml::_('form.token'); ?> </div> </form>
P.S Вот и всё поздравляю если вы всё сделали. Но уверен что много людей просто многое не поняли, неотчаивайтесь я тоже не всё с первого раза делал. Можно прочитать в интернете про классы Joomla функции и много ещё чего. Но поверьте только наглядно видя код легче понять связь объектов. Не получилось скачивайте архив с компонентом и изучайте код, если не понятно что за функция то можно поискать в гугле или яндексе ответы. Я представлю что человек который далёк от этого будет читать и много не понимать, но сила и труд всё перетрут. Надеюсь многим статья поможет!