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

 

Всё теперь вы можете проверить компонент. В нём будут работать все кнопки, публикация, сортировка, постраничная навигация, и языковой файл. Можно сказать что наш компонент практически готов останется последний завершающий этап, это добавление материала.