Создание компонента для джумла 3. SQL скрипт для обновления

Здравствуйте уважаемые читатели!

Как я и обещал, в этой статье я расскажу про основы создания компонентов Joomla. Сразу поясню, что компонент - это абстрактное понятие, основанное на концепции MVC (Model-View-Controller), представляющее совокупность внутренней архитектуры приложения, его представления и механизма взаимодействия с базой данных.

Раздел I. Фронтэнд компонента

Часть I. Установка компонента "My Extension" и установочный файл XML

Компонент представляет собой усложнённый плагин Joomla. Компоненты необходимо использовать в тех случаях, когда необходим полный контроль над данными, к примеру, компонент ViruteMart - популярный компонент - магазин. В нём есть доступ как и в бакэнде, так и во фронтэнде для работы с данными таблиц (заказы. формирование товаров и т.д.).

Настоятельно рекомендую, при разработке собственных компонентов - тестировать каждый с различными настройками сервера, что избежать возможных ошибок. Компонент "My Extension" будет выводить "мудрые мысли" во фронтэнде с возможностью их просмотра и редактирования в бакэнде сайта. Компонент использует следующую таблицу sql "#_myextension_foobar":

  • Чистый код
1. CREATE TABLE IF NOT EXISTS `jos_myextension_foobar` (
2. `id` int (11) unsigned NOT NULL AUTO_INCREMENT,
3. `misil` text NOT NULL,
4. `avtor` text,
5. `checked_out` int (11) unsigned NOT NULL DEFAULT "0" ,
6. `checked_out_time` datetime NOT NULL DEFAULT "0000-00-00 00:00:00" ,
7. `ordering` int (11) unsigned NOT NULL DEFAULT "0" ,
8. `published` tinyint (1) unsigned NOT NULL DEFAULT "0" ,
9. `hits` int (11) unsigned NOT NULL DEFAULT "0" ,
10. `catid` int (11) unsigned NOT NULL,
11. `params` text NOT NULL,
12. PRIMARY KEY (`id`)
13. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

Заполните её тестовым содержимым:

  • Чистый код
1. INSERT INTO `jos_myextension_foobar` (`id`, `misil`, `avtor`, `checked_out`, `checked_out_time`, `ordering`, `published`, `hits`, `catid`, `params`) VALUES
2. (100, "" , NULL, 0, "0000-00-00 00:00:00" , 4, 1, 13, 1, "" ),
3. (101, "Главная польза капитала не в том, чтобы сделать больше денег, но в том, чтобы делать деньги ради улучшения жизни." , "Генри Форд" , 0, "0000-00-00 00:00:00" , 3, 1, 43, 1, "" ),
4. (102, "Брак - единственное приключение, доступное робким." , "Вольтер" , 0, "0000-00-00 00:00:00" , 1, 1, 72, 1, "" ),
5. (103, "Брак - единственная война, во время которой вы спите с врагом." , "Франсуа де Ларошфуко" , 62, "2009-03-11 11:18:32" , 2, 1, 55, 1, "" ),
6. (104, "Брак - это многолетний героический труд отца и матери, поднимающих на ноги своих детей." , "Бернард Шоу" , 0, "0000-00-00 00:00:00" , 1, 0, 0, 2, "" ),
7. (105, "Не судите о человеке только по его друзьям. Помните, что друзья у Иуды были безукоризненны." , "Эрнест Хемингуэй" , 0, "0000-00-00 00:00:00" , 2, 1, 49, 2, "" );

Для разработки нашего приложения "My Extension" и, вообще, для установки любых компонентов Вам понадобится стандартный установочный XML файл, Вы вправе назвать его как угодно, я назвал install.xml:

  • Чистый код
1.
2. version= " 1.0" encoding= " utf-8" ?>
3. //dev.joomla.org/xml/1.5/component-install.dtd">
4. type= " component" version= " 1.5" >
5. My Extension
6. MonthName Year
7. Author"s Name
8. Author"s Email
9. Author"s Website
10. Copyright Notice
11. Component License Agreement
12. Component Version
13.
14. Component Description
15.
16.
17. My Extension
18.
19.
20.
21.
22.
23.

Кодировка файла должна соответствовать UTF-8.

Выберите уникальное имя для компонента, но будьте осторожны при выборе, - названия компонентов в Joomla не должны совпадать. Имя компонента формируется по следующему формату: com_parsedname и делается это автоматически системой. Например, "My Extension" будет трансформировано при установке в "com_myextension". В нашем случае имя определено в теге "name":
My Extension

Примечание. Будьте внимательны, от имени компонента зависит название классов элементов MVC.

XML-файл необходимо помести в архив, одного из допустимых форматов "ZIP, TAR, GZ, TGZ, GZIP, BZ2, tbz2 или BZIP2". Архив необходимо загрузить и установить через менеджер установки Joomla, после чего Вы получите пустой компонент, который в дальнейшем мы и будем использовать.

Ваш компонент "My Extension" будет размещён в директории "components/com_myextension". В эту директорию необходимо поместить файл "myextension.php". Файл "myextension.php" будет выполняться при загрузке страницы во фронтенде сайта. О содержимом этого файла я расскажу позже.

После установки в менеджере админ панели будет автоматически создана директория "administrator/components/com_myextension". В указанной директории необходимо создать файл "myextension.php", который будет исполнятся в бакэнде(админ. панели) сайта.

Примечание. Согласно принятым правилам безопасности в директории не забудьте поместить пустой файл "index.html".

Следует учитывать, что концепция MVC (Model-View-Controller) совсем не означает полное разделение представления и логики Вашего приложения, все указанные три составляющих достаточно связаны вместе. В связи с чем, изменение кода внутри одного из составляющих может вызвать ошибки в других двух элементах.

Часть II. "Model" MVC. Модель.

Пример взаимодействия составляющих MVC:


"Модель"(Model) приложения используется для обработки данных. В большинстве случаев информация будет получена из базы данных.

"Представление"(View) определяет внешнее отображение данных, говоря простым языком - это шаблоны нашего компонента, то есть - то как компонент будет отображён на страницах сайта.

Данные, которые мы выводим с использованием "представления(View)" приложения происходят из одной или нескольких моделей. Эти модели автоматически взаимодействуют с определённым "представлением(View)", связи между ними обеспечивает контроллер приложения.

Про контроллер можно сказать - "это мозги нашего приложения". "Контроллер" выбирает модель, с которой соприкасается запрос и выполняет все необходимые изменения в базе данных. "Контроллер" определяет вид использования модели с отображением компонента. Контроллер выполняет действия либо перенаправляет пользователя на определённую страницу, или отображает данные. При отображении данных контроллер создает класс View и связывает его с одной или несколькими моделями. Связывание модели и представления происходит с использованием методов "get" и "assignRef". Указанные методы во всех случая размещаются в файле представления, который, как правило, называется "view.html.php". Пример:

  • Чистый код
1.
2.
3.
4. {
5. // взаимодействие с моделью
6. $foobar =& $this->get ("Foobar" );
7. $this->
8.
9. parent::display ($tpl);
10. }
11.

Однако, чтобы был толк от сказанного и от MVC в Joomla нужно создать модель, - класс "MyextensionsModelMyextensions" Joomla, создаваемый путём наследования родительского класс "JModel".

  • Чистый код
1.
2. /
3. / проверяем доступность
4.
5. // импортируем класс JModel
6. jimport ();
7. /**
8. * Модель для Foobar
9. */
10.
11. {
12.
13. }
14.
15.

После этого можно понаписать всё, что угодно в классе "MyextensionsModelMyextensions", в рамках разумного. Например, напишем класс - модель, который будет отвечать за вывод информации из таблицы "#__myextension_foobar":

  • Чистый код
1.
2.
3. /**
4. * Урок по созданию первого компонента в Joomla
5. *
6. * @package Ермаков А.П.
7. * @subpackage Components
8.
9. * @license GNU/GPL
10. */
11.
12. // Запрещаем доступ вне системы Joomla
13.
14.
15. jimport ("joomla.application.component.model" );
16.
17. class MyextensionsModelMyextensions extends JModel
18. {
19.
20. /**
21. * Myextensions data array
22. *
23. * @var array
24. */
25. var $_foobar;
26.
27.
28. /**
29. * Returns the query
30. * @return string The query to be used to retrieve the rows from the database
31. */
32. function _buildQuery ()
33. {
34. $query = " SELECT * "
35. . " FROM #__myextension_foobar" ;
36.
37. return $query;
38. }
39.
40. /**
41. * Возвращаем данные
42. * @return array Возврату подлежит массив объектов
43. */
44. function getFoobar ()
45. {
46. // проверяем существует или нет
47. if (empty ($this->_foobar))
48. {
49. $query = $this->_buildQuery ();
50. $this->_foobar = $this->_getList ($query);
51. }
52.
53. return $this->_foobar;
54. }
55.
56. }
57.
58.

Указанный класс необходимо поместить в файл "myextension.php" в дикректорию "/components/com_myextension/model/"

Вместо получения данных (getFoobar) можно использовать следующую функцию "save($data)":

  • Чистый код
1. /**
2. * Save a foobar
3. *
4. * @param mixed object or associative array of data to save
5. * @return Boolean true on success
6. */
7. function save ($data)
8. {
9. // доступ к таблице
10. $table =& $this->getTable ("Foobar" );
11. // сохранение данных
12. if (!$table->save ($data))
13. {
14. // есл ошибка, можно вывести сообщение
15. $this->setError ($table->getError ());
16. return false;
17. }
18. return true;
19. }
20.

Функция "save($data)" бесполезна во фронтэнде сайта, но без неё немыслима работа компонента в бакэнде сайта при редактировании записей базы данных. Во фронтэнде, к примеру, может оказаться полезной функция hit, обновляющая счетчик в таблице, хот мной и не используемая в данном компоненте:

  • Чистый код
1. /**
2. * Увеличение счётчика
3. *
4. */
5. function hit ()
6. {
7. //
8. $db =& JFactory::getDBO ();
9. $db->setQuery ("UPDATE " .$db->nameQuote ("#__myextension_foobar" )."
10. ."SET ".$db->nameQuote (" hits")." = ".$db-
11. >nameQuote ("hits")." + 1 "." WHERE id = ".$this->_id);
12. $db->query ();
13. }
14.

Часть III "Views" MVC

Составляющая "Views" как часть "MVC" также рассредоточена по директориям, представление каждой модели должно находиться в папке "views".

В Joomla существует несколько типов отображения документов при создании MVC. Для каждого из типов необходимо создавать собственный файл, например, HTML, PDF, и RAW. Для шаблонов HTML нам нужно создать ещё и помимо файла - модели, папку под названием "tmpl", которая содержим несколько шаблонов для визуальной передачи информации.

Для создания классов необходимо, так же как и для создания модели, придерживаться правил именования классов. Правило присвоения имени классу в "MVC": "имя компонента, слово "View" и имя компонента".

Классы "View" должны содержаться в документах с названием "view.documentType.php", где documentType - тип документа (например html).

Представьте себе, - мы создаем HTML шаблон, тогда при соблюдении всех вышеперечисленных правил у нас должен получится класс "MyextensionsViewMyextensions" для компонента "My Extension". Класс представления будет называться MyextensionsViewMyextensions и он будет находиться в файле с именем "view.html.php" в папке "views".

Все "View" классы расширяют абстрактный класс JView. Пример несложной реализации класса "MyextensionsViewMyextensions":

  • Чистый код
1. // ensure a valid entry point
2. defined (_JEXEC) or die ("Restricted Access" );
3. // import the JView class
4. jimport ();
5. /**
6. * Foobar View
7. */
8.
9. {
10.
11. }
12.
13.

Обязательно подкачайте библиотеку joomla.application.component.view, она содержит основной класс "JView".

Основной метод в классе "JView" - "display()", он используется для отображения данных.

Примечание. В Joomla информация в базах данных изменяется только при создании модели и контроллёра, но не при отображении.

Давайте создадим класс "MyextensionsViewMyextensions".

  • Чистый код
1.
2.
3. // No direct access
4. defined ("_JEXEC" ) or die ("Restricted access" );
5. // import the JView class
6. jimport ("joomla.application.component.view" );
7. /**
8. * Foobar View
9. */
10. class MyextensionsViewMyextensions extends JView
11. {
12. /**
13. * view display method
14. * @return void
15. **/
16. function display ($tpl = null)
17. {
18.
19.
20.
21.
22. // interrogate the model
23. $foobar =& $this->get ("Foobar" );
24. $this->assignRef ("foobar" , $foobar);
25.
26. parent::display ($tpl);
27. }
28. }
29.
30. ?>
31.

Класс "MyextensionsViewMyextensions" выводит информацию из модели, то есть он нас связывает с моделью "MVC". Здесь мы отображаем информацию из модели c использованием метода getFoobar(joomla самостоятельно создаёт запрос к модели Foobar), или говоря другими словами, - мы обращаемся к модели в которой существует метод "getFoobar()" для его выполнения и возврата результата содержащегося в этом методе:

  • Чистый код
1. $foobar =& $this->get ("Foobar" );
2.

Классы MyextensionModelMyextensions, и MyextensionsViewMyextensions связаны друг с другом и с контроллёром, о котором пойдёт речь чуть позже.

Теперь, когда классы MyextensionModelMyextensions, и MyextensionViewMyextensions созданы, необходимо перейти к шаблону отображения HTML. Структуру шаблона необходимо поместить в файл "default.php" в директорию "components/com_myextension/views/tmpl" .

  • Чистый код
1. defined ("_JEXEC" ) or die ("Restricted access" ); ?>
2.
3.
id= " editcell" >
4. class= " adminlist" > class= " ">
5.
6.
7. width= " 5" >
8. _ ("ID" ); ?>
9.
10.
11.
12. _ ("Текст мысли" ); ?>
13.
14.
15.
16.
17. $k = 0;
18. for ($i=0, $n=count ($this->foobar); $i < $n; $i++)
19. {
20. $row =& $this->foobar[ $i] ;
21. $checked = JHTML::_ ("grid.id" , $i, $row->id);
22.
23.
24. ?>
25.
26.
27. id; ?>
28.
29.
30.
31. misil; ?>
32.
33.
34.
35. $k = 1 - $k;
36. }
37. ?>
38.
39.
40.

Через переменную "$this" в действительности мы получаем значение столбцов таблицы "#__myextension_foobar". Файл "default.php" имеет структура файла для отображения компонента в админ панели, но нам это не важно, так как важен результат и сам процесс познания основ создания компонентов. Рассказывать о подробностях создания шаблонов для компонента в бакэнде не входит в эту статью, так как про это можно написать книгу, здесь мы лишь рассмотрим основы вывода информации в шаблон.

Часть IV. Контроллёр MVC.

Контроллёр нашего компонента расширяет класс JController, которые мы импортируем из библиотеки "joomla.application.component.controller". Контроллёры предназначаются для выполнения задач, которые могут взаимодействовать с моделью и представлением.

Ниже указан простой пример класса (контроллёра) "MyextensionsController":

  • Чистый код
1.
2.
3. // no direct access
4. defined ("_JEXEC" ) or die ("Restricted access" );
5. jimport ("joomla.application.component.controller" );
6. /**
7. * MyExtension Controller
8. *
9. */
10. class MyextensionsController extends JController
11. {
12.
13. /**
14. * Method to display the view
15. *
16. * @access public
17. */
18. function display ()
19. {
20. parent::display ();
21. }
22.
23.
24. }
25.
26.

Методы, которые мы можем использовать в контроллёре:

Подробнее Вы увидите эти методы при разъяснения создании контроллёра для админ. панели. Поскольку там существуют усложнённые правила вывода информации и построения таблиц для отображения строк из таблицы SQL(рассматривается в Разделе II).

Часть V. Собираем компонент

В начале статьи я рассказывал про файл "myextension.php", так вот его содержимое:

  • Чистый код
1.
2. // Check to ensure this file is included in Joomla!
3. defined ("_JEXEC" ) or die ("Restricted Access" );
4. // get the controller
5. require_once (JPATH_COMPONENT.DS."controller.php" );
6. // Require specific controller if requested
7. if ($controller = JRequest::getWord ("controller" )) {
8. $path = JPATH_COMPONENT.DS."controllers" .DS.$controller.".php" ;
9. if (file_exists ($path)) {
10. require_once $path;
11. } else {
12. $controller = "" ;
13. }
14. }
15.
16. // Create the controller
17.
18.
19.
20. // Perform the Request task
21. $controller->execute (JRequest::getVar ("task" ));
22.
23. // Redirect if set by the controller
24. $controller->redirect ();
25.
26.
27.

Замечательно теперь мы создали основу компонента фронтэнда, если Вы всё сделали в той последовательности, которую я описал, то у Вас в появится в "админ панели->компоненты->My Extention" элемент пункта меню "My extensions". Однако если Вы перейдёте к компоненту, то не увидите ничего или страницу с ошибкой 404.

рис. 1, рис. 2

Раздел II. Бакэнд компонента

Бакенд нашего компонента располагается по адресу: "administrator/components/com_myextension/".Бакэнед будет содержать дополнительные файлы и папки. Во-первых, это папки "controllers" и "tables".В папке "controllers" будет располагаться дополнительный контроллёр для редактирования существующих записей из таблицы "#__myextension_foobar". Его полный код:

  • Чистый код
1.
2. /**
3. * Myextension Controller for Myextension Component
4. *
5. * @package сайт.Tutorials
6. * @subpackage Components
7. * @link http://сайт/joomla/
8. * @license GNU/GPL
9. */
10.
11. // Запрещаем прямой доступ к компоненту
12. defined ("_JEXEC" ) or die ("Restricted access" );
13.
14. /**
15. * Myextensions Controller
16. *
17. * @package Уроки по Joomla
18. * @subpackage Components
19. */
20. class MyextensionsControllerMyextension extends MyextensionsController
21. {
22. /**
23. * constructor (registers additional tasks to methods)
24. * @return void
25. */
26. function __construct ()
27. {
28. parent::__construct ();
29.
30. // Регистрируем задачи
31. $this->registerTask ("add" , "edit" );
32. }
33.
34. /**
35. * отображение формы для редактирования записи
36. * @return void
37. */
38. function edit ()
39. {
40.
41.
42.
43.
44. parent::display ();
45. }
46.
47. /**
48. * запись (и перенаправление)
49. * @return void
50. */
51. function save ()
52. {
53.
54. $model = $this->getModel ("myextension" );
55.
56. if ($model->store ($post)) {
57. $msg = JText::_ ("Мудрая мысль сохранена!" );
58. } else {
59. $msg = JText::_ ("Ошибка произошла при сохранении" );
60. }
61.
62. $link = ;
63. $this->setRedirect ($link, $msg);
64. }
65.
66. /**
67. * удаление записи(ей)
68. * @return void
69. */
70. function remove ()
71. {
72. $model = $this->getModel ("myextension" );
73. if (!$model->delete ()) {
74. $msg = JText::_ ("Error: One or More Greetings Could not be Deleted" );
75. } else {
76. $msg = JText::_ ("Greeting (s) Deleted" );
77. }
78.
79. $this->setRedirect ("index.php?option=com_myextention" , $msg);
80. }
81.
82. /**
83. * вывод сообщения в случае отмены
84. * @return void
85. */
86. function cancel ()
87. {
88. $msg = JText::_ ("Отмена" );
89. $this->setRedirect ("index.php?option=com_myextension" , $msg);
90. }
91. }
92.

Класс MyextensionsControllerMyextension должен располагаться в файле с именем "myextension.php"

Класс "TableMyextension", содержащийся в папке "tables", должен находится в файле с названием "myextension.php"

  • Чистый код
1.
2.
3. /**
4. * My extension table class
5. *
6. * @package сайт.Tutorials
7. * @subpackage Components
8. * @link http://сайт/joomla/
9. * @license GNU/GPL
10. */
11.
12. // No direct access
13. defined ("_JEXEC" ) or die ("Restricted access" );
14.
15.
16. class TableMyextension extends JTable
17. {
18. /**
19. * Primary Key
20. *
21. * @var int
22. */
23. var $id = null;
24.
25. /**
26. * @var string
27. */
28. var $greeting = null;
29.
30. /**
31. * Constructor
32. *
33. * @param object Database connector object
34. */
35. function TableMyextension (& $db) {
36. parent::__construct ("#__myextension_foobar" , "id" , $db);
37. }
38. }
39.

Нам необходимо помимо отображения в табличном варианте админ. панели записей таблицы, ещё и шаблон для редактирования этих записей. Сделать это можно не расширяя существующую "MVC", а создав дополнительную "MVC" для представления и логики приложения и редактирования записей "#__myextension_foobar".

В файле "myextension.php" содержаться строки, которые отвечают за вывод соответствующего контроллёра - либо мы выводим контроллёр для модели "MyextensionsController" либо для "MyextensionsControllerMyextension":

  • Чистый код
1. // Create the controller
2. $classname = "MyextensionsController" .$controller;
3. $controller = new $classname ();
4.

Осталось совсем чуть-чуть, мы сделали дополнительный контроллёр "MyextensionController" для контроллёра "MyextensionsController", теперь нужно указать для него шаблон. Шаблон будет располагаться в той же папке - "views", но уже в папке "myextension", то есть сейчас у Вас должно получиться две папки в директории "views" - myetension и myextensions.

Содержимое файла view.html.php:

  • Чистый код
1.
2. /**
3. *
4. */
5.
6. // Запрещаем прямой доступ
7. defined ("_JEXEC" ) or die ("Доступ запрещён" );
8.
9. jimport ("joomla.application.component.view" );
10.
11. /**
12. * Myextension View
13. *
14. * @package Уроки по Joomla
15. * @subpackage Components
16. */
17. class MyextensionsViewMyextension extends JView
18. {
19. /**
20. * метод display
21. * @return void
22. **/
23. function display ($tpl = null)
24. {
25. //get the hello
26. $foobar =& $this->get ("Foobar" );
27. $isNew = ($foobar->id < 1);
28.
29. $text = $isNew ? JText::_ ("New" ) : JText::_ ("Edit" );
30. JToolBarHelper::title (JText::_ ("Hello" ).": [ " . $text." ] " );
31. JToolBarHelper::save ();
32. if ($isNew) {
33. JToolBarHelper::cancel ();
34. } else {
35. // кнопка отмены `close`
36. JToolBarHelper::cancel ("cancel" , "Close" );
37. }
38.
39. $this->assignRef ("foobar" , $foobar);
40.
41. parent::display ($tpl);
42. }
43. }

Сам шаблон редактирования записей таблицы(папка "tmpl") называется "form.php":

  • Чистый код
1.
2. defined ("_JEXEC" ) or die ("Restricted access" ); ?>
3.
4.
action= " index.php" method= " post" name= " adminForm" id= " adminForm" >
5.
class= " col100" >
6.
class= " adminform" >
7. _ ("Детали" ); ?>
8. var_dump ($this-> foobar); ?>
9. class= " admintable" >
10.
11. width= " 100" align= " right" class= " key" >
12.
13. _ ("Мысли" ); ?> :
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class= " clr" >
24.
25. type= " hidden" name= " option" value= " com_myextension" />
26. type= " hidden" name= " id" value= " foobar->id; ?>" />
27. type= " hidden" name= " task" value= " " />
28. type= " hidden" name= " controller" value= " myextension" />
29.

Шаблон должен называться именно form.php, так как в контроллёре мы указали функцию edit(), в которой явно указали название шаблона для редактирования:

  • Чистый код
1. function edit ()
2. {
3. JRequest::setVar ("view" , "myextension" );
4. JRequest::setVar ("layout" , "form" );
5. JRequest::setVar ("hidemainmenu" , 1);
6.
7. parent::display ();
8. }

После добавления нового контроллёра в наш компонент появляется возможность не только выводить данные из таблицы, но изменять их в админ панели.

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

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

Успехов и до встреч.

В Joomla 2.5 треть разработчиков компонентов разделяют компонент согласно шаблону проектирования MVC:

  1. Модель (Мodel). Представляет данные и методы работы с этими данными, реагирует на запросы, изменяя своё состояние.
  2. Контроллер (Controller). Обеспечивает связь между пользователем и системой: контролирует ввод данных пользователем и использует модель и представление для реализации необходимой реакции.
  3. Представление (view). Отвечает за отображение информации (визуализация).

Создаем контроллер.

Joomla API включает в себя класс JController, который должен быть использован для расширения вашего контроллера. Добавьте в файл site/helloworld.php следующий строки кода:

execute(JRequest::getCmd("task")); // Redirect if set by the controller $controller->redirect();

getInstance – является статичным методом класса JController, который создает экземпляр класса контроллера. В приведенном выше коде экземпляром объекта класса контроллера является класс с именем HelloWorldController. Joomla будет искать объявление этого класса в файле controller.php.

Когда не ставится ни одно действие(action) в переменных url-запроcа, действием по умолчанию будет выполнено действие display, которое наследует класс HelloWorldController от класса JController. В нашем примере будет выведено представление с именем HelloWorld.

Создаем представление.

Когда контроллеру необходимо вывести представление, он будет искать конкретные файлы представления в каталоге component/com_/views// .

Название каталога представления по умолчанию является название самого компонента. В нашем случае это путь component/com_helloworld/views/helloworld/.

Файл, который будет содержать исходный код представления, будет вызываться view..php. Представление компонента по умолчанию использует html режим(view_mode). Таким образом, имя файла представления у нас получается таким - view.html.php.

Создайте представление site/views/helloworld/view.html.php:

msg = "Hello World"; // Display the view parent::display($tpl); } }

Метод display() класса JView вызывает метод display() класса JController. В нашем случае, этот метод будет выводить данные на экран, используя файл tmpl/default.php. Создайте файл site/views/helloworld/tmpl/default.php, который будет является шаблоном представления, содержащим:

msg; ?>

Этот файл шаблон будет включен в JView класс. Таким образом, здесь $tihs относится к классу HelloWorldViewHelloWorld.

Собираем компонент.

Пакет включает в себя файлы и директории:

  • helloworld.xml
  • site/index.html
  • site/helloworld.php
  • site/controller.php
  • site/views/index.html
  • site/views/helloworld/index.html
  • site/views/helloworld/view.html.php
  • site/views/helloworld/tmpl/index.html
  • site/views/helloworld/tmpl/default.php
  • admin/index.html
  • admin/helloworld.php
  • admin/sql/index.html
  • admin/sql/updates/index.html
  • admin/sql/updates/mysql/index.html
  • admin/sql/updates/mysql/0.0.1.sql

Сожмите в zip-файл ваш каталог компонента или скачайте и установите его используя менеджер расширений. Протестируйте установленный компонент вставив index.php?option=com_helloworld в адресную строку браузера.

Листинг файла helloworld.xml:

Hello World! November 2009 John Doe Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. http://www.example.org Copyright Info License Info 0.0.2 Description of the Hello World component ... sql/updates/mysql index.html helloworld.php controller.php views

Hello World! index.html helloworld.php sql

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

Шаг 0: Сделайте кофе

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

Шаг 1: Жёлтый блокнот и любая ручка

Практически все наши проекты берут начало из жёлтых блокнотов. Вам может понравиться бумага другого цвета, это ваше дело. Руководствуясь рядом причин, я рекомендую жёлтый, но это необязательно. Так же я рекомендую ручку, а не карандаш. Карандаши ломаются, идеи утекают, линии стираются, а смысл тут не в том, чтобы нарисовать идеальный план, а скорее устроить мозговой штурм и нацарапать идеи на бумаге. Пользуясь ручкой, вы заставляете себя думать, а использование карандаша само по себе предполагает возможность стереть и переписать написанное.

Шаг 2: Определите ваши потребности, целевую аудиторию и проблемы, требующие решения

Итак, вы сидите с горячим напитком, блокнотом и ручкой и готовы приступить к следующему шагу. Начните записывать свои идеи. Начнём с проблемы, которую вы хотите решить, почему вы пишете это расширения, каковы основные идеи, на которых будете акцентировать внимание, и что вообще будет делать ваше расширение. Так же на этом этапе неплохо бы реализовать небольшое исследование. Существует ли ваш компонент на данный момент? Есть ли кто-то, кто выпускал похожий продукт и может составить конкуренцию? Насколько велика целевая аудитория компонента, который вы хотите написать? Эти аспекты важно учесть, т.к. есть некоторые меры предосторожности, на которые мы хотели бы обратить ваше внимание.

  • Во-первых, не надо писать “Властелина колец” (один компонент, чтобы всем управлять, другой, чтобы всё объединить...), определите основную проблему, которую хотите решить и сосредоточьтесь на ней. Так вы упростите себе и жизнь, и маркетинг.
  • Во-вторых, убедитесь в существовании целевой аудитории. Не думайте, что если компонент нужен вам, он внезапно понадобится всем остальным. Будьте реалистичны в прогнозах и это прибавит вам уверенности.
Шаг 3: Опишите процесс разработки расширения / приложения

Как только вы набросали идеи, определили целевую аудиторию, проблемы, которые собираетесь решить, следующим шагом будем описание вашего плана по разработке. Желательно это делать вместе с прошлым шагом. Выпишите контроллеры, инструменты и модели, которые вам понадобятся. Вероятно сейчас самое время отступить и обсудить первый важный этап разработки компонента Joomla! 3.0, систему модель-вид-контроллер (МВК).

Joomla реализует довольно стандартную структуру МВК, но, как бы то ни было, она отличается от MVC framework, используемой другими платформами. Joomla рассматривает каждую задачу как контроллер. Это означает, что вам понадобятся контроллеры названные “save”, “add”, “edit”, “delete” и т.д. Каждый контроллер отвечает только за одно задание. На первый взгляд может показаться, что у вас будет огромное количество файлов, но, в конечном счете, именно они обеспечат интуитивную работу компонента, а также смогут выполнять несколько команд одновременно.

Модели в Joomla выполняют фактические манипуляции с данными. Вот где пригодится вся логика и код. Модели в основном разрабатываются для отображения ключевых элементов и особенностей компонента. Внутри модели у вас будет список функций, относящихся к определённому объекту (листать, копировать, сохранять и т.д...).

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

Это должно обозначить краткое (может быть упрощённое) представление работы структуры МВК Joomla! и, надеюсь, достаточное, чтобы сделать возможным вами написание процесса разработки и перейти к следующему шагу.

Шаг 4: Организация структуры данных и табличной схемы

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

На этом этапе мы будем брать каждую модель со всеми её функциями, и выписывать её в те поля, где собираемся использовать эту модель в таблице. При создании большинства компонентов вам понадобится таблица ассоциации моделей с данными. Есть несколько стандартных полей в таблице, которые используются при написании компонента. Как только мы выпишем таблицу структуры, мы так же будем следовать определённым правилам. Например, если мы планируем ассоциировать объект с определённой категорией, мы включим id категории в таблицу объекта, а также будем вписывать id пользователя, если хотим чтобы элементы ассоциировались с пользователем. Это поможет на позже, когда мы возьмём написанные вручную таблицы и начнём переносить их в SQL builder. Порой мы будем связывать таблицы линиями, чтобы легче понимать, как они взаимосвязаны.

Шаг 5: Установка метода для отслеживания обновлений (GitHub)

Этот шаг не является необходимым, но со временем не повредит настроить отслеживание обновлений версий платформы. По ряду причин мы предпочитаем GitHub. Если вы не знакомы с GitHub, можете использовать общественные (бесплатные) или частные (недорогие) репозитории, отслеживать изменения и осуществлять безопасное копирование всех ваших наработанных данных. Помимо всего это позволяет вам распределить написание кода между несколькими людьми, не беспокоясь о том, что они могут помешать работе друг друга. Необязательно использовать GitHub, это не единственный вариант, но критически необходимо найти место для безопасного хранения кода для возможного восстановления, обновления и защиты.

Шаг 6: Настройка локальной среды

Последним шагом в этой вводной статье мы рассмотрим настройку вашей локальной среды. Если обобщить, можно смело сказать что здесь есть множество способов написания кода и вместо того, чтобы описывать их, мы просто скажем, что это именно тот момент, когда следует подготовить среду. Мы локально установим Joomla! 3, скопируем репозиторий GitHub и переместим директории, если это будет необходимо. Мы используем Sublime Text 2 для управления кодом и инструменты Git вполне подходят для написания кода. Существует множество приложений, которые вы можете использовать и вместо того, чтобы унижать их, мы посоветуем вам найти наиболее удобный для вас и ваших методов написания кода.

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

Войдите в административную панель Joomla по адресу http://вашсайтру/administrator, введите логин и пароль. У вас откроется главная страница админ. панели.

Где: 1) Главное меню Joomla; 2) Панель быстрого доступа.

