|
Продолжаем разговор и в этой статье к нашему компоненту прикрутим Модель, а также создадим административную часть.
Еще один очень важный момент для любого компонента это процесс установки и удаления компонента из CMS Joomla 1.5. Но установка и удаление не за счет файла название компонента.xml (example.xml), а с помощью отдельных файлов для установки и удаления, в которых можно творить, что угодно, хоть письмо себе шлите о том, что на таком-то домене установлен Ваш компонент.
Итак, смысл статьи ясен, приступим к работе ))
Если Вы не читали первую часть статьи, то обязательно прочтите сначала ее, т.к. в ней объясняются базовые понятия без которых Вы не сможете понимать о чем идет речь в этой статье. Читать первую часть статьи
Первое чем мы займемся, это создание Модели, чтобы наш компонент соответствовал требованиям стандарта MVC (Модель-Вид-Контроллер).
Создаем еще одну папку в корне компонента models, а в ней файл название компонента.php (example.php), сразу приведу код файла, в котором разъясню, что и зачем написали:
<?php // Защита от прямого обращения к файлу defined( '_JEXEC' ) or die( 'Restricted access' );
// Подключаем нужные библиотеки Joomla 1.5 jimport( 'joomla.application.component.model' );
/* Создаем класс в котором: Name – это название класса из файла example.php. Model – обязательное слово в имени класса. Example – записывается с большой буквы без пробелов на латинском (это определение Модели по умолчанию) extends JModel – подключает к нашему классу, класс Joomla 1.5 JModel */ class NameModelExample extends JModel {
// Создаем функцию getMtext() в которой возвращается одна переменная $text с текстом для вывода в компоненте
function getMtext()
{
 $text = 'Я страница компонента, которая вызывается по умолчанию, данные переданы из модели!';
 
 return $text;
} }
Собственно ничего сложного, все по аналогии с предыдущими файлами из первой статьи.
Теперь давайте отредактируем ранее созданный файл views/название компонента (example)/view.html.php. В этом файле весь код остается прежним за исключением того, что теперь мы должны не задавать данные в этом файле, а получать их из модели.
Для этого строчку:$text = "Я страница компонента, которая вызывается по умолчанию";
Заменим на это:$model = $this->getModel(); $text = $model->getMtext();
Как видите, итоговая переменная $text, которую мы передаем в Вид (шаблон компонента) остается, поэтому файл views/название компонента (example)/tmpl/default.php не трогаем и весь код оставляем прежним.
Теперь давайте объясню, что за код мы вставили.
Была создана новая переменная $model, которая обращается к Модели данного Вида и загружает в себя все функции из этой Модели.
Ну, а дальше в переменную $text записываем значение из функции getMtext() созданной Модели.
Как это происходит?
По стандарту MVC разумеется ))
На данном этапе не забивайте себе голову не нужными данными!
В Интернете много всяких решений, которые, безусловно, правильные, но понять многие из них очень сложно. А все дело в том, что Joomla 1.5 достаточно гибкая система и каждый программирует, так, как привык или так, как когда-то понял и привык. В общем, я думаю, что главное понять саму систему передачи данных по стандарту MVC, а потом, в дальнейшем, каждый из Вас выберет свою собственную дорогу в программировании на Joomla 1.5.
Пришлось немного вставить лирического отступления, но поверти, это было крайне необходимо сделать, так как встречаются «умники», которые, не разобравшись в системе, навязывают свою точку зрения, запутывая при этом других и усложняя путь обучения себе и другим.
Итак, про систему MVC нужно знать всего одно правило:
Каждому Контроллеру соответствует свой Вид и каждому Виду соответствует своя Модель
Что касается Вида и Модели, то это правило работает, а вот на счет Контроллера и Вида, тут все не так просто!
К примеру, у Вас может быть с десяток Видов и соответственно Моделей, но при всем при этом, только один Контроллер. И такой расклад я считаю нормальный, так как Контроллеру по сути, нужно просто направлять по компоненту, а вот на плечи Вида и Модели ложатся все необходимые манипуляции с данными.
В Модели данные собираются, к примеру из Базы Данных, а в Виде эти данные обрабатываются и выводятся на экран. Поэтому если Вы хотите подправить какой-то Вид, то Вы всегда будете знать, где искать его Модель, так как она (Модель) будет иметь название, как и у Вида. И поверти, этот режим работы лучше не нарушать. Не нужно лепить к нескольким Видам одну Модель!
По поводу Контроллера, тут все гораздо проще, так как код контроллера, как правило, не должен быть сложным для восприятия, поэтому, его можно проследить по функциям, т.е. одна функция – одно действие (направление) компонента.
Ну вот, на пальцах объяснил, теперь давайте на примере:
В моем компоненте, который называется example существует, на данный момент, два Вида:
example - Вид по умолчанию;
nextpage - Вид второй страницы компонента.
Соответственно для первого Вида example работает Модель models/example.php, а для второго Вида nextpage будет работать Модель models/nextpage.php.
Данная структура в MVC работает по умолчанию, т.е. не нужно извращаться, чтобы это так работало.
Для проверки моего утверждения, давайте создадим еще одну Модель, для второго Вида нашего компонента.
Как я сказал ранее, называться она будет models/nextpage.php, а код будет аналогичен первой:<?php // Защита от прямого обращения к файлу defined( '_JEXEC' ) or die( 'Restricted access' );
// Подключаем нужные библиотеки Joomla 1.5 jimport( 'joomla.application.component.model' );
/* Создаем класс в котором: Name – это название класса из файла example.php. Model – обязательное слово в имени класса. Nextpage – записывается с большой буквы без пробелов на латинском (это определение Модели для Вида nextpage) extends JModel – подключает к нашему классу, класс Joomla 1.5 JModel */ class NameModelNextpage extends JModel {
// Создаем функцию getMtext() в которой возвращается одна переменная $text с текстом для вывода в компоненте
function getMtext()
{
 $text = 'Я вторая страница компонента, которая вызывается по умолчанию, данные переданы из второй модели!';
 
 return $text;
} }
Как Вы видите, изменилось только название класса Модели NameModelNextpage, а также текст для вывода я изменил на другой, хотя имя переменной оставил прежнее, что должно наводить на определенные мысли: "не нужно париться с уникальным названием переменных для разных классов, не важно где они находятся в модели или контроллере".
Теперь давайте доработаем файл views/nextpage/view.html.php, который теперь станет очень похож на файл views/название компонента (example)/view.html.php, отличие только в названии класса:<?php // Защита от прямого обращения к файлу defined( '_JEXEC' ) or die( 'Restricted access' );
// Подключаем нужные библиотеки Joomla 1.5 jimport('joomla.application.component.view');
/* Создаем класс в котором: Name – это название класса из файла example.php. View – обязательное слово в имени класса. Nextpage – вид для второй страницы компонента. extends JView – подключает к нашему классу, класс Joomla 1.5 JView */ class NameViewNextpage extends JView { /* создаем функцию с параметром «$tpl», который сразу обнулим, в самой функции создадим одну переменную «$text» и передадим ее в шаблон компонента через метод «JView::assignRef()», записав данный метод в таком виде: «$this->assignRef('имя переменной вызываемой в шаблоне', имя переменной с данными из этого файла);» */
function display ($tpl = null)
{
 $model = $this->getModel();
 $text = $model->getMtext();
 
 $this->assignRef( 'text', $text ); // Возвращаем метод display () с одним параметром $tpl
 parent:: display ($tpl);
} }
Ну, вот собственно и все, теперь у нас в пользовательской части компонента полностью работоспособная система MVC.
Теперь давайте, по аналогии, создадим административную часть компонента.
Все классы и функции будут иметь точно такое же значение, поэтому не будем долго на них останавливаться, а запишем сразу весь код.
Итак, создаем файл admin.название компонента.php (admin.example.php) в папке administrator/components/com_название компонента (com_example).
Этот файл будет главным управляющим файлом, код будет аналогичен файлу из пользовательской части components/com_название компонента (com_example)/название компонента.php (example.php), но чтобы их как-то разделить давайте первое слово в имени класса зададим Aname вместо Name из пользовательской части компонента:<?php // Защита от прямого обращения к файлу defined( '_JEXEC' ) or die( 'Restricted access' );
// Подключаем контроллер для первого старта компонента require_once( JPATH_COMPONENT.DS.'controller.php' );
// Подключаем контроллер, если он есть, имя которого задано в get переменной командной строки if($controller = JRequest::getVar( 'controller' )) {
require_once( JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php' ); }
// Создаем класс для контроллера, где «Aname» будет присутствовать во всех классах для данного контроллера $classname = 'AnameController'.$controller; $controller = new $classname( );
// Вызываем из контроллера нужную функцию, которая задана в get переменной $controller->execute( JRequest::getVar( 'task' ) );
// Команда перезагрузки страницы, если нужно (определяет сама Joomla 1.5) $controller->redirect();
Теперь создадим контроллер controller.php для первого запуска компонента.
Немного объясню, зачем я делаю этот контроллер, а потом еще и контроллер в папке controllers.
В прошлой статье я пытался объяснить, но в этой статье скажу немного по-другому.
Если у Вас не сложный компонент и Вы вполне можете поместиться в один файл контроллера, то создавать другие контроллеры нет смысла, т.е. прописывать условие:if($controller = JRequest::getVar( 'controller' )) {
require_once( JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php' ); }не нужно и создавать папку controllers с ее контроллерами не нужно, просто вписывайте все функции в контроллер controller.php и с помощью get переменной task без использования get переменной controller обозначайте их в ссылке.
Но я, даже в простых компонентах привык уходить от так называемого стандартного контроллера controller.php и работаю только с контроллерами из папки controllers. Это лично моя прихоть, а не обязательное условие из стандарта MVC.
Как я говорил ранее: «У каждого программиста есть свои заморочки, каждый находит свой стиль, благодаря гибкости Joomla 1.5»
Итак, код контроллера controller.php выглядит так:<?php // Защита от прямого обращения к файлу defined( '_JEXEC' ) or die( 'Restricted access' );
// Подключим нужные библиотеки Joomla 1.5 jimport('joomla.application.component.controller');
// Создаем класс с именем, которое задали в файле "admin.example.php": class AnameController extends JController {
function display()
{ // Подключаем Вид example JRequest::setVar( 'view', 'example' ); parent::display();
} }
Ничего нового в этом файле нет, но как Вы заметили я сразу указал Вид, куда следует идти компоненту JRequest::setVar( 'view', 'example' );, может спорный момент, но мне так проще. Дело в том, что в пользовательской части сайта компонент выводится через пункт в меню, поэтому всегда есть возможность выбрать точку входа в компонент, но в административной части, компонент выводится как есть и формировать меню нет возможности.
Да, компонент может сформировать свое собственное подменю, но в любом случае первоначальная точка доступа должна быть точно определена и для этого есть два пути. Первый, Вы уже видели, а вот второй это сделать название Вида под именем первого слова названия класса, в нашем случае это aname.
Вот как это будет выглядеть:
1. Файл admin.example.php - без изменения.
2. Файл controller.php - содержит следующий код:<?php // Защита от прямого обращения к файлу defined( '_JEXEC' ) or die( 'Restricted access' );
// Подключим нужные библиотеки Joomla 1.5 jimport('joomla.application.component.controller');
class AnameController extends JController {
function display()
{
 parent::display();
} }
3. Вид для такого контроллера будет в папке aname, название класса в файле view.html.php будет AnameViewAname, в остальном без изменений.
4. Модель для такого Вида будет в файле models/aname.php и название класса будет AnameModelAname, в остальном тоже без изменений.
Второй вариант более простой, но первый, для меня, более понятный и четко определим, что, опять таки для меня, очень важно. Я создавал компоненты для административной части, которые должны были четко определенно отображать нужную информацию и исключать возможность выбирать не нужные функции. В общем как говорится «защита от дурака». Так вот такие, естественно индивидуальные, проекты, приучили меня четко задавать точку входа в компонент.
Итак, про точки входа рассказал, дальше дело за Вами, а мы продолжаем.
Переходим к созданию Вида по умолчанию, т.е. Вид, который вызовет созданный контроллер controller.php
Создаем папку views, в ней папку название компонента (example), а вот теперь и сам файл обработки данных для Вида создадим view.html.php. Ничего нового в этом файле нет, вот его код:<?php // Защита от прямого обращения к файлу defined( '_JEXEC' ) or die( 'Restricted access' );
// Подключаем нужные библиотеки Joomla 1.5 jimport('joomla.application.component.view');
/* Создаем класс в котором: Aname – это название класса из файла admin.example.php. View – обязательное слово в имени класса. Example – записывается с большой буквы без пробелов на латинском (это и есть определение Вида по умолчанию) extends JView – подключает к нашему классу, класс Joomla 1.5 JView */ class AnameViewExample extends JView { /* создаем функцию с параметром «$tpl», который сразу обнулим, в самой функции создадим одну переменную «$text» и передадим ее в шаблон компонента через метод «JView::assignRef()», записав данный метод в таком виде: «$this->assignRef('имя переменной вызываемой в шаблоне', имя переменной с данными из этого файла);» */
function display ($tpl = null)
{
 $model = $this->getModel();
 $text = $model->getMtext();
 
 $this->assignRef( 'text', $text ); // Возвращаем метод display () с одним параметром $tpl
 parent:: display ($tpl);
} }Как видите весь код до боли знаком, изменилось только название класса AnameViewExample.
Теперь создаем в этой же папке views/example/ папку tmpl и в ней файл вывода Вида на экран default.php.
Код файла такой:<?php // Защита от прямого обращения к файлу defined('_JEXEC') or die('Restricted access'); ?>
<!— Выводим данные, перданные из файла view.html.php --> <div><?php echo $this->text; ?></div>
И все, что нам осталось сделать, это создать Модель для данного Вида.
Создаем папку models в корне компонента, а в ней файл example.php, ну и пропишем код для нашей Модели:<?php // Защита от прямого обращения к файлу defined( '_JEXEC' ) or die( 'Restricted access' );
// Подключаем нужные библиотеки Joomla 1.5 jimport( 'joomla.application.component.model' );
/* Создаем класс в котором: Aname – это название класса из файла example.php. Model – обязательное слово в имени класса. Example – записывается с большой буквы без пробелов на латинском (это определение Модели по умолчанию) extends JModel – подключает к нашему классу, класс Joomla 1.5 JModel */ class AnameModelExample extends JModel {
// Создаем функцию getMtext() в которой возвращается одна переменная $text с текстом для вывода в компоненте
function getMtext()
{
 $text = 'Я страница административной части компонента, которая вызывается по умолчанию, данные переданы из модели!';
 
 return $text;
} }И тут нет ничего нового, главное это не забыть правильно указать имя для класса AnameModelExample.
Все можем проверять, что мы тут навояли ))
Заходим в администраторскую часть Joomla 1.5, в меню «Компоненты» находим наш компонент и жмем. Если все сделано правильно, то на экране будет отображаться текст: «Я страница административной части компонента, которая вызывается по умолчанию, данные переданы из модели!»
Ну вот, компонент уже работает и информации из этих двух статей достаточно, чтобы научится создавать компоненты.
Да, я ни слова не сказал про работу с базой данных MySQL, но если Вы только учитесь создавать компоненты под Joomla 1.5, разберитесь сначала с тем, о чем я написал в этих статьях. Вот когда Вы будите с легкостью оперировать между Контроллерами, Видами и Моделями, вот тогда можно задумываться о подключении БД, а в данных статях информация о них была бы лишней.
Последнее, что я обещал рассказать, это создание файлов для установки и удаления компонента.
Компонент при установке должен как минимум создать для себя базу данных, чтобы где-то хранить данные, но многие разработчики на этом не останавливаются и создают целый процесс установки, с проверкой последней версии компонента или с запросом на выбор определенных настроек и т.д. Я тоже сторонник создания отдельных php файлов для установки и удаления компонента, где можно задать условия или какие-то проверки сделать, ну и так далее.
Приступим!
Для начала откроем файл название компонента.xml (example.xml) и пропишем в нем пару строчек:<installfile>install.example.php</installfile> <uninstallfile>uninstall.example.php</uninstallfile>
Теперь создадим эти файлы, которые разместим, в установочном пакете, в корне компонента.
Давайте в файле install.example.php выведем информацию, о том, что это учебный компонент и о том, что создатель Дмитрий Семенов и, что его можно найти на сайте sdemon.ru:<?php // Защита от прямого обращения к файлу defined( '_JEXEC' ) or die( 'Restricted access' ); ?> <div style="border:2px solid #030; background:#CCC; padding:10px; font-family:Verdana; font-size:14px; line-height:20px; text-align:center; color:#003;"> Здравствуйте! Вы установили компонент, который не выполняет никакие функции, кроме как учебное и наглядное пособие по созданию компонентов.<br> Данный компонент создан мной для того, чтобы помочь Вам научиться создавать собственные компоненты для Joomla 1.5.<br> <br> На <a href="http://sdemon.ru/" target="_blank">моем сайте</a> Вы найдете исчерпывающую информацию о том, как этот компонент создавался, а также еще много другой полезной информации по разработке приложений для Joomla 1.5.<br> <br> Приглашаю Вас на мой сайт <a href="http://sdemon.ru/" target="_blank">sdemon.ru</a> в рубрику <a href="http://sdemon.ru/thinking-aloud.html" target="_blank">Мысли вслух</a>, где я охотно делюсь своими знаниями и опытом.<br> <br> С уважением, Дмитрий Семенов. <br> </div>
В файле uninstall.example.php напомним о том, что это был учебный компонент и о том, что автор находиться на сайте sdemon.ru:<?php // Защита от прямого обращения к файлу defined( '_JEXEC' ) or die( 'Restricted access' ); ?> <div style="border:2px solid #930; background: #F6F; padding:10px; font-family:Verdana; font-size:14px; line-height:20px; text-align:center; color:#003;"> Учебный компонент Example успешно удален, надеюсь, он Вам помог в создании и, главное, в понимании устройства компонента для Joomla 1.5.<br> <br> Подробную информацию по созданию приложений для Joomla 1.5 Вы найдете на сайте <a href="http://sdemon.ru/" target="_blank">sdemon.ru</a> в рубрике <a href="http://sdemon.ru/thinking-aloud.html" target="_blank">Мысли вслух</a>.<br> <br> С уважением, Дмитрий Семенов. <br> </div>
Ну вот и все )
Скачать установочный архив компонента можно здесь
Учитесь создавать компоненты, а в одной из следующих статей я обязательно расскажу про то, как работать с базой данных MySQL.
Спасибо за внимание.
С уважением, Дмитрий Семенов.
|
Комментарии
Очень толковый урок получился!
думаю комментариев было бы куда больше, если бы не регистрация
Много облазил в интернет. Статьи с таким хорошим пояснением не видал.
Если можно ещё несколько статей по разработке компонента или плагина.
А тем кто пишет про то что инет излазил и это лучшая статья, то значит не лазил нигде - рейтинг себе поднимать не надо!