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

Итак у нас есть базовый компонент с названием com_blog в папке с этим компонентом должен лежать файл blog.php это и есть наша точка входа! С этого файла начинается работа нашего компонента.

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

jimport( 'joomla.application.component.controller' );
$controller = JController::getInstance( 'blog' );
$controller->execute( JFactory::getApplication()->input->getCmd( 'task', '' ) );
$controller->redirect();

Что тут происходит? После того как мы вызвали свой компонент ?option=com_blog мы попадаем в точку входа в приложение blog.php в которой:
jimport( 'joomla.application.component.controller' ); - в этой строке мы подключаем класс контроллера который лежит в папке /libraries/joomla/application/component/

$controller = JController::getInstance( 'blog' ); - в этой строке создается экземпляр контроллера по умолчанию. Этот контроллера лежит в той же папке что и файл blog.php и имя файла controller.php

$controller->execute( JFactory::getApplication()->input->getCmd( 'task', '' ) ); - в этой строке мы указываем контроллеру по умолчанию выполнить задачу (task) которая передана через переменную task в адресной строке

После этого управление передается нашему контроллеру который состоит приблизительно из такого кода:

defined( '_JEXEC' ) or die;
jimport( 'joomla.application.component.controller' );

class blogController extends JController
{
	function display( $cachable = true )
	{
		$this->default_view = 'category';
		parent::display( $cachable );
	}
}

Если в адресной строке не указана задача (task) то контроллер выполнит метод dispaly который является методом по умолчанию

В переменной $this->default_view = 'category'; мы задаем вид по умолчанию для этого компонента! Тоесть если мы в адресной строке не передадим переменную view с указанием вида для отображения то выведется тот вид который указан в переменной $this->default_view! Если вид по умолчанию не указан и не передана переменная view мы получим ошибку!

Строка parent::display( $cachable ); получает текущий вид и управление переходит в наш вид в котором вызываеться метод display() код которого должен быть приблизительно такой:

defined( '_JEXEC' ) or die;
jimport( 'joomla.application.component.view' );
class BlogViewCategory extends JView
{
	protected $items;
	public function display( $tpl = null )
	{
		$this->item = $this->get( 'Items' );
		parent::display( $tpl );
	}
}

$this->item = $this->get( 'Items' ); - в этой строке мы вызываем метод getItems в модели category.php модель должна лежать в папке models и файл модели будет приблизительно такой:

jimport( 'joomla.application.component.modellist' );
class BlogModelCategory extends JModel
{
	public function getItems(){
		$items = array(1, 2, 3, 4, 5);
		return $items;
	}
}

После получения данных из модели выполняется в виде выполняеться метод parent::display( $tpl ); которая подключает файл шаблона default.php который лежит в папке tmpl нашего вида.
Схематически все это работает так: Схема работы базового компонента

Что же произойдет если мы вызовем компонент с переданной задачей
?option=com_blog&task=mytask? в это случае контроллер по умолчанию BlogController который расположен в файле controller.php будет искать метод mytask

Если этого метода mytask нет в нашем контроллере то выполнится метод по умолчанию: parent::display( $cachable );

Если же есть метод то он вызовется и выполнит свою работу!

Если мы хотим вызвать контроллер вида и выполнить задачу которая создана в нем мы должны писать так:
?option=com_blog&task=category.mytask тогда у нас вызовется контроллер в файле category.php который должен лежать в папке controlllers! Если же задача не найдена то будет выполнен метод parent::display( $cachable ); по умолчанию!