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 функции и много ещё чего. Но поверьте только наглядно видя код легче понять связь объектов. Не получилось скачивайте архив с компонентом и изучайте код, если не понятно что за функция то можно поискать в гугле или яндексе ответы. Я представлю что человек который далёк от этого будет читать и много не понимать, но сила и труд всё перетрут. Надеюсь многим статья поможет!