Главное меню админ. панели Joomla

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

В Joomla есть 3 основных компонента "Менеджер пользователей", "Менеджер меню", "Менеджер материалов", они отделены от всех других, и для удобства и быстрого доступа, вынесены в отдельные пункты "Пользователи", "Меню" и "Материалы". Остальные можно найти открыв меню "Компоненты".

Пункт верхнего меню "Система" - здесь вы сможете произвести основные настройки сайта, выбрать редактор, очистить кэш, посмотреть информацию о движке и системе. А с выходом версии Joomla 3 теперь можно настроить и любой компонент.

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

Пункт "Меню" . Если нужно добавить или изменить пункты меню на front-end сайте, то этот компонент поможет. Можно создавать отдельные группы меню сайта и выводить их при помощи модуля. В пунктах меню формируются ссылки на страницы сайта. Т.е. создавая пункт можно выбрать, на страницы какого компонента он будет вести. А компонент в свою очередь наполняется нужной информацией, которою можно вывести при помощи пункта меню. Кроме того можно сделать индивидуальные настройки отображения страницы на которую он ведет. Например указать "Показывать заголовок страницы или нет", "Какой шаблон отображать для этой страницы", "Настроить отображение мета информации страницы", "Порядок пунктов меню", "Какой из пунктов меню будет главной страницей", "Опубликовать пункт меню или скрыть" и др.

