Cоздание пользовательской части компонента

Автор: Илья Остапенко /

Продолжаем обучение создания компонента для системы управления контентом Joomla.  В прошлых двух уроках, мы узнали, что создание компонента Joomla происходит по шаблону проектирования MVC, а так же создали основу компонента и установили его в систему.

Cоздание пользовательской части компонента.

Сегодня мы будем программировать, а вернее создавать модель, вид и контролер.  Напомню для успешного понимания этого урока следует, прочесть два предыдущих. Ах да, забыл упомянуть, что создаваемый компонент подойдет как для версии Joomla 1.5, 1.6, 1.7, так и для версии 2.5. В основном я буду описывать создание компонента Joomla. Не буду говорить много слов и перейду к написанию компонента.

Пользовательская часть компонента состоит из модели, вида и контроллера, а так же из основного файла фронтэнда (пользовательской части компонента), с которого мы и начнем создание компонента.

 

Создание главного файла фронтэнда

Заходим в нашу систему, а именно в папку components/com_название компонента (в моем случае components/com_lesson), создаем файл название компонента.php (lesson.php). и вносим в него следующий код:

Сейчас я подробно объясню, что значат все эти строчки. Ну самая первая строчка вам должна быть ясна, а если нет, то даже и не пробуйте начинать создавать компонент. Я начну рассказывать все со второй.

Защита от прямого обращения к файлу. То есть если ваш файл будут напрямую запрашивать через адресную строку (www.site.ru/ components/com_название компонента/название компонента.php) то выведется сообщение "Restricted access" и код исполняться не будет. Эта строка обязательно должна быть во всех php файлах, в самом начале!!!

Подключение к контроллеру, который мы в будущем создадим. О самом контроллере расскажу позже сейчас поясню все все команды:

require_once() - оператор php, который будет подключать файл который указан в круглых скобках. Файл будет подключаться всего один раз по ходу исполнения кода.

JPATH_COMPONENT – путь в корень нашего компонента (components/com_название компонента).

. – склеивает значения в одну строку php команды

DS – выступает в роли слэша (\ или /), разделительной черты.  Фреймворк Joomla сам устанавливает нужный слэш в зависимости от ОС.

controller.php – название файла который будет подключаться, в данном случае наш будущий контроллер.

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

$controller = JRequest::getVar( 'controller' ); - тут, переменной $controller передается значение get переменной controller из адресной строки(ссылки).

JRequest::getVar() – это класс из фреймворка Joomla. Он определяет значения, находящееся в адресной строке(ссылке). Если на сайте не используется ЧПУ, то в ссылке можете увидеть что-то типа «option» или «itemid».  JRequest::getVar() будет иметь значение указанное в этой переменной.

Следовательно JRequest::getVar( 'controller' ) будет иметь значение переменной“controller”.

Далее идет условие, переменная $controller проверяется на пустоту, иначе говоря есть в ней значение или нет. Если в  адресной строке(ссылке) находиться get переменнаяcontroller, то и переменная $controller будет иметь такое же значение, следовательно должно выполняться подключение:

