В этой статье я расскажу как для своего компонента создать категории. При этом мы будем использовать стандартный компонента com_categories для создания наших категорий!
Это позволит нам создавать категории с неограниченной вложенностью для нашего компонента, и избавит нас от необходимости создавать таблички для хранения категорий и создания MVC слоя для отображения компонента.

Для того что бы начать создавать категории достаточно вызвать в админке компонент com_categories, и передать переменную с именем компонента для которого мы хотим создавать категории. Например:
administrator/index.php?option=com_categories&view=categories&extension=com_blog
Внимание! У вас уже должен существовать компонент для которого вы хотите создавать категории иначе получите ошибку!

Теперь мы можем свободно создавать категории для нашего компонента!

Для того что бы в каком то виде создать выпадающий список для выбора списка категорий нужно в XML файле описывающем форму добавить следующую строку:

<field name="catid" type="category" extension="com_blog"
                    label="JCATEGORY" description=""
                    class="inputbox" required="true" />

В атрибуте extension вы должны указать имя компонента для которого вы хотите получить список категорий.

Для того что бы выбрать список категорий нашего компонента из базы данных можно создать такой запрос с помощью конструктора запросов:

$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select( '*' )->from( '#__categories' );
$query->where( 'published=1' )->where( 'extension=' . $db->quote( 'com_blog' ) );
$db->setQuery( $query );
$list = $db->loadObjectList();

Единственное что нам остается это создание подпунктов меню в компоненте com_categories для связи с видами нашего компонента, как это показано на изображении ниже для компонента "Материалы". Пример подменю

Для создания такого меню нам нужно создать помощник вида!

Помощник вида должен находится в папке: administrator/components/com_имя_компонента/helpers/
и файл со скриптом помощника вида должен называться так же как и наш компонент! то есть если у нас компонент com_blog то должен быть файл со скриптом: administrator/components/com_blog/helpers/blog.php

Внутри мы должны создать класс помощника вида с функцией addSubmenu($vName) в которой мы перечисляем все пункты подменю!

Содержимое файла должно быть приблизительно таким:

<?php
defined('_JEXEC') or die;
class BannersHelper
{
	public static function addSubmenu($vName)
	{
		JSubMenuHelper::addEntry(
			JText::_('НАЗВАНИЕ_ПЕРВОГО_ПОДМЕНЮ'),
			'index.php?option=com_blog&view=view1',
			$vName == 'view1'
		);

		JSubMenuHelper::addEntry(
			JText::_('НАЗВАНИЕ_ПОДМЕНЮ_ДЛЯ_КАТЕГОРИЙ'),
			'index.php?option=com_categories&extension=com_blog',
			$vName == 'categories'
		);

		JSubMenuHelper::addEntry(
			JText::_('НАЗВАНИЕ_ВТОРОГО_ПОДМЕНЮ'),
			'index.php?option=com_blog&view=view2',
			$vName == 'view2'
		);
	}
}

Для добавления служит метод:
JSubMenuHelper::addEntry($name, $link = '', $active = false);
в котором всего три параметра
$name - имя подпункта меню
$link - куда ссылается этот компонент
$active - активный ли этот пункт меню

Внимание! - для Joomla 3.0.x класс JSubMenuHelper считается устаревшим! и он заменен на класс JHtmlSidebar в котором есть точно такой же метод addEntry с точно такими же параметрами! По сути для Joomla 3.0.x помощник вида будет выглядеть так:

<?php
defined('_JEXEC') or die;
class BannersHelper
{
	public static function addSubmenu($vName)
	{
		JHtmlSidebar::addEntry(
			JText::_('НАЗВАНИЕ_ПЕРВОГО_ПОДМЕНЮ'),
			'index.php?option=com_blog&view=view1',
			$vName == 'view1'
		);

		JHtmlSidebar::addEntry(
			JText::_('НАЗВАНИЕ_ПОДМЕНЮ_ДЛЯ_КАТЕГОРИЙ'),
			'index.php?option=com_categories&extension=com_blog',
			$vName == 'categories'
		);

		JHtmlSidebar::addEntry(
			JText::_('НАЗВАНИЕ_ВТОРОГО_ПОДМЕНЮ'),
			'index.php?option=com_blog&view=view2',
			$vName == 'view2'
		);
	}
}

Проверялось в Joomla 2.5.x и в Joomla 3.0.x!