Пункт меню "Материалы" . С помощью этого компонента Joomla можно создавать страницы сайта с текстовым и медиа-, контентом. Страницы можно сортировать по группам при помощи категорий с неограниченной вложенностью. Материалы и категории можно выводить списком, в виде блога или по отдельности. Настройка отображения материалов производится через сам компонент, либо через общие настройки.

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

Пункт меню "Расширения" - в подменю этого пункта вы найдете менеджеры модулей, плагинов, языков и шаблонов. А так же менеджер установки новых расширений, в том числе и компонентов.

Компоненты, модули, плагины и шаблоны Joomla

Для того, что бы двинуться дальше нужно разобраться в том, что лежит в основе этой CMS. Работа с Joomla строится на 4 основных видах расширений, которые создают практически неограниченные возможности по наращиванию функционала сайта, от визитки до полноценного интернет-магазина.

  1. Компоненты - это скрипты, которые обладают наибольшей функциональностью и выводят основной контент сайта (статьи, галереи, ССК, форумы, ссылки, поиск, редакторы). Основные компоненты уже встроены в ядро joomla, остальные можно скачать бесплатно или купить и установить на свой сайт.
  2. Модули - это расширения, которые дополняют компоненты и отображают нужную информацию на сайте. Например: пункты меню сайта создаются в компоненте, а выводятся при помощи модуля; Форма поиска выводится при помощи модуля, информация из формы обрабатывается компонентом, который в свою очередь выводит результаты поиска; Список последних новостей выводится при помощи модуля, но сами новости создаются с помощью компонента "Менеджер материалов".
  3. Плагины - это еще один вид расширений функциональности. Плагины выполняют заложенную в них функцию в момент появления определенного события в системе. К примеру это удобно для отображения одного и того же визуального редактора, выбранного пользователем для всей системы, в разных компонентах и модулях.
  4. Шаблоны - позволяют настраивать вид отображения компонентов, модулей и дизайна сайта. Для работы с шаблонами требуются навыки HTML и CSS. Некоторые шаблоны обладают богатым набором настроек, который позволяет менять его вид без навыков верстки и программирования.

