Здравствуйте уважаемые читатели!
Как я и обещал, в этой статье я расскажу про основы создания компонентов Joomla. Сразу поясню, что компонент - это абстрактное понятие, основанное на концепции MVC (Model-View-Controller), представляющее совокупность внутренней архитектуры приложения, его представления и механизма взаимодействия с базой данных.
Компонент представляет собой усложнённый плагин 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. | <?xml version="1.0" encoding="utf-8"?> |
| 3. | <!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/component-install.dtd"> |
| 4. | <install type="component" version="1.5"> |
| 5. | <name>My Extension</name> |
| 6. | <creationDate>MonthName Year</creationDate> |
| 7. | <author>Author's Name</author> |
| 8. | <authorEmail>Author's Email</authorEmail> |
| 9. | <authorUrl>Author's Website</authorUrl> |
| 10. | <copyright>Copyright Notice</copyright> |
| 11. | <license>Component License Agreement</license> |
| 12. | <version>Component Version</version> |
| 13. | |
| 14. | <description>Component Description</description> |
| 15. | |
| 16. | <administration> |
| 17. | <menu>My Extension</menu> |
| 18. | </administration> |
| 19. | |
| 20. | <install /> |
| 21. | <uninstall /> |
| 22. | </install> |
| 23. |
Кодировка файла должна соответствовать UTF-8.
Выберите уникальное имя для компонента, но будьте осторожны при выборе, - названия компонентов в Joomla не должны совпадать. Имя компонента формируется по следующему формату: com_parsedname и делается это автоматически системой. Например, "My Extension" будет трансформировано при установке в "com_myextension".
В нашем случае имя определено в теге "name":
<name>My Extension</name>
Примечание. Будьте внимательны, от имени компонента зависит название классов элементов 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", который будет исполнятся в бакэнде(админ. панели) сайта.
Следует учитывать, что концепция MVC (Model-View-Controller) совсем не означает полное разделение представления и логики Вашего приложения, все указанные три составляющих достаточно связаны вместе. В связи с чем, изменение кода внутри одного из составляющих может вызвать ошибки в других двух элементах.
Пример взаимодействия составляющих MVC:
"Модель"(Model) приложения используется для обработки данных. В большинстве случаев информация будет получена из базы данных.
"Представление"(View) определяет внешнее отображение данных, говоря простым языком - это шаблоны нашего компонента, то есть - то как компонент будет отображён на страницах сайта.
Данные, которые мы выводим с использованием "представления(View)" приложения происходят из одной или нескольких моделей. Эти модели автоматически взаимодействуют с определённым "представлением(View)", связи между ними обеспечивает контроллер приложения.
Про контроллер можно сказать - "это мозги нашего приложения". "Контроллер" выбирает модель, с которой соприкасается запрос и выполняет все необходимые изменения в базе данных. "Контроллер" определяет вид использования модели с отображением компонента. Контроллер выполняет действия либо перенаправляет пользователя на определённую страницу, или отображает данные. При отображении данных контроллер создает класс View и связывает его с одной или несколькими моделями. Связывание модели и представления происходит с использованием методов "get" и "assignRef". Указанные методы во всех случая размещаются в файле представления, который, как правило, называется "view.html.php". Пример:
| 1. | |
| 2. | |
| 3. | function display($tpl = null) |
| 4. | { |
| 5. | // взаимодействие с моделью |
| 6. | $foobar =& $this->get('Foobar'); |
| 7. | $this->assignRef('foobar', $foobar); |
| 8. | |
| 9. | parent::display($tpl); |
| 10. | } |
| 11. |
Однако, чтобы был толк от сказанного и от MVC в Joomla нужно создать модель, - класс "MyextensionsModelMyextensions" Joomla, создаваемый путём наследования родительского класс "JModel".
| 1. | |
| 2. | / |
| 3. | / проверяем доступность |
| 4. | defined(_JEXEC) or die('Restricted Access'); |
| 5. | // импортируем класс JModel |
| 6. | jimport('joomla.application.component.model'); |
| 7. | /** |
| 8. | * Модель для Foobar |
| 9. | */ |
| 10. | class MyextensionsModelMyextensions extends JModel |
| 11. | { |
| 12. | |
| 13. | } |
| 14. | |
| 15. |
После этого можно понаписать всё, что угодно в классе "MyextensionsModelMyextensions", в рамках разумного. Например, напишем класс - модель, который будет отвечать за вывод информации из таблицы "#__myextension_foobar":
| 1. | |
| 2. | <?php |
| 3. | /** |
| 4. | * Урок по созданию первого компонента в Joomla |
| 5. | * |
| 6. | * @package Ермаков А.П. |
| 7. | * @subpackage Components |
| 8. | * @link http://slyweb.ru/joomla/ |
| 9. | * @license GNU/GPL |
| 10. | */ |
| 11. | |
| 12. | // Запрещаем доступ вне системы Joomla |
| 13. | defined( '_JEXEC' ) or die( 'Restricted access' ); |
| 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. |
Составляющая "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('joomla.application.component.view'); |
| 5. | /** |
| 6. | * Foobar View |
| 7. | */ |
| 8. | class MyextensionsViewMyextensions extends JView |
| 9. | { |
| 10. | |
| 11. | } |
| 12. | |
| 13. |
Обязательно подкачайте библиотеку joomla.application.component.view, она содержит основной класс "JView".
Основной метод в классе "JView" - "display()", он используется для отображения данных.
Примечание. В Joomla информация в базах данных изменяется только при создании модели и контроллёра, но не при отображении.
Давайте создадим класс "MyextensionsViewMyextensions".
| 1. | <?php |
| 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. | <?php defined('_JEXEC') or die('Restricted access'); ?> |
| 2. | |
| 3. | <div id="editcell"> |
| 4. | <table class="adminlist"> |
| 5. | <thead> |
| 6. | <tr> |
| 7. | <th width="5"> |
| 8. | <?php echo JText::_( 'ID' ); ?> |
| 9. | </th> |
| 10. | |
| 11. | <th> |
| 12. | <?php echo JText::_( 'Текст мысли' ); ?> |
| 13. | </th> |
| 14. | </tr> |
| 15. | </thead> |
| 16. | <?php |
| 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. | <tr class="<?php echo "row$k"; ?>"> |
| 26. | <td> |
| 27. | <?php echo $row->id; ?> |
| 28. | </td> |
| 29. | |
| 30. | <td> |
| 31. | <?php echo $row->misil; ?> |
| 32. | </td> |
| 33. | </tr> |
| 34. | <?php |
| 35. | $k = 1 - $k; |
| 36. | } |
| 37. | ?> |
| 38. | </table> |
| 39. | </div> |
| 40. |
Через переменную "$this" в действительности мы получаем значение столбцов таблицы "#__myextension_foobar". Файл "default.php" имеет структура файла для отображения компонента в админ панели, но нам это не важно, так как важен результат и сам процесс познания основ создания компонентов. Рассказывать о подробностях создания шаблонов для компонента в бакэнде не входит в эту статью, так как про это можно написать книгу, здесь мы лишь рассмотрим основы вывода информации в шаблон.
Контроллёр нашего компонента расширяет класс JController, которые мы импортируем из библиотеки "joomla.application.component.controller". Контроллёры предназначаются для выполнения задач, которые могут взаимодействовать с моделью и представлением.
Ниже указан простой пример класса (контроллёра) "MyextensionsController":
| 1. | <?php |
| 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. |
Методы, которые мы можем использовать в контроллёре:
| Наименование | Содержание |
|---|---|
| add | Создание нового пункта |
| apply | Применение изменений к пункту и возврат пункта для редактирования |
| archive | Архивация пункта |
| assign | Связывание пункта с чем-либо пункта |
| cancel | Отмена текущей задачи |
| default | Отметка пункта как "текущий" |
| publish | Публикация пункта |
| remove | Удаление пункта |
| save | Сохранение пункта |
| unarchive | Разархивирование пункта |
| Un-publish | Отмена публикации пункта |
Подробнее Вы увидите эти методы при разъяснения создании контроллёра для админ. панели. Поскольку там существуют усложнённые правила вывода информации и построения таблиц для отображения строк из таблицы SQL(рассматривается в Разделе II).
В начале статьи я рассказывал про файл "myextension.php", так вот его содержимое:
| 1. | <?php |
| 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. | $classname = 'MyextensionsController'.$controller; |
| 18. | $controller = new $classname( ); |
| 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. |
Теперь если перейти по ссылке "http://название сайта/index.php?option=com_myextension", то будет выведен результат запроса к таблице "#__myextension_foobar".
Замечательно теперь мы создали основу компонента фронтэнда, если Вы всё сделали в той последовательности, которую я описал, то у Вас в появится в "админ панели->компоненты->My Extention" элемент пункта меню "My extensions". Однако если Вы перейдёте к компоненту, то не увидите ничего или страницу с ошибкой 404.
Бакенд нашего компонента располагается по адресу: "administrator/components/com_myextension/".Бакэнед будет содержать дополнительные файлы и папки. Во-первых, это папки "controllers" и "tables".В папке "controllers" будет располагаться дополнительный контроллёр для редактирования существующих записей из таблицы "#__myextension_foobar". Его полный код:
| 1. | <?php |
| 2. | /** |
| 3. | * Myextension Controller for Myextension Component |
| 4. | * |
| 5. | * @package slyweb.ru.Tutorials |
| 6. | * @subpackage Components |
| 7. | * @link http://slyweb.ru/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. | JRequest::setVar( 'view', 'myextension' ); |
| 41. | JRequest::setVar( 'layout', 'form' ); |
| 42. | JRequest::setVar('hidemainmenu', 1); |
| 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 = 'index.php?option=com_myextension'; |
| 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. | <?php |
| 3. | /** |
| 4. | * My extension table class |
| 5. | * |
| 6. | * @package slyweb.ru.Tutorials |
| 7. | * @subpackage Components |
| 8. | * @link http://slyweb.ru/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. | <?php |
| 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' ).': <small><small>[ ' . $text.' ]</small></small>' ); |
| 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. | <?php defined('_JEXEC') or die('Restricted access'); ?> |
| 3. | |
| 4. | <form action="index.php" method="post" name="adminForm" id="adminForm"> |
| 5. | <div class="col100"> |
| 6. | <fieldset class="adminform"> |
| 7. | <legend><?php echo JText::_( 'Детали' ); ?></legend> |
| 8. | <?php var_dump($this->foobar); ?> |
| 9. | <table class="admintable"> |
| 10. | <tr> |
| 11. | <td width="100" align="right" class="key"> |
| 12. | <label for="foobar"> |
| 13. | <?php echo JText::_( 'Мысли' ); ?>: |
| 14. | </label> |
| 15. | </td> |
| 16. | <td> |
| 17. | <textarea class="text_area" name="misil" id="foobar" value="<?php echo $this->foobar->misil;?> "><?php echo $this->foobar->misil;?> </textarea> |
| 18. | </td> |
| 19. | </tr> |
| 20. | </table> |
| 21. | </fieldset> |
| 22. | </div> |
| 23. | <div class="clr"></div> |
| 24. | |
| 25. | <input type="hidden" name="option" value="com_myextension" /> |
| 26. | <input type="hidden" name="id" value="<?php echo $this->foobar->id; ?>" /> |
| 27. | <input type="hidden" name="task" value="" /> |
| 28. | <input type="hidden" name="controller" value="myextension" /> |
| 29. | </form> |
Шаблон должен называться именно 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.
Успехов и до встреч.
Скачать архив вместе с бакэндом и форнтэндом.