Slyweb
На разработку сайта! Скидки 50%!

Создаём компонент "My Extension" в Joomla 1.5

jQuery и CSS

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

Как я и обещал, в этой статье я расскажу про основы создания компонентов 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.<?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", который будет исполнятся в бакэнде(админ. панели) сайта.

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

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

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

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

MVC (Model-View-Controller)

"Модель"(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.

        

Часть 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('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" имеет структура файла для отображения компонента в админ панели, но нам это не важно, так как важен результат и сам процесс познания основ создания компонентов. Рассказывать о подробностях создания шаблонов для компонента в бакэнде не входит в эту статью, так как про это можно написать книгу, здесь мы лишь рассмотрим основы вывода информации в шаблон.

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

Контроллёр нашего компонента расширяет класс 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).

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

В начале статьи я рассказывал про файл "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.

Компонент - вид в бакэнде Незабудьте создать файл myextension.php в директории \administrator\components\com_myextension\
рис. 1, рис. 2

Скачать папку для фронтэнда.

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

Бакенд нашего компонента располагается по адресу: "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.

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

Скачать архив вместе с бакэндом и форнтэндом.

При написании статьи использовалась официальная документация:
Developing a Model-View-Controller Component - Part 1

Александр Ермаков