Я так и не понял в чем разница компонентов, модулей и плагинов.

Тогда нужно посмотреть на front-end сайта и разобраться где модули, а где содержание компонентов. для наглядности выделил все модули красной рамкой, а компонент зеленой.

Где модули:

1) Модуль "Меню"; 2) Модуль "Календарь"; 3) Модуль "Произвольный HTML код" - где при помощи визуального редактора я разместил и настроил вид блока; 4) Модуль "Последние новости" - выводит последние материалы из выбранной категории. Тут выведено сразу три модуля с названиями "Конкурсы", "Новости", "События", по сути это одно и тоже только названия и категории материалов разные.

Компоненты:

5) С помощью компонента в данном случае выводится материал с заголовком "О проекте" и текстом.

Здесь я написал небольшое руководство для начинающих о том как пользоваться Joomla. Более подробную информацию о том как работать с Joomla вы сможете узнать из ссылок по теме в низу страницы.

Outdated translations are marked like this.

There are also a number of videos which accompany steps in the tutorial, beginning with
Step 1, Developing a Basic Component and you can access the slides which are used in the series of video presentations at Slides .

Important! Around version 3.8 the Joomla developers started changing the naming of Joomla classes and where they were stored in the directory structure. Many of the tutorial steps and videos refer to the old naming convention. To find the equivalent new class and where it"s stored, look in your libraries/classmap.php file.

