Работа с базами данных в CMS Joomla

Создание подключения к БД и контроль соединения

Выполнение запросов к БД

Внесение полученных данных в базу

Вывод результата

Создание шаблона с сообщением об отправке

 

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

Работа с базами данных в CMS Joomla

Данная CMS предоставляет разработчику довольно широкий выбор вариантов работы с БД. Можно использовать стандартные функции языка PHP, а можно использовать функции (методы) самой CMS. Второй вариант более удобен по многим причинам, например, возможность работы с любыми префиксами таблиц, отсутствие необходимости указывать в коде данные для установки соединения с базой и так далее. Ниже будут рассмотрены несколько основных примеров работы с БД.

Создание подключения к БД и контроль соединения

Если говорить более правильно, то это создание нового экземпляра класса, при котором соединение с БД производится автоматически:

  1    $db = JFactory::getDBO();

Обратите внимание на присутствующий здесь знак амперсанда, не пропускайте его при составлении кода!

Далее не обязательно, но крайне желательно выполнить проверку соединения:

  2    if (!$db->connected()) {
  3         echo "Нет соединения с сервером баз данных";
  4         jexit();
  5    }

 

Если соединение установлено, можно переходить к работе с базой при помощи запросов.

Выполнение запросов к БД

CMS Joomla предоставляет возможность составлять запросы в различных вариантах. Ниже будут приведены несколько примеров составления запроса.

Пример №1, вариант 1

  6    $query = "CREATE TABLE `sitecontrol` . `#__fbf` ( `id` INT NOT NULL PRIMARY KEY , `name` VARCHAR(30) NOT NULL , `address` VARCHAR(150) NOT NULL , `e-mail` VARCHAR(100) NOT NULL ) ENGINE = InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;";
  7    $db->setQuery( $query );     // Установка запроса в экземпляр класса
  8    $db->query();                        // Выполнение запроса

В данном варианте в строке 6 составляется запрос на языке SQL (SQL-запрос). Если "перевести" этот запрос на человеческий язык, то здесь запрашивается создание (команда CREATE TABLE) новой таблицы `#__fbf` в базе данных `sitecontrol` с колонками `id`, `name`, `address`, `e-mail` и соответствующими настройками таблицы. Так же в запросе указывается, что колонка `id` должна иметь PRIMARY KEY (первичный ключ), а так же указываются типы данных в колонках и значения по умолчанию.

 Обратите внимание на то, что перед названием таблицы идёт префикс, состоящий из символа # и двойного подчёркивания __ (не забывайте - именно двойного, иначе не будет работать!). Этот символ при создании новой таблицы автоматически заменяется на префикс, применяемый в данной базе данных. Это удобно тем, что данный компонент становится универсальным, т.е. его можно становить на любой сайт.

В строке 7 подготовленный запрос вставляется в созданный в строке 1 экземпляр класса, а строка 8 даёт команду выполнить запрос.

Пример №1, вариант 2

Это более упрощённый вариант предыдущего кода:

// Установка запроса в экземпляр класса 

  6     $db->setQuery("CREATE TABLE `sitecontrol` . `#__fbf` ( `id` INT NOT NULL PRIMARY KEY , `name` VARCHAR(30) NOT NULL , `address` VARCHAR(150) NOT NULL , `e-mail` VARCHAR(100) NOT NULL ) ENGINE = InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;");
  7    $db->query();                        // Выполнение запроса

В данном варианте стало на одну строку меньше, так как отдельно прописываемый текст в строке 6 первого варианта теперь прописывается сразу в скобках метода $db->setQuery (без создания дополнительной переменной).

Пример №2

В этом примере создаётся новая строка и вносятся значения в её ячейки:

  8    $db->setQuery("INSERT INTO #__fbfsda (id, name, text, status) VALUES (1, 'Andrey', 'Текст', '1')");
  9    // Выполнение запроса
 10   $db->query();

В строке 8 в экземпляр класса вносится запрос на создание новой строки (INSERT INTO) в таблице #__fbf (обратите внимание на применение префикса #__ с двойным подчёркиванием, см. выше). В первых скобках перечисляются колонки, для которых будут установлены значения, которые указаны далее во вторых скобках после VALUES. Если при создании в строке окажутся не указанные в запросе ячейки, значения для них будут созданы системой автоматически ("по умолчанию"). 