require_once( JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php' );

controllers – это папка где будут находиться контроллеры.

.$controller.'.php' – название файла контроллера к которому будем подключаться.

Тут мы создаем, новую переменную $classname и в неё будем вносить название нашего класса, иначе говоря, наш класс должен иметь имя, в данном случае NameController, гдеController обязательная часть имени, а Name придумали мы, то есть тут что напишете, то и будет. ВАЖНО ЗАПОМНИТЬ ЭТО ПРАВИЛО!!!

Скажу пару слов о классах и контроллерах. Каждый контроллер имеет один класс, иначе говоря, один файл – один класс. И пока мы не укажем хотя бы один класс, компонент работать ни за что не будет,  даже если весь компонент будет написан правильно. Так же нужно понимать, что классы находиться не в файлах контроллера, а именно в этом главном файле фронтэнда.

Так же вам нужно знать, что любой компонент будет иметь как минимум одну страницу, в которой будет находиться пустая переменная $controller, для которой необходимо создать отдельный класс с функциями, которые нужно будет выполнить. Для того чтобы было понятно, что  и где будет выполняться разработчики Joomla сделали такую строку$classname = 'NameController'.$controller;  где к названию класса будет добавляться переменная $controller в которой содержится get значение. В итоге классы в контроллерах будут называться так:

На странице с пустой переменной $controller – class NameController {}

На остальных страницах – class NameControllerGetname  - где последнее является значением из переменной $controller

Тем самым все классы в компоненте получат свои уникальные имена, и теперь в переменную $controller можно записать не значение переменной get, а целый класс, который у нас записан в строке $controller = new $classname() где new означает, что это новый рабочий класс, а переменная $classname(), совокупность функций в этом классе.

Фууух…. Сложно, довольно таки запутанно, но за, то должно быть понятно и разжевано. Идем дальше.

Get переменная Task, позволяет выбрать нужную нам функцию из совокупности функций в классе. Она может, как быть, так и не быть, все зависит от  компонента и, как вы его будете создавать, но если она есть, то из всего класса выполниться только она одна.

Благодаря оператору execute, происходит выбор именно той функции, которую вы указали. Если функция не указанна, то выполниться функция по умолчанию display().

Когда компонент отработал, а все классы выполнили все свои функции, остается вопрос, выполнять загрузку другой страницы или нет? Это ложиться на плечи самой Joomla. Просто необходимо присвоить значение redirect() переменной $controller.

Вы могли заметить, что в коде кое-чего не хватает, но это сделано намеренно.  В коде нахватает закрывающего php тега ?> Этого тега не должно быть не в одном файле компонента это тоже надо запомнить! Это нужно для того, чтобы весь файл был одним целым, и не оставалось свободного места в коде.

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

 

Создание контроллера

Сейчас мы создадим контроллер который будет отвечать за первый старт, иначе начальную страницу компонента. Он будет находиться в корневой папке компонента. Название его мы уже писали в основном файле controller.php. Он будет подключаться только когда в строке адреса (ссылке) не определен любой другой контролер, при помощи get переменной controller.

Собственно это весь код нашего контроллера. Как видите,в нем есть строчки которые я уже описал выше, следовательно их объяснение я буду пропускать.

С помощью класса jimport мы подключаем нужную нам библиотеку Joomla, которая содержит необходимые данные по работе с компонентом. Эту строку мы будем так же прописывать при создании Вида и Модели, только будет меняться последнее слово, то есть вместо controller будет model или view.

Далее мы создаем класс с именем (NameController) которое мы написали в предидущем файле (lesson.php). Так же при создании класса мы прописываем ещё один операторextends, он отнесет созданный нами класс к классу Jcontroller. Следует запомнить, что у всех созданных классов, в которых планируете использовать методы из классов Joomla, должен быть свой класс Joomla. Так же как и с библиотекой, в зависимости от типа файла будет меняться и класс Jview или Jmodel. Нужно указывать правильный класс Joomla, для создаваемого класса ЭТО ВАЖНО ЗАПОМНИТЬ!!! 

Так, теперь объясню сам код. Как видите в созданном классе имеется только одна функцияdisplay, которая возвращает значение parent::display(). Теперь давайте вспомним, что мы объявили класс ontroller через оператор extends, следовательно, функция вернет значение классу JСontroller и получается что будет вызван метод  JController::display.

Собственно это весь код контролера, теперь осталось сделать модель и вид чем мы сейчас и займемся.

 

Создание модели

Наша модель должна находиться в папке models, следовательно, необходимо создать в корневой папке компонента, папку с таким названием. В ней создаем файл нашей модели, он должен называться название компонента.php (в моем случае lesson.php).  Код нашей модели будет выглядеть так:

Собственно ничего сложного. Почти все абсолютно аналогично предыдущим файлам. Хочу обратить ваше внимание на подключаемую библиотеку jimport. Как и писал выше у каждого типа файла (модель, вид или контролер) будет подключаться своя библиотека. Так как это файл модели, то в последнее слово в подключении jimport – model. Далее создаем класс:

Name – название класса созданного в основном файле lesson.php

Model – обязательное слово обозначающее, что это модель

Lesson - обязательно с большой буквы. Это слово определяет модель, установленную по умолчанию.

extends JModel – подключает к нашему классу, класс Joomla – JModel.

Далее создаем функцию getMtext, которая будет возвращать одну переменную $text  оператором return.  В переменной  $text  будет находиться сообщение, которое будет выводиться на сайте при обращении к компоненту.

Вот собственно и все, модель создана, теперь осталось создать вид и пользовательская часть компонента готова.

 

Создание вида

Файлы вида должны находиться в папке views/название компонента (в моем случаеviews/lesson). Вид, в отличие от модели и компонента, состоит из файла управления данными и файла вывода данных, иначе говоря, из двух файлов. Сначала мы создадим файл управления данными, который должен называться view.html.php. Его код будет выглядеть так:

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

Name – название класса созданного в основном файле lesson.php

View – обязательное слово обозначающее, что это вид

Lesson - обязательно с большой буквы. Это слово определяет вид, установленный по умолчанию.

extends JView – подключает к нашему классу, класс Joomla – JView.

Далее создаем функцию display с параметром $tpl и обнуляем его.  Далее создаем новую переменную $model, которая будет обращаться к модели данного вида и загружать функции из неё. Ну а в переменную $text вносим значение из функции getMtext() из модели. Далее переменную $text передаем в шаблон командой assignRef из класса JoomlaJview. Это записывается таким способом:

$this->assignRef( 'переменная, вызываемая из шаблона', переменная с данными из этого файла );

 

ВНИМАНИЕ!!! Если вы создаете компонент для версии joomla 2.5, то для того чтобы у вас появился пункт меню вашего компонента, вам необходимо создать файл default.xml в папке view/название компонента/tmpl (view/lesson/tmpl) с кодом:

Теперь код файла управления данными нам понятен, осталось только создать файл вывода данных, который будет находиться в папке view/название компонента/tmpl (view/lesson/tmpl) и называться он должен default.php. Код этого файла будет выглядеть так:

Вот и все! Ну если вам непонятен код <?php echo $this->text; ?> то в двух словах он выводит данные переменной текст из модели.

Теперь давайте проверим, работает ли наш компонент?  Для этого отправляемся в пункт меню в админке Joomla и выберите одно из созданных и опубликованных типов меню. В нем создайте новый пункт и выберите из списка наш компонент. Так как мы создали только одну страницу компонента под названием Lesson, то именно она у нас и будет выводиться. Выбираем её, заполняем строку заголовок и сохраняем новый пункт меню. Теперь осталось только проверить работает ли наш компонент. У меня все прекрасно выводиться, надеюсь у вас тоже =)

Получился очень большой пост, но надеюсь он того стоил. Я старался все максимально подробно описать и упомянуть, опять же надеюсь все доступно понятно, если нет всегда можно спросить, что не понятно в комментарии.

 

Скачать модуль можно по ссылке ниже:
com_lesson_1

Оставить комментарий

Это не спам.