Как добавить компонент на Joomla! ==!Н!В данной статье мы рассмотрим, как создать и установить базовый компонент на Joomla! . В этом примере мы будем работать с компонентом Hello World!.

Чтобы начать, вы должны сначала использовать нужный файл менеджер для создания каталога для компонента Hello World! . Этот каталог может быть где угодно в файловой системе, пока это за пределами вашего Joomla! директорию. В этом примере мы назовем каталоге com_helloworld , но эта директория может называться как угодно.

1 это XML-файл (манифест) файл, который говорит Joomla! как установить наш компонент.
2 это сайт точка входа для компонента Hello World!
3
4 предотвращает листинг из веб-сервера содержимого директории
5 это точка входа администратора в компонент Hello World!
6 предотвращает листинг из веб-сервера содержимого директории
7 предотвращает листинг из веб-сервера содержимого директории
8 предотвращает листинг из веб-сервера содержимого директории
9 файл, позволяющий инициализировать версию схемы компонента com_helloworld.

Установка Компонента Hello World! ===!Н!Используя ваш любимый файловый менеджер, создайте.zip файл из этого каталога. В данном примере мы будем использовать Имя файла com_helloworld.zip снова, хотя этот файл можно было назвать как угодно.

Теперь нам нужно установить компонент Hello World!. Есть два способа сделать это, оба показаны в Установке расширения . Здесь мы рассмотрим способ с использованием диспетчера расширений для Joomla!.

  • Используя ваш любимый веб-браузер, перейдите в панель администратора вашего Joomla! сайт. Адрес, например, /joomla/administrator/index.php . Для этого примера мы будем ориентироваться на localhost/joomla/administrator/index.php .!Н!
  • Выберите дополнительные модули Extensions Manage Install Upload Package File Choose File!Н!
  • Перейдите и выберите файл!Н!
  • Нажмите Кнопку " Загрузить & Установить

