понедельник, 5 декабря 2011 г.

Создание расширения для CMS Joomla 1.7. Часть 6. Работа с базой данных.

Всем доброго времени суток! И мы продолжаем создавать расширение для 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.
Создадим два файла:
  1. В папке admin/sql/  файл с названием install.mysql.utf8.sql
  2. В папке 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`;
Теперь давайте разберемся, что мы сделали:

  1. Создали три файла: первый nstall.mysql.utf8.sql, который будет выполняться при установке компонента (SQL-запросы я описывать не буду, если кому-то надо пишите в комментариях, я обязательно посвящу несколько статей по MySQL), второй файл 0.0.6.sql, который будет выполняться только при выполнении обновления данного компонента, и третий файл uninstall.mysql.utf8.sql  будет выполняться при удалении данного файла.
  2. В вайле 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.

Понравилась статья? Поблагодарить автора:

Введите e-mail адрес:



7 комментариев:

  1. А я чё-то не понял, где это проверять базу данных?

    ОтветитьУдалить
    Ответы
    1. Зайдите в базу данных, созданную для Joomla. Проверьте таблицу _helloworld.

      Удалить
    2. А нету( Извините, я правильно понял? Вот это надо вставить в 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!');

      или нет?)

      Удалить
    3. А нету( Извините, я правильно понял? Вот это надо вставить 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!');

      или нет?)

      Удалить
    4. Нет, нужно вставить все в один файл install.mysql.utf8.sql, который выполнится при установке компонента. И то же самое вставить в 0.0.6.sql, а этот файл будет выполняться при обновлении компонента до версии 0.0.6.

      Удалить
    5. Блин, да что ж такое.. всё равно нет таблицы(

      Удалить
  2. Чёрт ногу сломит

    ОтветитьУдалить