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

Создание приложений в Joomla с использованием баз данных

jQuery и CSS

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

  • Выполнение запросов к таблицам
  • Загрузка значения одиночного столбца из результата запроса
  • Загрузка первой запись из запроса
  • Загрузка нескольких записи из запроса
  • Обработка DBO ошибок
  • Создание объекта JTable
  • Создание новой записи с помощью JTable
  • Обновление записи с помощью JTable
  • Чтение существующей записи с помощью JTable
  • Удаление записи с помощью JTable
  • Проверка записей на предмет их блокировки с помощью JTable

После описания всех методов, мы вместе с Вами будем создавать небольшой плагин, выводящий случайные мудрые мысли(крылатые выражения)! Данный плагин будут рассчитан для Joomla 1.6, но с легкостью его можно будет переделать для более ранних версий Joomla.

Внимание! данная статья рассчитана для Joomla 1.6. (полезные сведения по переходу с версии 1.5 на 1.6 Вы сможете найти по адресу Переход с Joomla 1.5 на Joomla 1.6).

Краткое введение

В Joomla, большинство данных содержится в базе данных. При этом больше всего информации, хранимой в базе данных, составляет ядро системы и многие расширения. Joomla использует MySQL, но можно с использованием архитектуры и API применять и другие базы данных. В настоящее время, Joomla 1.5+ полностью официально поддерживает MySQL.

Все запросы, формируемые к базам в Joomla, должны содержать информацию об имени таблицы, при этом, обязательно нужно указывать префикс таблиц, который задаётся ещё при установке Joomla, либо использовать следующий формат: "#__mytable".

Объект, который я чаще всего используют для взаимодействия с базой данных является глобальным и называется DBO (Database Object). Мы получаем его, используя класс "JFactory". Обратите внимание, в версиях php ниже 5, мы должны использовать символ "&" при присвоении объекта переменной. Если этого не сделать, и если у Вас версия PHP ниже 5, то Вы создадите копию DBO, нам же нужна ссылка на объект DBO.

Используйте следующий вариант, если версия PHP ниже 5!

  • Код
  • Чистый код
  1.$db =& JFactory::getDBO();
  2.

        

Используйте следующий вариант, если версия PHP выше 5

  • Код
  • Чистый код
  1.$db = JFactory::getDBO();
  2.

        