Примечание - Вы должны увидеть сообщение, показывающее, что установка выполнена успешно.

Вы можете протестировать основные функции компонента, введя Hello World! страницы для сайта и административной части вашего Joomla! сайта.!Н!

  • Используя ваш любимый веб-браузер, перейдите к Hello World! компонент страницы, расположенной на части вашего сайта. Адрес бы /joomla/index.php?option=com_helloworld . Для этого примера мы будем ориентироваться на localhost/joomla/index.php?option=com_helloworld .!Н!
  • Используя ваш любимый веб-браузер, перейдите к странице компонента Hello World!, расположенной в административной части вашего сайта. Адрес бы /joomla/administrator/index.php?option=com_helloworld . Для этого примера мы будем ориентироваться на localhost/joomla/index.php?option=com_helloworld .

Вы можете также заметить, что компонент Hello World! виден в административной части сайта после установки Joomla в подменю "компоненты".

Файл Детали

admin/sql/updates/mysql/0.0.1.sql файл, позволяющий инициализировать версию схемы компонента com_helloworld.

helloworld.xml

Hello World! January 2018 John Doe [email protected] http://www.example.org Copyright Info License Info 0.0.1 Description of the Hello World component ... sql/updates/mysql index.html helloworld.php

"index.php?option=com_helloworld" > Hello World! index.html helloworld.php sql

site/helloworld.php