Всем доброго времени суток! И мы продолжаем создавать расширение для CMS Joomla. В предыдущих статьях мы создали компонент, который выводил на сайте надпись “Hello World”, а в административной части выводил “Hello World administrator” “Создание расширения для CMS Joomla 1.7. Часть 1”. Да, смысловой нагрузки данный компонент не несет, но и задача стояла разобраться в структуре компонента. Дальше мы постепенно стали наращивать функциональность этого компонента, так в статье “Создание расширения для CMS Joomla 1.7. Часть 2” мы создали контроллер и представление, а уже к пятой части статей про создание расширений для CMS Joomla “Создание расширения для CMS Joomla 1.7. Часть 5. Добавление переменной запроса.” наш компонент уже имеет свой пункт меню, умеет работать с данными при помощи модели, умеет работать с переменными переданными через запросы. Но вот работать с базой данных пока не умеет. И задача данной статьи научить наш компонент работать с базой данных, да и сами научиться. Думаю, объяснять не надо насколько это важно уметь работать с базой данных. Давайте приступим...
Компоненты, как правило, управляют содержимым с помощью базы данных. На этапе установки, удаления или обновления компонента Вы можете выполнять SQL-запросы при помощи файлов с расширением sql.
Создадим два файла:
В эти файлы добавим следующее содержание:
DROP TABLE IF EXISTS `#__helloworld`;
CREATE TABLE `#__helloworld` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`greeting` varchar(25) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
INSERT INTO `#__helloworld` (`greeting`) VALUES
('Hello World!'),
('Good bye World!');
Теперь изменим файл helloworld.xml, следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="1.7.0" method="upgrade">
<name>Hello World!</name>
<!-- Данные о разработчике -->
<creationDate>2011</creationDate>
<author>zloykolobok</author>
<authorEmail></authorEmail>
<authorUrl>http://zloykolobok.blogspot.com</authorUrl>
<copyright>Copyright Info</copyright>
<license>License Info</license>
<!-- Версия продукта-->
<version>0.0.6</version>
<!-- Описание компонента-->
<description>Продолжение статей по созданию расширений для CMS Joomla</description>
<install> <!-- Будет выполнено при установке компонента-->
<sql>
<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
</sql>
</install>
<uninstall> <!-- Будет выполнено при удалении компонента -->
<sql>
<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
</sql>
</uninstall>
<update> <!-- Будет исполнено при обновлении. Доступно с версии 1.6 -->
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>
<!-- Копирование файлов в секцию site-->
<files folder="site">
<filename>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<folder>views</folder>
<folder>models</folder>
</files>
<administration>
<!-- меню в административном разделе-->
<menu>Hello World!</menu>
<!-- Копирование сайтов в секцию Administration -->
<files folder="admin">
<filename>index.html</filename>
<filename>helloworld.php</filename>
<!-- папка для SQL файлов -->
<folder>sql</folder>
<!-- папка tables -->
<folder>tables</folder>
<!-- папка models -->
<folder>models</folder>
</files>
</administration>
</extension>
Теперь необходимо создать SQL-файл, который будет выполняться при удалении нашего компонента. В папке admin/sql/ создадим файл с названием uninstall.mysql.utf8.sql и поместим туда следующий код:
DROP TABLE IF EXISTS `#__helloworld`;
Теперь давайте разберемся, что мы сделали:
До этого момента мы использовали жестко тип поля для сообщения, но нам надо использовать базу данных. Давайте так и поступим.
Изменим файл site/views/helloworld/tmpl/default.xml :
<?xml version="1.0" encoding="utf-8"?>
<metadata>
<layout title="COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_TITLE">
<message>COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_DESC</message>
</layout>
<fields
name="request"
addfieldpath="/administrator/components/com_helloworld/models/fields"
>
<fieldset name="request">
<field
name="id"
type="helloworld"
label="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL"
description="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC"
/>
</fieldset>
</fields>
</metadata>
Теперь создадим в admin/models/fields/ файл с названием helloworld.php и поместим туда следующий код:
<?php
// Ограничение доступа
defined('_JEXEC') or die;
// Импорт библиотеки
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');
/**
* Класс выбора значений из поля для нашего компонента
*/
class JFormFieldHelloWorld extends JFormFieldList
{
protected $type = 'HelloWorld';
protected function getOptions()
{
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('id,greeting');
$query->from('#__helloworld');
$db->setQuery((string)$query);
$messages = $db->loadObjectList();
$options = array();
if ($messages)
{
foreach($messages as $message)
{
$options[] = JHtml::_('select.option', $message->id, $message->greeting);
}
}
$options = array_merge(parent::getOptions(), $options);
return $options;
}
}
Тут мы использовали два класса JFormFieldList и JFactory, которые я опишу в следующих статьях.
Все теперь новый тип полей отображается в раскрывающемся списке.
Теперь осталось отобразить данные из базы данных, в соответствии с указанными настройками. Для этого изменяем нашу модель site/models/helloworld.php :
<?php
// Права доступа
defined('_JEXEC') or die('Restricted access');
// Загружаем библиотеку joomla.application.component.modelitem
jimport('joomla.application.component.modelitem');
/**
* Модель HelloWorld
*/
class HelloWorldModelHelloWorld extends JModelItem
{
protected $msg;
public function getTable($type = 'HelloWorld', $prefix = 'HelloWorldTable', $config = array())
{
return JTable::getInstance($type, $prefix, $config);
}
public function getMsg()
{
if (!isset($this->msg))
{
$id = JRequest::getInt('id', 1);
// Берем данные из TableHelloWorld
$table = $this->getTable();
// Загружаем сообщение
$table->load($id);
// Помещаем в msg значение поля greeting
$this->msg = $table->greeting;
}
return $this->msg;
}
}
Теперь наша модель запрашивает у класса TableHelloWorld данные, чтобы получить сообщение. Этот класс таблицы должен быть определен в admin/tables/ в фале helloworld.php . Давайте сделаем это. Создадим helloworld.php в указанной папке и добавим туда следующий код:
<?php
// Права доступа
defined('_JEXEC') or die('Restricted access');
// Загружаем библиотеку joomla.database.table
jimport('joomla.database.table');
/**
* Класс Hello Table
*/
class HelloWorldTableHelloWorld extends JTable
{
function __construct(&$db)
{
parent::__construct('#__helloworld', 'id', $db);
}
}
На этом все.
Давайте проверим, что у нас получилось. Установим наш компонент, если Вы увидели следующее окно, то компонент установлен успешно:
Теперь давайте проверим нашу базу данных:
Как видите у меня в базе появилась таблица “joom_helloworld” с двумя записями. Хорошо, при установке отработал наш SQL-файл.
Теперь давайте создадим пункт меню для нашего компонента.
И как, видим на картинке ниже у нас есть выпадающий список значений, которые берутся из базы данных:
Мы ставим любое значение и перейдем к сайту:
И переходим по ссылке:
Ура, у нас все заработало.
На этом можно заканчивать данную статью. Скачать готовый компонент Вы можете отсюда (только перед установкой переименуйте архив в com_helloworld.com). Если у Вас что-то не получилось, то пишите в комментариях, мы обязательно это обсудим. Вы также можете следить за мной в twitter или читать меня в G+. В следующем посте мы рассмотрим изменения административной части нашего сайта, для того чтобы не пропустить выхода новых статей подпишитесь на мой блог.
На этом я заканчиваю статью, посвященную взаимодействие компонета с базой данных. Всем удачной разработки на CMS Joomla.
Компоненты, как правило, управляют содержимым с помощью базы данных. На этапе установки, удаления или обновления компонента Вы можете выполнять SQL-запросы при помощи файлов с расширением sql.
Создадим два файла:
- В папке admin/sql/ файл с названием install.mysql.utf8.sql
- В папке admin/sql/updates/mysql/ файл с названием 0.0.6.sql
В эти файлы добавим следующее содержание:
DROP TABLE IF EXISTS `#__helloworld`;
CREATE TABLE `#__helloworld` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`greeting` varchar(25) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
INSERT INTO `#__helloworld` (`greeting`) VALUES
('Hello World!'),
('Good bye World!');
Теперь изменим файл helloworld.xml, следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="1.7.0" method="upgrade">
<name>Hello World!</name>
<!-- Данные о разработчике -->
<creationDate>2011</creationDate>
<author>zloykolobok</author>
<authorEmail></authorEmail>
<authorUrl>http://zloykolobok.blogspot.com</authorUrl>
<copyright>Copyright Info</copyright>
<license>License Info</license>
<!-- Версия продукта-->
<version>0.0.6</version>
<!-- Описание компонента-->
<description>Продолжение статей по созданию расширений для CMS Joomla</description>
<install> <!-- Будет выполнено при установке компонента-->
<sql>
<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
</sql>
</install>
<uninstall> <!-- Будет выполнено при удалении компонента -->
<sql>
<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
</sql>
</uninstall>
<update> <!-- Будет исполнено при обновлении. Доступно с версии 1.6 -->
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>
<!-- Копирование файлов в секцию site-->
<files folder="site">
<filename>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<folder>views</folder>
<folder>models</folder>
</files>
<administration>
<!-- меню в административном разделе-->
<menu>Hello World!</menu>
<!-- Копирование сайтов в секцию Administration -->
<files folder="admin">
<filename>index.html</filename>
<filename>helloworld.php</filename>
<!-- папка для SQL файлов -->
<folder>sql</folder>
<!-- папка tables -->
<folder>tables</folder>
<!-- папка models -->
<folder>models</folder>
</files>
</administration>
</extension>
Теперь необходимо создать SQL-файл, который будет выполняться при удалении нашего компонента. В папке admin/sql/ создадим файл с названием uninstall.mysql.utf8.sql и поместим туда следующий код:
DROP TABLE IF EXISTS `#__helloworld`;
Теперь давайте разберемся, что мы сделали:
- Создали три файла: первый nstall.mysql.utf8.sql, который будет выполняться при установке компонента (SQL-запросы я описывать не буду, если кому-то надо пишите в комментариях, я обязательно посвящу несколько статей по MySQL), второй файл 0.0.6.sql, который будет выполняться только при выполнении обновления данного компонента, и третий файл uninstall.mysql.utf8.sql будет выполняться при удалении данного файла.
- В вайле helloworld.xml, в тегах <install></install>, <update></update>, <uninstall></uninstall> мы прописали файли, который и будут выполняться при установке, при обновлении и при удалении данного компонента.
До этого момента мы использовали жестко тип поля для сообщения, но нам надо использовать базу данных. Давайте так и поступим.
Изменим файл site/views/helloworld/tmpl/default.xml :
<?xml version="1.0" encoding="utf-8"?>
<metadata>
<layout title="COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_TITLE">
<message>COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_DESC</message>
</layout>
<fields
name="request"
addfieldpath="/administrator/components/com_helloworld/models/fields"
>
<fieldset name="request">
<field
name="id"
type="helloworld"
label="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL"
description="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC"
/>
</fieldset>
</fields>
</metadata>
Теперь создадим в admin/models/fields/ файл с названием helloworld.php и поместим туда следующий код:
<?php
// Ограничение доступа
defined('_JEXEC') or die;
// Импорт библиотеки
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');
/**
* Класс выбора значений из поля для нашего компонента
*/
class JFormFieldHelloWorld extends JFormFieldList
{
protected $type = 'HelloWorld';
protected function getOptions()
{
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('id,greeting');
$query->from('#__helloworld');
$db->setQuery((string)$query);
$messages = $db->loadObjectList();
$options = array();
if ($messages)
{
foreach($messages as $message)
{
$options[] = JHtml::_('select.option', $message->id, $message->greeting);
}
}
$options = array_merge(parent::getOptions(), $options);
return $options;
}
}
Тут мы использовали два класса JFormFieldList и JFactory, которые я опишу в следующих статьях.
Все теперь новый тип полей отображается в раскрывающемся списке.
Теперь осталось отобразить данные из базы данных, в соответствии с указанными настройками. Для этого изменяем нашу модель site/models/helloworld.php :
<?php
// Права доступа
defined('_JEXEC') or die('Restricted access');
// Загружаем библиотеку joomla.application.component.modelitem
jimport('joomla.application.component.modelitem');
/**
* Модель HelloWorld
*/
class HelloWorldModelHelloWorld extends JModelItem
{
protected $msg;
public function getTable($type = 'HelloWorld', $prefix = 'HelloWorldTable', $config = array())
{
return JTable::getInstance($type, $prefix, $config);
}
public function getMsg()
{
if (!isset($this->msg))
{
$id = JRequest::getInt('id', 1);
// Берем данные из TableHelloWorld
$table = $this->getTable();
// Загружаем сообщение
$table->load($id);
// Помещаем в msg значение поля greeting
$this->msg = $table->greeting;
}
return $this->msg;
}
}
Теперь наша модель запрашивает у класса TableHelloWorld данные, чтобы получить сообщение. Этот класс таблицы должен быть определен в admin/tables/ в фале helloworld.php . Давайте сделаем это. Создадим helloworld.php в указанной папке и добавим туда следующий код:
<?php
// Права доступа
defined('_JEXEC') or die('Restricted access');
// Загружаем библиотеку joomla.database.table
jimport('joomla.database.table');
/**
* Класс Hello Table
*/
class HelloWorldTableHelloWorld extends JTable
{
function __construct(&$db)
{
parent::__construct('#__helloworld', 'id', $db);
}
}
На этом все.
Давайте проверим, что у нас получилось. Установим наш компонент, если Вы увидели следующее окно, то компонент установлен успешно:
Теперь давайте проверим нашу базу данных:
Как видите у меня в базе появилась таблица “joom_helloworld” с двумя записями. Хорошо, при установке отработал наш SQL-файл.
Теперь давайте создадим пункт меню для нашего компонента.
И как, видим на картинке ниже у нас есть выпадающий список значений, которые берутся из базы данных:
Мы ставим любое значение и перейдем к сайту:
И переходим по ссылке:
Ура, у нас все заработало.
На этом можно заканчивать данную статью. Скачать готовый компонент Вы можете отсюда (только перед установкой переименуйте архив в com_helloworld.com). Если у Вас что-то не получилось, то пишите в комментариях, мы обязательно это обсудим. Вы также можете следить за мной в twitter или читать меня в G+. В следующем посте мы рассмотрим изменения административной части нашего сайта, для того чтобы не пропустить выхода новых статей подпишитесь на мой блог.
На этом я заканчиваю статью, посвященную взаимодействие компонета с базой данных. Всем удачной разработки на CMS Joomla.
А я чё-то не понял, где это проверять базу данных?
ОтветитьУдалитьЗайдите в базу данных, созданную для Joomla. Проверьте таблицу _helloworld.
УдалитьА нету( Извините, я правильно понял? Вот это надо вставить в install.mysql.utf8.sql:
УдалитьDROP TABLE IF EXISTS `#__helloworld`;
CREATE TABLE `#__helloworld` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`greeting` varchar(25) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
а это в 0.0.6.sql:
INSERT INTO `#__helloworld` (`greeting`) VALUES
('Hello World!'),
('Good bye World!');
или нет?)
А нету( Извините, я правильно понял? Вот это надо вставить install.mysql.utf8.sql:
УдалитьDROP TABLE IF EXISTS `#__helloworld`;
CREATE TABLE `#__helloworld` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`greeting` varchar(25) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
а это в 0.0.6.sql:
INSERT INTO `#__helloworld` (`greeting`) VALUES
('Hello World!'),
('Good bye World!');
или нет?)
Нет, нужно вставить все в один файл install.mysql.utf8.sql, который выполнится при установке компонента. И то же самое вставить в 0.0.6.sql, а этот файл будет выполняться при обновлении компонента до версии 0.0.6.
УдалитьБлин, да что ж такое.. всё равно нет таблицы(
УдалитьЧёрт ногу сломит
ОтветитьУдалить