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

Никаких мыслей по поводу “08 - Завершающий этап создания компонента joomla 3.x ”