Предисловие (читать не обязательно =) ).
Я далеко не гуру Joomla, но в качестве веб-мастера неплохо в ней разбираюсь. И так уж вышло, что среди всех четырех с половиной тысяч расширений для Joomla, опубликованных на их официальном сайте, я не нашел того, который бы в полной мере соответствовал необходимой функциональности разрабатываемого мною сайта. Хотя я и не исключаю, что просто плохо искал.
Ну что поделать, нет, так нет, придется разбираться и писать самому.
Что мне помогло и чем я хочу поделиться с вами.
Для начала немного о том, что можно нарыть в гугле на эту тему:
Постановка задачи.
Кратко опишу какие задачи я перед собой ставил при создании собственного компонента. Хотя, по ряду причин, они, конечно, будут немного отличатся от реальных. ;)
Итак, представим, что мы хотим написать и встроить в сайт некую систему, дающую конкретные рекомендации пользователю по ремонту его автомобиля, в зависимости от того какие данные о проблемы предоставляет пользователь. То есть, получается, некий простой аналог экспертной системы, если можно так выразиться.
Пример: Допустим у пользователя не заводится автомобиль. Он заходит на сайт, чтобы получить какие-нибудь рекомендации, переходит в эту систему. Далее он видит несколько предложенных вариантов для выбора:
Пользователь, естественно выбирает первый вариант, и получает следующий список:
Здесь пользователь опять выбирает наиболее подходящий для него пункт, и таким образом «спускается по дереву» до тех пор, пока не получит конкретную рекомендацию, к примеру — «проверьте, заряжен ли у вас аккумулятор».
Описание нашего компонента.
Как видно по описанию, компонент на самом деле очень простой, но все-таки чуть по сложнее и по интереснее описываемого всеми компонента hello.
Наш компонент мы назовем — UserHelp.
Инструментальные средства.
Начинающим очень рекомендую использовать компонент — EasyCreator. В структуре разрабатываемого вами компонента сразу многое станет понятнее, да и сама разработка будет проще. На рабочий сайт EasyCreator ставить не имеет смысла. По мне, так его стоит использовать только на локале для создания и тестирования своего компонента.
Данный компонент позволяет создавать собственные расширения. Считайте это IDE в веб-интерфейсе. Он вам сразу и все необходимые каталоги создаст и файлы контроллера, и модели, и представления, причем со всем базовым набором кода. Да и сам код будете писать в приятном редакторе. В общем крайне вкусный компонентик, правда бажный немного…
Ну да ладно, не об этом компоненте речь.
Необходимая информация.
Итак, что же есть такого интересного в Joomla 1.5, что нам необходимо знать, чтобы создать собственный компонент.
И это, конечно же, известная всем архитектура Joomla 1.5 — MVC — Model-View-Controller, что в переводе на русский означает — Модель-Представление-Контроллер.
Вообще говоря, когда я в полной мере осознал что это такое, я понял, что на Joomla 1.0 я не вернусь больше никогда.
Итак, что же из себя представляет эта MVC.
Модель, это часть компонента, которая оперирует данными и передает результат в Представление.
Представление, это часть компонента, которая отвечает за вывод данных, который получает из модели.
Контроллер, это часть компонента, которая отвечает за управление всем, реагирует на события, запускаемые пользователем, запускает нужные модели и обрабатывает полученные данные для представления.
Тем, кто читает это все в первый раз, наверное, будет не все понятно. Но на самом деле, все очень просто и удобно.
Хотя, некоторые моменты мне и самому до сих пор не совсем понятны. К примеру, куда лучше помещать логику — в Контроллер или в Модель? Кстати, если кто-нибудь мне сможет однозначно и обоснованно ответить на этот вопрос, буду очень благодарен. =)
Начнем.
Ну что, начнем создавать наш компонент.
Для нашего компонента в каталоге components создадим подкаталог com_userhelp.
В нем будут содержаться следующие файлы и каталоги:
Собственно, все эти файлы (за исключением css) будут созданы автоматически, если в описанном мною выше компоненте EasyCreator, вы создадите новый проект, с соответствующим названием — UserHelp.
Надеюсь, что кто-нибудь из хабрачанов будет так любезен и подарит мне инвайт =), ибо очень хочется в своих последующих 2-х или 3-х частях полностью описать процесс создания данного компонента (в одну часть все не уместить). В следующих частях планирую рассказать, как используя Joomla API можно легко работать с БД и XML. А так же, еще в одной части расскажу о том как прикрутить AJAX к своему компоненту, и покажу это так же на примере рассматриваемого компонента UserHelp.
Я далеко не гуру Joomla, но в качестве веб-мастера неплохо в ней разбираюсь. И так уж вышло, что среди всех четырех с половиной тысяч расширений для Joomla, опубликованных на их официальном сайте, я не нашел того, который бы в полной мере соответствовал необходимой функциональности разрабатываемого мною сайта. Хотя я и не исключаю, что просто плохо искал.
Ну что поделать, нет, так нет, придется разбираться и писать самому.
Что мне помогло и чем я хочу поделиться с вами.
Для начала немного о том, что можно нарыть в гугле на эту тему:
- http://www.webflasher.net/ru/webmasteru/joomla-1-5.html — статья в 4х уроках о том, как создать собственный компонент в Joomla 1.5. Судя по всему, автор особо не заморачивался, взял вот это http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1 загнал текст в промпт и разместил на вышеуказанной странице. И, честно говоря, мне не доставило особого удовольствия, сидеть и разбираться в непонятно как написанном тексте. Уж лучше тогда читать и разбираться с оригиналом на docs.joomla.org. Но все же, хоть какая то информация на родном мне языке была мне полезна на начальном этапе.
- Потом мне на глаза попалась вот такая статья — http://kjoomla.com/lessons/35-lessons/45-lesson1.html Чтение и разбор которой был для меня очень и очень полезным. Все достаточно грамотно описано, буквально разжевано. Респект автору. Хотя, в качестве примера взят все тот же, тестовый компонент hello.
Постановка задачи.
Кратко опишу какие задачи я перед собой ставил при создании собственного компонента. Хотя, по ряду причин, они, конечно, будут немного отличатся от реальных. ;)
Итак, представим, что мы хотим написать и встроить в сайт некую систему, дающую конкретные рекомендации пользователю по ремонту его автомобиля, в зависимости от того какие данные о проблемы предоставляет пользователь. То есть, получается, некий простой аналог экспертной системы, если можно так выразиться.
Пример: Допустим у пользователя не заводится автомобиль. Он заходит на сайт, чтобы получить какие-нибудь рекомендации, переходит в эту систему. Далее он видит несколько предложенных вариантов для выбора:
- ваша машина не заводится,
- ваша машина заводится, но при трогании с места глохнет,
- ваша машина заводится, но при движении иногда глохнет.
Пользователь, естественно выбирает первый вариант, и получает следующий список:
- двигатель пытается завестись, но не заводится,
- никаких движений в двигателе не слышно.
Здесь пользователь опять выбирает наиболее подходящий для него пункт, и таким образом «спускается по дереву» до тех пор, пока не получит конкретную рекомендацию, к примеру — «проверьте, заряжен ли у вас аккумулятор».
Описание нашего компонента.
- в базе данных должны быть созданы соответствующие таблицы, хранящие в себе необходимые данные для диагностики проблемы автомобиля,
- компонент должен иметь логику по обработке действий пользователя и выборке из БД необходимых данных,
- компонент должен иметь шаблон по отображению на странице данных, выбранных из БД.
Как видно по описанию, компонент на самом деле очень простой, но все-таки чуть по сложнее и по интереснее описываемого всеми компонента hello.
Наш компонент мы назовем — UserHelp.
Инструментальные средства.
Начинающим очень рекомендую использовать компонент — EasyCreator. В структуре разрабатываемого вами компонента сразу многое станет понятнее, да и сама разработка будет проще. На рабочий сайт EasyCreator ставить не имеет смысла. По мне, так его стоит использовать только на локале для создания и тестирования своего компонента.
Данный компонент позволяет создавать собственные расширения. Считайте это IDE в веб-интерфейсе. Он вам сразу и все необходимые каталоги создаст и файлы контроллера, и модели, и представления, причем со всем базовым набором кода. Да и сам код будете писать в приятном редакторе. В общем крайне вкусный компонентик, правда бажный немного…
Ну да ладно, не об этом компоненте речь.
Необходимая информация.
Итак, что же есть такого интересного в Joomla 1.5, что нам необходимо знать, чтобы создать собственный компонент.
И это, конечно же, известная всем архитектура Joomla 1.5 — MVC — Model-View-Controller, что в переводе на русский означает — Модель-Представление-Контроллер.
Вообще говоря, когда я в полной мере осознал что это такое, я понял, что на Joomla 1.0 я не вернусь больше никогда.
Итак, что же из себя представляет эта MVC.
Модель, это часть компонента, которая оперирует данными и передает результат в Представление.
Представление, это часть компонента, которая отвечает за вывод данных, который получает из модели.
Контроллер, это часть компонента, которая отвечает за управление всем, реагирует на события, запускаемые пользователем, запускает нужные модели и обрабатывает полученные данные для представления.
Тем, кто читает это все в первый раз, наверное, будет не все понятно. Но на самом деле, все очень просто и удобно.
Хотя, некоторые моменты мне и самому до сих пор не совсем понятны. К примеру, куда лучше помещать логику — в Контроллер или в Модель? Кстати, если кто-нибудь мне сможет однозначно и обоснованно ответить на этот вопрос, буду очень благодарен. =)
Начнем.
Ну что, начнем создавать наш компонент.
Для нашего компонента в каталоге components создадим подкаталог com_userhelp.
В нем будут содержаться следующие файлы и каталоги:
- userhelp.php — точка входа в компонент, этот файл вызывается самым первым.
- controller.php — контроллер.
- userhelp.xml — XML-файл, необходимый для установки компонента.
- models/userhelp.php — модель.
- views/userhelp/view.html.php — представление, получающее данные из модели или контроллера передающая их в шаблон.
- views/userhelp/tmpl/default.php — файл стандартного шаблона, запускаемый автоматически при отображении данных.
- css/userhelp.css — CSS-файл для стилизации отображения.
Собственно, все эти файлы (за исключением css) будут созданы автоматически, если в описанном мною выше компоненте EasyCreator, вы создадите новый проект, с соответствующим названием — UserHelp.
Надеюсь, что кто-нибудь из хабрачанов будет так любезен и подарит мне инвайт =), ибо очень хочется в своих последующих 2-х или 3-х частях полностью описать процесс создания данного компонента (в одну часть все не уместить). В следующих частях планирую рассказать, как используя Joomla API можно легко работать с БД и XML. А так же, еще в одной части расскажу о том как прикрутить AJAX к своему компоненту, и покажу это так же на примере рассматриваемого компонента UserHelp.