Пример №3, вариант 1

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

В данном примере будет рассмотрено несколько вариантов получения данных из определённой ячейки таблицы; SQL-запрос в этом случае будет выглядеть следующим образом:

"SELECT name FROM #__fbf WHERE id=1"

Команда (если более правильно - оператор) SELECT требует получить данные из колонки (FROM) таблицы #__fbf из строки с  id (помните про первичный ключ?) равным 1. Т.е. требуется получить данные, находящиеся в строке 1 в колонке name указанной таблицы. Для этого можно применить следующий код:

 11   $db->setQuery("SELECT name FROM #__fbf WHERE id=1");   // установка запроса в экземпляр класса
 12   $db->query();      // Выполнение запроса
 13   $result = $db->loadResult();      // Получение результата

Функция loadResult в строке 13 позволяет получить только одно значение; если вы получаете значение нескольких ячеек (всей строки, всей колонки и т.п.), то применяется функция loadRow(), которая выведет результат в виде массива.

Пример №3, вариант 2

Всё тоже самое можно сделать другим путём:

 13   $query = $db->getQuery(true);    // Создание нового объекта запроса
 14   $query->select($db->quoteName(array('name')));    
 15   $query->from($db->quoteName('#__fbf'));
 16   $query->where($db->quoteName('id') . '=' . '1');
 17   $db->setQuery($query);    // Выполнение запроса
 18   $result = $db->loadResult();    // Получение результата

В этом варианте сначала создаётся новый объект запроса (строка 13), затем в строках 14-16 прописывается сам запрос, в каждой строке отдельно для selectfrom и where, (особое внимание обратите на то, как прописывается значение 1 для id в строке 16). В строке 17 созданный новый объект запроса вставляется в скобки и выполняется запрос, в строке 18 выводится полученный результат. 

Пример №3, вариант 3

Есть чуть более упрощенное написание кода, указанного в варианте 2:

 13   $query = $db->getQuery(true);    // Создание нового объекта запроса
 14   $query
 15            ->select($db->quoteName(array('name')))    
 16            ->from($db->quoteName('#__fbf'))
 17            ->where($db->quoteName('id') . '=' . '1');
 18   $db->setQuery($query);    // Выполнение запроса
 19   $result = $db->loadResult();    // Получение результата

 

Особое внимание обратите на то, что в строках 17 и 18 в конце нет ; (точки с запятой).

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

Более подробную информацию вы можете найти на официальном сайте docs.joomla.org.

А теперь вернёмся к коду файла обработчика формы.

Внесение полученных данных в базу

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

  68   // Создание новой записи (строки) в БД
  69   $db->setQuery('INSERT INTO #__feedback_form (id, name, type, text, img_1, img_2, img_3, email, IP, data_mess, time_mess, status_mess) VALUES (' . $message_number . ', "' . $name . '", "' . $type_mess . '", "' . $text_mess . '", "' . $image_1 . '", "' . $image_2 . '", "' . $image_3 . '", "' . $eml . '", "' . $ip_client . '", "' . $date_mess . '", "' . $time_mess . '", ' . $status_mess . ')');

  70    $db->query();

В коде строка 69 прописывается без переносов (редактор это позволяет). В указанной строке составляется SQL-запрос, который создаёт новую строку в БД, причём в качестве значений для всех ячеек выступают созданные ранее переменные с полученными данными. Более подробно метод для создания новой строки описан выше в примере №2.

Код в строке 70 выполняет запрос к БД.

Вывод результата

