Вывод данных из базы данных

Дата Автор 

 

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

Вообще, по уму, таблицу надо создавать сразу с установкой компонента, но я решил с самого начала не загружать вас большим объемом информации и в уроке «создание основы компонента» оставить, только установочный файл. Мы создадим таблицу компонента, а так же отобразим из неё данные в бэкэнде (админке). Ну что поехали?

 

Создание таблицы в базе данных

 

Итак, для начала войдите в свою базу данных, с помощью программы phpmyadmin, обычно именно она установлена на всех хостингах. После авторизации, перед вами появятся список таблиц в вашей базе данных. В самом верху будет вкладка “SQL” нажмите на неё и перед вами появиться поле для ввода sql запроса, с помощью которого мы сейчас создадим таблицу для компонента.

 

CREATE TABLE `#__lesson` (

    id   bigint(20) unsigned NOT NULL auto_increment,

    name  CHAR(30),

    text  CHAR(128),

    ansver  CHAR(32),

PRIMARY KEY (`id`)

 ) TYPE=MyISAM;        

 

Это называется sql запрос.  Если уже работали с такими запросами, то вам все строчки должны быть понятны, если нет, то сейчас я все объясню.

CREATE TABLE `#__lesson` - Другими словами Создать таблицу ‘префикс БД__название таблицы’

 

Дальше идут перечисления ячеек и их тип (name  CHAR(30)), объясню на примере:

 

name  –  название ячейки

CHAR(30) –  Ячейка будет содержать строку длинной до 30 символов для одного поля. Значение 30 можно изменить на любое до 254.

 

Дальнейшие строчки точно такие же, кроме двух последних.

PRIMARY KEY (`id`)  - Указывает что ячейка id будет уникальным номером. Такая ячейка должна быть в каждой таблице.

TYPE=MyISAM – тип таблицы MyISAM. Не буду описывать, что значит MyISAM, ибо в данном случае это не важно.

 

Как и говорил все это должно устанавливаться вместе с установкой компонента, следовательно, стоит сохранить этот код в отдельном файле и прописать этот файл в установочном файле компонента.  Для этого, необходимо в самом начале, в папке admin создать файл с названием install.mysql.utf8.sql и разместить в нем вышенаписанный код.

 

Если вы будите создавать таблицу через phpmyadmin, то замените символ # на префикс вашей базы данных.

 

Так же нужно изменит установочный файл компонента, добавив в него вот такой фрагмент:

 

<install>

       <sql>

               <file driver="mysql" charset="utf8">install.mysql.utf8.sql</file>

       </sql>

</install>

 

Для работы с нашей базой данных, необходимо создать файл с классом Jtable, который позволит выполнить все основные функции по работе с таблицей.  Для этого, в папке administrator/com_название компонента (у меня administrator/com_lesson) создайте папку tables, а в ней файл с названием lesson.php. В нем должен находиться следующий код:

 

<?php

defined('_JEXEC') or die('Restricted access');

class TableLesson extends JTable

{

      public $id = null;

      public $name = null;

      public $text = null;

      public $ansver = null;

               

function __construct(&$db)

      {

          parent::__construct('#__lesson', 'id', $db);

      }

}

 

Сейчас я объясню, что же значит этот код. Мы создали класс TableLesson который будет, так сказать, улучшать класс JTable. Мы добавили поля нашей таблицы, как свойства класса. Так же создали функцию construct() которая вызовет конструктор родительского класса и будет передавать имя таблицы, первичный ключ, а так же коннектор для базы данных.

parent::__construct('#__lesson', 'id', $db) – конструктор(‘таблица’, ’первичный ключ’, ’коннектор’)

 

Для того чтобы, Joomla знала где ей найти классы JTable, нужно задать ей путь поиска в главном файле бэкэнда admin.название компонента.php (admin.lesson.php). Добавьте эту строчку сразу после объявления контроллера.

 

JTable::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR . DS . 'tables');

 

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

 

Отображение данных в админке компонента

 

Чтобы отобразить данные таблицы нам придется, изменит модель и вид в админке компонента. Начнем с изменения модели. Новый код модели будет выглядеть так:

 

<?php

defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.model');

 

class LessonModelLesson extends JModel

{

      private $_teach;

      function __construct()

      {

            parent::__construct();

      }

 

      public function getTeach()

      {

           if (empty($this->_teach))

                {

            $query      = 'SELECT * ' . ' FROM ' . '#__lesson' ;

            $this->_db->setQuery($query);

            $this->_teach = $this->_db->loadObjectList();

                }

 

            return $this->_teach;

      }

}

 

Создаем приватную функцию $_teach для кэширования списка заданий. Далее создали функцию getTeach с условием в котором происходит отбор данных из таблицы. Сейчас подробно опишу каждую строчку:

 

$query ='SELECT * '.' FROM '.'#__lesson'; 

 

Переменной  $query присваивается sql запрос.  Данную строчку можно описать так ‘ВЫБРАТЬ  все ячейки’.’ИЗ’.’таблицы lesson’.

 

$this->_db->setQuery($query);

 

В базу данных отправляется запрос с помощью метода setQuery() сам запрос берется из переменной $query. Главное запомнить, что метод setQuery(), только устанавливает запрос, а не извлекает данные. Сделанный запрос записывается в свойство  $this->_db.

 