Во всех примерах данной стать мы будем использовать одну и ту же структуру таблицы mysql:

  • Код
  • Чистый код
  1.CREATE TABLE IF NOT EXISTS `jos_misli` (
  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 ;
14.

        

В эту таблицу мы загрузим примеры крылатых выражений:

  • Код
  • Чистый код
  1.INSERT INTO `jos_misli` (`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, '');
  8.

        

Скачать архив таблиц

"Использование переменных "params" не объясняется в этой статье. Эти переменные используется, чтобы расширить настройки плагина в admin панели. Информация об их использовании содержится в классах "JParameter" и "JElement", которые не являются предметом рассмотрения данной статьи.

Наиболее востребованным из всех методов класса JDatabase является метод JDatabase::query(). Разработчики должны использовать только этот метод, когда они имеют дело с запросами, которые не возвращают наборы обработанных данных, поскольку этот метод возвращает необработанный ответ. Когда необходимо использовать метод JDatabase::query()? Говоря простыми словами, мы должны использовать его, когда результат является логическим (Boolean).

То есть, если запрос либо успешный либо нет и применяется он при следующих операция sql:

  • DELETE
  • INSERT
  • RENAME
  • REPLACE
  • UPDATE

Следующий пример пояснит мои мысли более подробно:

  • Код
  • Чистый код
  1.$db = JFactory::getDBO();
  2.// подготавливаем данные для запроса
  3.$tableName = $db->nameQuote('#__mycomponent_foobars');
  4.$columnName = $db->nameQuote('ordering');
  5.// создаём запрос на удаление строк
  6.$sql = "DELETE FROM $tableName " .
  7.. "WHERE $columnName > 4 ";
  8.$db->setQuery($sql);
  9.if ($db->query()) {
10.// запрос успешно выполнен
11.} else {
12.// запрос выполнен не успешно
13.}
14.

        

Потому как мы знаем, что результат будет всегда истинными или ложными, поэтому мы, при выполнении запроса на удаление, проверяем, для целей безопасности, возвращаемое значение. О выводе ошибок при обработке DBO объекта я расскажу в следующей статье.

Используйте метод JDatabase:: getAffectedRows (), который возвращает число записей, которые были затронуты в результате выполненного запроса для дополнительной проверки.

// метод возвращающий количество строк

  • Код
  • Чистый код
  1.$affectRowCount = $db->getAffectedRows();
  2.// вывод информации
  3.echo JText::sprintf('Удалено %u строк', $affectRowCount);
  4.

        

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

  • Код
  • Чистый код
  1.$db = JFactory::getDBO();
  2.
  3.// подготавливаем данные
  4.$tableName = $db->nameQuote('#__mycomponent_foobars');
  5.// подготавливаем запрос
  6.$sql = "SELECT COUNT(*) FROM $tableName";
  7.$db->setQuery($sql);
  8.$total = $db->loadResult();
  9.

        

Исходя из нашего примера таблицы, определенной в начале статьи, переменная $total будет содержать строку (1) "6". Хотя MySQL рассматривает указанный результат как целое число, результат в joomla будет представлен в виде строки.

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

  • Код
  • Чистый код
  1.SELECT *
  2.FROM `#__misli`
  3.WHERE `id` > 103;
  4.

        

104 Брак — это многолетний героический труд отца и мат... Бернард Шоу 0 0000-00-00 00:00:00 1 0 0 2
105 Не судите о человеке только по его друзьям. Помнит... Эрнест Хемингуэй 0 0000-00-00 00:00:00 2 1 49 2

"Выполнение запроса COUNT () дает нам значение 6 (представленное как строка). Выполнение же запрос снова, но на этот раз, в столбце "bar" со значением "IS NOT NULL", дает нам значение 0 (также в виде строки). Если мы попытаемся получить через метод MAX () значение идентификатора строки, мы получим значение 105. Если мы попытаемся получить значение Foo для записи 100, мы получим пустую строку. Если мы попытаемся получить значение столбца "bar" для любой из строк, мы получаем значение NULL.

Получение единичной записи из запроса, не является необычным. Например, если мы создали компонент, и нам нужно только получить одну запись, в joomla получить единичный запрос ещё проще.

Есть фактически три способа сделать это. Какой способ использовать зависит от типа возвращаемого результат, - им может быть простой массив, ассоциативный массив или объект данных.

Пример получения единичной записи:

  • Код
  • Чистый код
  1.$db = JFactory::getDBO();
  2.
  3.// подготовка к запросу
  4.$tableName = $db->nameQuote('#__mycomponent_foobars');
  5.$idColumn = $db->nameQuote('id');
  6.$fooColumn = $db->nameQuote('foo');
  7.$barColumn = $db->nameQuote('bar');
  8.// создание запроса
  9.$sql = "SELECT $idColumn, $fooColumn, $barColumn "
10.. "FROM $tableName "
11.. "WHERE $idColumn = 101";
12.$db->setQuery($sql);
13.//результат как массив
14.$array = $db->loadRow();
15.// ассоциативный массив
16.$associativeArray = $db->loadAssoc();
17.// объект
18.$object = $db->loadObject();
19.

        

Промежуточный итог

Итак, что же каждый из трёх запросов нам дает? Если мы посмотрим на диаграмму, то всё станет ясно! Мы получаем массив, ассоциативный массив, и объект, и все они представляют собой запись(строку) с ID 101.

Для использования массива необходимо знать индекс, например «0». Хотя это может и не быть существенной проблемой, использование массива может легко привести к простым ошибкам. Например, если мы добавим новую строку в таблицу, нам, возможно, придется менять код скрипта.

С другой стороны, ассоциативные массивы и значения объектов значений, основываясь на имени поля. Это делает ассоциативные массивы и объекты менее восприимчивы к изменениям в базе данных, и делает их представление семантически понятно. Поэтому, как правило, лучше всего использовать ассоциативные массивы и / или объекты.

По соображениям безопасности, чтобы убедиться, что запрос возвращается только одна строка, для того чтобы злоумышленник не смог обмануть скрипт. необходимо обязательно проверять количество строк, возвращаемых запросом. Мы ведь не хотим отдать какие-либо данные по ошибке!

Проверить количество строк, можно при помощи метод JDatabase:: getNumRows (). Этот метод возвращает число строк, которые были получены от последнего запроса.

  • Код
  • Чистый код
  1.if ($db->getNumRows() > 1) {
  2.// что есть!
  3.}
  4.

        
JDatabase:: getNumRows () вернёт число затронутых запросом строк. Если мы ограничим количество результатов с помощью LIMIT, максимальное число строк будет равно LIMIT. Если мы хотим знать общее возможное число строк, мы должны использовать функцию COUNT () в самом запросе.

Извлечение нескольких строк из запроса

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

  • простой массив;
  • ассоциативный массив;
  • объект;

Схематически стурктура возвращаемого рельутата может быть представлена на следующем рисунке:

В следующем примере, запрос будет содержать записи с идентификаторами 101, 102 и 103:

  • Код
  • Чистый код
  1.$db = JFactory::getDBO();
  2.$tableName = $db->nameQuote('#__table_name');
  3.$idColumn = $db->nameQuote('id');
  4.$fooColumn = $db->nameQuote('foo');
  5.$barColumn = $db->nameQuote('bar');
  6.$sql = "SELECT $idColumn, $fooColumn, $barColumn "
  7.. "FROM $tableName "
  8.. "WHERE $idColumn >= 101 AND "
  9.. " $idColumn <= 103 ";
10.$db->setQuery($sql);
11.// строки как массивы
12.$arrays = $db->loadRowList();
13.// строки как ассоциативные массивы
14.$associativeArrays = $db->loadAssocList();
15.// строки как объекты (stdClass)
16.$objects = $db->loadObjectList();
17.

        

Массив, в котором результаты возвращаются по умолчанию является обычным, то есть численно индексируются в порядке, в котором строки были взяты из базы данных.

Объект JTable

Одним из наиболее мощных классов в Joomla для работы с базами данных является абстрактный класс "JTable". Абстрактный класс "JTable" позволяет быстро разрабатывать интерфейс для работы с таблицами баз данных. С данным классом посильны такие действия как блокировка создание, удаление записей из таблиц. Ниже перечислены встроенные функции, которые класс JTable поддерживает:

  • копирование данных из массива или объекта к объекту "JTable";
  • запись в XML;
  • управление записью: создание, чтение, обновление и удаление записей;
  • проверка соответствия записи набору предопределенных правил;
  • блокировка пользователей при редактировании записи в любой момент времен
  • сортировка записей таблиц;
  • создание записи активной;
  • создание счетчика, хранящего количество просмотров записи;

Выполнение запросов с JTable

Как получать данные, как удалять строки, как использовать различные форматы вывода записей мы научились. Теперь другой вопрос "А как создать объект JTable правильно в системе Joomla?".

А ещё более Вас заинтересует вопрос "А зачем создавать объект JTable?".

Прежде всего, этот объект нужен для упрощения работы с таблицами внутри системы и для расширения собственных приложений в Joomla. Например, для создания объекта JTable класса как компонента, мы должны, во-первых, создать папку (если она еще не существует). Эта папка находится в корневой директории компонента. Например, для компонента "MyComponent" это будет:

administrator/components/com_mycomponent/tables

Класс JTable предназначен для различных типов расширений(модули, плагины, компоненты), нет никаких предопределенных мест для хранения JTable. Однако, если мы хотим использовать метод JTable::getInstance(), переместив его в другое место, тогда необходимо указать месторасположение класса JTable. При этом, можно добавить несколько путей.

JTable::addIncludePath($pathToSomeJTables);

Пример расширения класса JTable:

  • Код
  • Чистый код
  1./**
  2.* Handles database table #__mycomponent_foobars
  3.*/
  4.class TableFoobar extends JTable
  5.{
  6./** @var int */
  7.var $id = null;
  8./** @var string */
  9.var $foo = '';
10./** @var string */
11.var $bar = '';
12./**
13.* Create a new TableFoobar
14.*/
15.function __construct(&$db) {
16.parent::__construct('#__mycomponent_foobars', 'id', $db);
17.}
18./**
19.* Is the data valid?
20.*/
21.function check() {
22.// check for valid id (int or null)
23.if (!preg_match('~^\d+$~', $this->id) || $this->id !== null) {
24.$this->setError(JText::_('ID IS INVALID'));
25.return false;
26.}
27.// check for valid foo
28.if(JString::trim($this->foo) == '') {
29.$this->setError(JText::_('FOOBAR MUST HAVE FOO'));
30.return false;
31.}
32.// all OK, data is valid!
33.return true;
34.}
35.}
36.

        

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

  • Код
  • Чистый код
  1.$table = JTable::getInstance('Foobar', 'Table');

        

Обратите внимание на второй параметр. Второй параметр - префикс таблицы, по умолчанию используется значение, содержащееся в классе JTable по умолчанию.

Создание новой записи с помощью JTable

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

Итак, поехали!

Создаём экземпляр класса JTable

  • Код
  • Чистый код
  1.$table = JTable::getInstance('Foobar', 'Table');
  2.

        

Первым шагом является получение данных, которые мы будем использовать для создания новой записи. Эти данные будут связаны с объектом JTable. В следующем примере мы получаем полный ответ POST. Обратите внимание, что поскольку мы используем метод JRequest::get(), поэтому данные будут безопасными и уже обработанными.

  • Код
  • Чистый код
  1.$post = JRequest::get('POST');
  2.


        

Для сохранения новой записи, необходимо использовать метод JTable::save().

  • Код
  • Чистый код
  1.if (!$table->save($post)) {
  2.// выведет сообщение в случае ошибки
  3.}
  4.

        

Иногда нам нужно больше возможностей для контроля над данными, которые мы получаем от пользователей. Например, если у нас есть текстовое поле, в котором мы хотим разрешить хранение HTML, тогда использовать предыдущий вариант невозможно, так как специальные символы будут преобразованы в html сущности. Для того чтобы html сохранить в таблице необходимо использовать дополнительные параметры метода JRequest::getString.

  • Код
  • Чистый код
  1.// символы не экранируются
  2.$post['foo'] = JRequest::getString('foo', '', 'POST',JREQUEST_ALLOWRAW | JREQUEST_NOTRIM);
  3.

        
Этот подход также может быть полезным при работе со значениями, о которых мы знаем, что они точно должны быть определенного типа. Например, если мы знаем, что значение должно быть целым числом, тогда необходимо использовать метод JRequest::GetInt(), чтобы гарантировать, что возвращаемое значение является на самом деле числом.

Чтение существующей записи в таблице

Пример получения строки по её id:

  • Код
  • Чистый код
  1.if ($table->load(JRequest::getInt('id'))) {
  2.// мы загрузили строку!
  3.}
  4.

        

Таким образом, как только мы загрузили записи, мы можем использовать их с помощью метода JTable::get():

  • Код
  • Чистый код
  1.$someField = $table->get('someField');
  2.


        

Удаление записи из таблицы происходит ещё проще:

  • Код
  • Чистый код
  1.if ($table->delete(JRequest::getInt('id'))) {
  2.// строка удалена
  3.}
  4.

        

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

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

  • Код
  • Чистый код
  1.// получаем пользователя
  2.$user =& JFactory::getUser();
  3.// загружаем данные
  4.$table->load($id);
  5.// проверяем используется ли запись
  6.if ($table->isCheckedOut($user->get('id'))) {
  7.// кто использует запись!
  8.}
  9.

        

Если запись уже используется, то пользователь, к примеру, может быть перенаправлен на определенную страницу, с выводом сообщения, объясняющего, что статья уже редактируется. Если запись еще не используется, то следующим шагом будет проверка записи для самого себя(то есть не редактируете ли Вы сами в данный момент данные в базе). Делается это с помощью метода JTable::checkout().

  • Код
  • Чистый код
  1.$table->checkout($user->get('id'));
  2.

        

Как только мы закончили запись, можно её проверить с помощью метода JTable::checkin():

  • Код
  • Чистый код
  1.$table->checkin();
  2.

        

Более реалистичный пример использования

  • Код
  • Чистый код
  1.// получаем текущего пользователя
  2.$user =& JFactory::getUser();
  3.// проверка
  4.if (JTable::isCheckedOut($user->get('id'), $checkedOut)) {
  5.// другой пользователь вносит изменения в статью
  6.}
  7.

        

Итак, сейчас мы сможем создать собственный плагин, выводящий случайные «крылатые выражения», используя методы для работы с DBO.

Создаём плагин "Мудрые мысли"

Шаг 1. Создаём sql таблицу с названием "misli".

  • Код
  • Чистый код
  1.CREATE TABLE `jos_misli` (
  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.) AUTO_INCREMENT=100 DEFAULT CHARSET=utf8;
14.

        

Заполняем таблицу несколькими значениями:

  • Код
  • Чистый код
  1.INSERT INTO `jos_misli` (`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, '');

        

Шаг 2. Создаём xml файл без которого невозможно получить доступ к настройкам плагина из бакэнда админ. панели.

Укзанный файл расчитан для Joomla 1.6(осторожнее с разметкой при использовании в Joomla 1.5)!
  • Код
  • Чистый код
  1.<?xml version="1.0" encoding="utf-8"?>
  2.<extension version="1.6" type="plugin" group="content">
  3. <name>Misli</name>
  4. <creationDate>07 июня 2011 г.</creationDate>
  5. <author>Александр Ермаков</author>
  6. <authorEmail>eap1985@rambler.ru</authorEmail>
  7. <authorUrl>http://slyweb.ru/</authorUrl>
  8. <copyright>(c) Александр Ермаков http://slyweb.ru/</copyright>
  9. <license>GNU/GPL 2.0</license>
10. <description><![CDATA[Плагин "Крылатые фразы", выводящий крылатые новости в случайном порядке]]></description>
11. <version>1.0</version>
12. <files>
13. <filename plugin="misli">misli.php</filename>
14. </files>
15.
16.
17. <config>
18.
19. <fields name="params">
20. <fieldset name="basic">
21.
22. <field name="showon" type="radio" default="1" label="Параметр..." description="Его описание...">
23. <option value="0">Нет (только по тэгу {misli})</option>
24. <option value="1">Показывать во всех статьях</option>
25. </field>
26.
27. </fieldset>
28. </fields>
29.
30.
31. </config>
32.
33.</extension>
34.

        

Данный xml файл является упрощенным, для разработки полноценного плагина необходимо добавить в него разметку для установки таблиц sql. Даннную информацию можно найти по адресу: Developing a Model-View-Controller. Тогда у Вас получится не плагин, а компонент Joomla. Чем отличаются плагины от компонентов? - компоненты могут быть встроены в админ панель для работы с данными в бакэнде сайта, но данная тема, возможно, будет рассмотрена в следующих статьях о Joomla.

Шаг 3. Создаём скрипт "misli.php", выводящий крылатые выражения в случайном порядке.

  • Код
  • Чистый код
  1.
  2.<?php
  3.// no direct access
  4.defined( '_JEXEC' ) or die( 'Restricted access' );
  5.
  6.// подключаем библиотеки joomla для обработки событий и плагинов
  7.jimport('joomla.event.plugin');
  8.jimport('joomla.plugin.plugin');
  9.
10.
11.
12.function misli($article, $params, $limitstart )
13.{
14.
15.// создаём экземпляр класса
16.$db = JFactory::getDBO();
17.
18.// подгатавливаем данные
19.$tableName = $db->nameQuote('#__misli');
20.// подгатавливаем запрос случайно сортируя данные
21.$sql = "SELECT * FROM $tableName ORDER BY RAND()";
22.
23.$db->setQuery($sql);
24.// выполянем запрос
25.$object = $db->loadObject();
26.
27.
28. return $object;
29.}
30.
31.
32.class plgcontentMisli extends JPlugin
33.{
34. function plgcontentMisli (&$subject,$params)
35. {
36. parent::__construct ($subject,$params);
37.
38. }
39.
40. function onContentAfterDisplay($article, $params, $limitstart )
41. {
42.
43.
44. $content = misli($article, $this->params, $limitstart );
45. $out = '<div style="width:200px;">'.$content->misil.'
46. <div style="float:right;font: bold italic 110% serif;">'.$content->avtor.'</div></div>
47. ';
48.
49. return $out;
50.
51. }
52.}
53.
54.
55.?>
56.
57.

        

Объясню лишь функцию "onContentAfterDisplay", по сути данная функция выполняется при окончании загрузки содержимого статьи, что нам и нужно. В Joomla 1.5 данная функция называлась "onAfterDisplayContent".

Плагин появился в админ. панели На страницах статей будут выводится в случайном порядке мудрые мысли! В админ панели Вы можете добавлять дополнительные настройки через установочный файл misli.xml
рис. 1, рис. 2

Скачать архив вместе с плагином "Мудрые мысли".

Загрузить sql дамп "Мудрые мысли".

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


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