Теперь необходимо проверить выполнение запроса (создания новой строки с данными, полученными из формы с новым сообщением) и в случае успешного заверения процесса вывести результат в виде сообщения на экране.  


  71   // ВЫВОД РЕЗУЛЬТАТА
  72   //Проверка внесения обращения
  73   $db->setQuery("SELECT MAX(id) FROM #__feedback_form");
  74   $result_control = $db->loadResult();
  75   if ($num_rec_control == $result_control) {
  76   require(JPATH_COMPONENT .'/views/tpl_new/tpl_new_mess_ok.php');

В строке 73 создаётся запрос на получение последнего номера сообщения (столбец id) и в строке 74 переменная $result_control получает результат запроса. Далее в строке 75 значение этой переменной сравнивается со значением переменной $result_control, содержащей номер полученного сообщения (см. строку 34 кода). Если значения равны, т.е. строка создана, выполняются строки, указанные в if

 

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

Создание шаблона с сообщением об отправке

Шаблон с сообщением должен быть расположен там же, где и все шаблоны страниц - в папке  views . Так как эта страница напрямую относится к форме для отправке сообщения, то сам файл целесообразно разместить в той же папке, что и файл new_mess.php tpl_new . Собственно, именно этот адрес и прописан в строке 76:

/views/tpl_new/tpl_new_mess_ok.php

Итак, откройте редактор Notepad++, выберите в меню Файл > Новый, сохраните его с указанным именем и расширением (tpl_new_mess_ok.php) в указанное место и переходите к составлению кода.

Что будет отображаться на экране в случае успешного сохранения сообщения, решайте сами. Это может быть просто какой-то короткий текст, который вы красиво оформите при помощи CSS, а может быть какая-либо картинка, установленная в папку  images  компонента. 

  1    <?php
  2    /**
  3    * @Author WDS
  4    * @subpackage Components
  5    * @link Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
  6    * @license GNU/GPL
  7    * @copyright Copyright (C) 2019
  8    */
  9     // Защита от прямого доступа
 10 
   defined( '_JEXEC' ) or die( 'Restricted access' );

 11   // Функция getDocument класса JFactory присваивает $doc объект документа
 12   $doc = JFactory::getDocument();
 13   // Подключение файла CSS
 14   $doc->addStyleSheet(JUri::base(). 'components/com_feedback_form/views/css/tpl_new_mess_ok.css');
 15   // Подключение метатегов
 16   $doc->setTitle('Форма обратной связи');
 17   $doc->addCustomTag('<meta name="robots" content="noindex, nofollow" />');
 18   ?>
 19   <p class='info_feedback'>Выполнено!</p>
 20   <p class='info_label'>Ваше обращение зарегистрировано под номером:</p>
 21   <div class='info_num_bord'>
 22   <p class='info_number'>000<?php echo $num_rec_control; ?></p>
 23   </div>

Если вы изучали создание компонента с самого начала, то разобраться в данном коде вам будет очень легко. Этот код выводит на экран фразу "Выполнено!" (строка 19), на следующей строке "Ваше обращение зарегистрировано под номером:" (строка 20) и ещё ниже номер, перед которым вставляется три нуля (строка 22).

Наверное, вы заметили, что для открытия этой страницы необходимо создать ещё один файл - tpl_new_mess_ok.css (строка 14). Расположен он так же как и предыдущий, в папке  CSS , вложенной в папку  views . Поэтому снова в редакторе выберите Файл > Новый, сохраните его с указанным именем и расширением (tpl_new_mess_ok.css) в указанное место и переходите к составлению кода:

/* СТРАНИЦА ОБРАТНОЙ СВЯЗИ (подтверждение) */
/* Subpackage: Components */
/* Copyright (C) 2019 */
p.info_feedback {
     margin: 100px 0 0 0;
     font-family: Georgia;
     font-size: 30px;
     font-style: italic;
     font-weight: bold;
     color: rgb(90,90,90);
     text-align: center;
}
p.info_label {
     margin: 40px 0 0 0;
     color: rgb(90,90,90);
     font-size: 20px;
     text-align: center;
}
p.info_number {
     margin: 20px 0 170px 0;
     font-family: 'Monotype Corsiva';
     font-size: 45px;
     text-align: center;
}
.ya-share2.ya-share2_inited {
     visibility: hidden;
}

Просто скопируйте этот код в файл и сохраните. При необходимости вы можете самостоятельно настроить внешний вид этой страницы; как работать с файлами CSS читайте в Части 1 главах 21-25.

-------

Теперь вернитесь к файлу обработчика формы. В строке 75 находится конструкция if с открытой фигурной скобкой; для того, что бы просмотреть что получилось, на время поставьте ниже (в строке 77) закрывающую скобку, но не забудьте её позже убрать, так как это ещё не окончательный код данной страницы. Сохраните файл.

Теперь откройте сайт, введите какое-либо сообщение и "отправьте" его. Если всё сделано без ошибок, вы увидите страницу подтверждения, которую только что создали.

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

 

Добавлять комментарии и ответы могут только пользователи, прошедшие регистрацию!
Зарегистрируйтесь и напишите своё мнение или ответ!