$this->_teach = $this->_db->loadObjectList();

 

Далее если запрос установлен, то извлекаем из него данные. В свойство $this->_db загружаем данные методом loadObjectList(). А свойству $this->_teach присваиваем свойство $this->_db в котором загружены данные из таблицы.

 

return $this->_teach;

 

Условие выполнено. Теперь возвращаемся к свойству $this->_teach.

 

Теперь данные из базы данных получены, осталось их вывести в админке компонента, для этого нам придется изменить его вид. Для начала изменим файл управления данными, то есть view.html.php.  

 

<?php

defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');

 

class LessonViewLesson extends JView

{

function display($tpl = null)

{

                $rows = $this->get('Teach');

                $this->assignRef('rows', $rows);

                parent::display($tpl);

}

}                                        

 

Как видите, файл управления не сильно изменился, добавилось всего две  новых строки.

 

$rows = $this->get('Teach');  

 

Переменной $rows присваиваеться полученный список заданий из модели. А модель, как мы уже знаем, получила его из базы данных.

 

$this->assignRef('rows', $rows);

 

Данная строка присваивает полученный список виду. Ничего нового подобное я описывал ранее.

 

 

Теперь нужно красиво отобразить информацию, для этого, как вы уже знаете нужно изменить файл default.php который находиться в папке tmpl.

 

<?php                                    

defined('_JEXEC') or die('Restricted access');

?>

<table class="adminlist">

     <tr>

         <th>Предмет</th>

         <th>Задание</th>

         <th>Ответ</th>

         <th>ID</th>

     </tr>

         <?php if ($this->rows): foreach ($this->rows as $i => $row): ?>

     <tr class="row<?php echo $i % 2; ?>">

         <td><?php echo $row->name; ?></td>

         <td><?php echo $row->text; ?></td>

         <td><?php echo $row->ansver; ?></td>

         <td><?php echo $row->id; ?></td>

     </tr>

     <?php  endforeach;  else: ?>

     <tr>

         <td colspan="15">Пока уроков нет</td>

     <tr>

     <?php endif; ?>

</table>

 

В принципе, тут, пока что нечего описывать, в основном тут один html, а если вы читаете данные уроки, то соответственно должны знать, хотя бы осн овы html.  От PHP, условие, которое будет выводить строку «Пока уроков нет», если в нашей таблице нет ни одного урока. Так же, переменные ячеек таблицы, из tables/lesson.php которые приравниваются к полям таблицы базы данных.

 

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

 

Если вы нашли ошибку, то обязательно напишите мне о ней в комментариях. Так же если у вас появился вопрос, оставляйте его так же в комментарии. Если вам понравилась эта статья, то ставьте лайк! Обновленные файлы админки компонента вы можете скачать во вложении, они находиться внизу сразу под тегами.  

 

P.S.: Если все файлы, кроме создания таблицы в БД, скопировать в файлы фронтэнда, то есть в папку components/com_lesson, то все тоже самое будет выводиться во фронтэнде.

 

- это важный этап в раскрутке вашего сайта. Качественная поисковая оптимизация принесет на ваш сайт много трафика, а так же поспособствует повышению пузомериков сайта. Больше об этом вы сможете узнать на сайте seouniver.ru

 

Спасибо за внимание!!! С уважением Остапенко Илья.

Оцените материал
(3 голосов)
 

Комментарии   

 
aga
0 # aga 11.12.2012 02:07
Так а подскажите, как вывести потом информацию из админки собственно на сайт, вместо текста "Если меня видно, значит компонент работает!!!"
Ответить | Ответить с цитатой | Цитировать
 
 
Остапенко Илья
0 # Остапенко Илья 11.12.2012 19:01
По большему счету все точно так же, только классы другие. Хорошо, в ближайшее время обязательно напишу, а вы пока подпишитесь на обновления чтобы не пропустить.
Ответить | Ответить с цитатой | Цитировать
 
 
Остапенко Илья
+1 # Остапенко Илья 12.12.2012 22:38
Хммм.... сейчас посмотрел и понял, что если все то, что написано тут скопировать, в папку components/com_ lesson тогда все тоже самое будет отображаться в фронтэнде(польз овательской части), даже классы не надо менять. За сим, не вижу смысла писать отдельную статью, если вам что-то не понятно могу отдельно прокомментирова ть некоторые моменты.

Сейчас даже сделаю об этом пометку в статье.
Ответить | Ответить с цитатой | Цитировать
 
 
Sem
0 # Sem 20.12.2012 17:04
я думаю было бы очень правильно добавить к твоему компоненту,хотя бы, постраничный вывод, а то уж если подключают БД то чаще всего не маленькую, соответственно представьте сколько будет занимать времени вывод компонента в той же админке, да и какую нагрузку он будет давать на систему)
Ответить | Ответить с цитатой | Цитировать
 
 
Остапенко Илья
0 # Остапенко Илья 25.12.2012 00:28
Как только разберусь в этом, обязательно напишу.
Ответить | Ответить с цитатой | Цитировать
 
Добавить комментарий


Защитный код
Обновить