Добавление данных в базу данных

Дата Автор 

 

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

Добавление данных в базу данных

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

 

Создание тулбара

 

Для начала, как я уже говорил, мы будем создавать тулбар, который будет содержать название компонента и кнопку добавления задания.  Для начала нам необходимо изменить файл отображения данных нашего вида. Следовательно, идем в папку views/название вида/tml/ (views/adm/tmpl) и добавляем в файл default.php следующие строчки:

 

JToolBarHelper::title(JText::_(‘Создание задания’), 'generic.png');

 JToolBarHelper::addNew();

 

Данные строчки нужно разместить сразу же после defined('_JEXEC') or die('Restricted access') но чтобы они были до закрывающего php тега ?>. Что значат эти строчки? Ну, те, кто уже смекнул, догадались, что первая будет выводить в тулбаре надпись «Создание задания» и рядом будет картинка. Вторая будет отображать с правой стороны тулбара кнопку «создать».

 

Теперь в админке компонента появился заголовок и кнопка «создать», но пока что толку от кнопки нет никакого, так как при нажатии на неё ничего не происходит. Сейчас мы это исправим. За каждой кнопкой должна быть закреплена задача, которую будет выполнять контроллер. Но чтобы кнопка работала, нужно чтобы в коде присутствовала скрытая строка

 

<input type="hidden" name="task" value="" />

 

Поместите её в том же файле default.php, где-нибудь в самом конце. Об этой строчке я расскажу немного позже.

 

Сейчас нам нужно задать функцию для кнопки «создать». Эта функция будет вызывать страничку для добавления задания. Поэтому открываем наш контроллер, controller.php который находиться в корне папки нашего компонента, и добавляем его в него новую функцию add. Расположите её до функции display.

 

public function add()

{

                JRequest::setVar('view', 'create');

                $this->display();

}

 

Код функции add говорит о том, будет вызываться вид create, а потом вызывается функция display для отображения вида. Но при нажатии на кнопку «создать», опять ничего не произойдет. Все потому, что я забыл в прошлом уроке добавить одну строчку в файле default.php. Давайте, это исправим:

 

<form action="index.php?option=com_lesson" method="post" name="adminForm" id="adminForm">

 

Добавьте эту строчку сразу после закрывающего php тега ?>. Данная строчка обязательна для вызова функций кнопок тулбара.

 

Теперь если мы нажмем на кнопку «создать» у нас выскочит ошибка 500, которая будет сообщать нам, что не нашла вид create.

 

Создание вида create

 

Переходим в папку views и создаем папку create. Ну и давайте сразу создадим все файлы вида, чтобы потом их просто редактировать. В папке create создаем папку tmpl и файл view.html.php, а в папке tmpl создаем файл default.php. Теперь давайте откроем файл view.html.php и добавим в него следующий код:

 

<?php

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

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

class LessonViewCreate extends Jview

{

}

 

Тут удивляться собственно нечему. Данный файл нужен нам для объявления класса, не больше, так как каких-то особых функций в добавлении задания нет. Следовательно, теперь переходим к файлу вывода данных default.php. Его код будет выглядеть так:

<?php
defined('_JEXEC') or die('Restricted access');
JToolBarHelper::save();
JToolBarHelper::cancel();
?>

<form action="index.php?option=com_lesson" method="post" name="adminForm" id="adminForm">
  <fieldset class="adminform">
    <legend>Создание урока</legend>
      <table class="admintable">
        <tr>
          <tr>
            <td width="100" class="key">Название урока:</td>
              <td>
                <input class="text_area" type="text" name="name" id="name" size="50" maxlength="50" value="<?php echo $this->row->name; ?>" /> 
              </td>
            </tr>
          <tr>
            <td width="100" class="key">Текст задания:</td>
              <td>
               <textarea type="text" name="text" id="text" cols="80" rows="10" value="<?php echo $this->row->text; ?>" /></textarea>
              </td>
          </tr>
          <tr>
           <td width="100" class="key">Ответ:</td>
             <td>
               <input class="text_area" type="text" name="ansver" id="ansver" size="17" maxlength="17" value="<?php echo $this->row->ansver; ?>" />
             </td>
          </tr>

   </table>
</fieldset>

<input type="hidden" name="task" value="" />
<?php echo JHTML::_('form.token'); ?>
</form>

 

Здесь опять в основном html, который должен быть вам понятен. Отдельно хочу обратить ваше внимание на подключение кнопок «сохранить» и «отменить». Они как вы уже наверно догадались, вызываются этими строчками

 

JToolBarHelper::save();

JToolBarHelper::cancel();

 

Так же обязательно присваивайте параметру «name» в тегах <input> и <textarea> название ячейки таблицы. Параметр name предназначен для того, чтобы обработчик формы смог идентифицировать имя поля (в данном случае name) К примеру:

 

<input class="text_area" type="text" name="name" id="name" size="50" maxlength="50" value="<?php echo $this->row->name; ?>" />

 

Этой строке мы с помощью php присваиваем ячейку name, следовательно, имя поля параметра name в теге input должно быть name. Если вы оставите параметр name пустым или напишете в нем что-нибудь другое, то данные, которые вы напишете в поле «Названия» не передадутся в базу данных.

 

Строчка <input type="hidden" name="task" value="" />, как мы уже знаем нужна для правильной работы кнопок на тулбаре, а вот <?php echo JHTML::_('form.token'); ?> для нас новая строка и сейчас я опишу её поподробнее. Токен позволяет защититься от повторяющихся атак (CSRF атак). На примере это будет выглядеть так:  для пользователя создается сессия, в которой будет ряд случайных чисел, который при обновлении страницы будет меняться. В итоге пользователь не сможет отправить запрос дважды с одной страницы.

 

Теперь нам все должно быть понятно, а при нажатии на кнопку «Создать», должна появляться форма для заполнения задания. Но кнопка сохранения работать не будет, так как, нам уже известно, что для её работы нужно прописать функцию в контроллере. Так же для добавления данных в базу данных, нам понадобиться изменить модель. Давайте начнем с контроллера. Сразу после функции add добавьте следующий код:

 

public function save()

{

                JRequest::checkToken() or jexit('Invalid Token');

                $data = JRequest::get('post');

               

                $model = $this->getModel('lesson');

                if ($model->save($data))

                {

                               $message = JText::_('Задание сохранено');

                } 

                else

                {

                               $message = JText::_('Произошла ошибка');

                               $message .= ' ['.$model->getError().']'; // получаем ошибку из модели

                }

                $this->setRedirect('index.php?option=com_lesson', $message);

}

 

Тут в принципе все предельно просто и сейчас я вам все расскажу.

 

 

JRequest::checkToken() or jexit('Invalid Token');

 

 

Этой строчкой мы проверяем токен. Как я и писал выше, не получиться отправить данные дважды с одной и той же страницы.

 

$data = JRequest::get('post');

 

Получаем данные, которые мы ввели в форму добавления задания.

 

$model = $this->getModel('lesson');

 

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

 

if ($model->save($data))

                {

                               $message = JText::_('Задание сохранено');

                } 

                else

                {

                               $message = JText::_('Произошла ошибка');

                               $message .= ' ['.$model->getError().']'; // получаем ошибку из модели

                }

 

Как видно из кода, если сохранение прошло успешно, тогда выведется фраза из переменной $message «Задание сохранено». Иначе, из этой же переменной выведется фраза «Произошла ошибка», а так же получим информацию об ошибке из модели.

 

this->setRedirect('index.php?option=com_lesson', $message);

 

Ну и естественно перенаправление на главную страницу компонента, в которой вы увидите только что сохраненные данные, если конечно все прошло успешно.

 

Код функции Save в контроллере мы рассмотрели, теперь давайте перейдем к модели, в которой и будет происходить добавление данных в базу данных. Открываем папку models и редактируем в ней файл название компонента.php (в моем случае lesson.php). Добавляем в него ниже приведенный код после функции getTeach()

 

public function save($data)

{

                $table = $this->getTable();

                if (!$table->bind($data))

                {

                               $this->setError($table->getError());

                               return false;

                }

                if ($table->check($data))

                {

                               if (!$table->store($data))

                               {

                                               $this->setError($table->getError());

                                               return false;

                               }

                }

                else

                {

                               $this->setError($table->getError());

                               return false;

                }

                return true;

}

 

Давайте я сразу приступлю к комментариям кода.

 

$table = $this->getTable();

 

Соединяемся с таблицей нашего компонента.

 

if (!$table->bind($data))

 

Привязываем поля формы к таблице.

 

$this->setError($table->getError());

return false;

 

Если нам это не удастся, то выведется сообщение об ошибке и возвращаемся на главную страницу компонента.

 

if ($table->check($data))

 

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

 

if (!$table->store($data))

 

Если данные прошли проверку (а в нашем случае они её точно пройдут), тогда выполняется условие сохранения данных.

 

$this->setError($table->getError());

return false;

 

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

 

return false;

 

Если все операции прошли успешно, тогда мы перенаправляемся на главную страницу компонента и увидим сохраненные данные.

 

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

 

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

 

 

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

 

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

Комментарии   

 
Алексей
0 # 26.09.2012 18:33
Илья, объясните, пожалуйста, поподробнее, как работает public function save($data)...

Смотря на код, я вижу условие - если да, то ошибка потом

условие - если да, то ошибка; иначе - тоже ошибка...
То есть в любом случае ошибка и return false;

Наверное глупый вопрос с моей стороны ввиду непонимания, но именно понять и хочется)
Ответить | Ответить с цитатой | Цитировать
 
 
Остапенко Илья
0 # Остапенко Илья 26.09.2012 20:43
Нет, вы не правильно понимаете. С первым условием все надеюсь понятно, перейдем ко второму. Если это условие if ($table->check( $data)) не выполнено, тогда получаем код ошибки после else. Если же условие выполнено, тогда идет условие сохранения if (!$table->store ($data)), если это условие не выполнено, тогда выводиться ошибка, которая записана в фигурных скобках после него, а если выполнено, тогда получаем функцию return true;

Как я заметил, в условии появляеться else только тогда, когда после выполнения условия, должно ещё что-то выполняться. Но это опять же только мои соображения, не знаю на сколько они верны.
Ответить | Ответить с цитатой | Цитировать
 
 
Psyhos
0 # 12.12.2012 14:51
Начинаю учться писать компоненты по вашему методу. Вроде бы что-то начинает проясняться в этой joomla - cпасибо за материал!
Ответить | Ответить с цитатой | Цитировать
 
 
Остапенко Илья
0 # Остапенко Илья 12.12.2012 22:50
Всегда пожалуйста, очень рад что вам помогли мои статьи))))
Ответить | Ответить с цитатой | Цитировать
 
 
Роман
0 # 30.01.2013 23:46
Доброго времени суток.
А как использовать JToolBarHelper во фронтенде
Ответить | Ответить с цитатой | Цитировать
 
 
Остапенко Илья
0 # Остапенко Илья 31.01.2013 06:40
Здравствуйте. JToolBarHelper во фронтенде, вы никак не сможете использовать, так как он доступен, только в админке(бэкэнде ). Если вам нужна функция добавления, тогда просто в основном файле вида добавьте кнопку , которая так же будет вызывать другой вид, который вы создадите и в котором будет практически тот же код, что и в виде create в админке. Ну и естественно, нужно будет добавить соответствующие функции в модель и контроллер.

Если вы меня не поняли, то напишите мне на почтовый ящик, его вы сможете найти на страничке "Об авторе" и я вам подробно всё объясню.
Ответить | Ответить с цитатой | Цитировать
 
 
Александр
0 # Александр 20.02.2013 15:56
Доброго времени суток!
Пример конечно не акти.
1. Наименование таблицы в БД совпадает с наименованием проекта. Попробуй таблицу назвать скажем sampl и посмотри что получится. У меня - ошибка: "Table lesson not supported. File not found." Очень прошу напиши как исправить эту ошибку

2. В реальной жизни используется 2 и более таблиц в базе данных.
Ответить | Ответить с цитатой | Цитировать
 
 
Остапенко Илья
+1 # Остапенко Илья 20.02.2013 16:58
Здравствуйте! Я конечно может вас неправильно понял, но вам не понравился мой пример? Ну найдите в интернете лучше =)

1. Где вы видели хоть один компонент, у которого нет БД с названием компонента? Назови свой компонент sampl сделай все классы sampl и будет тебе счастье. Вот если я переименую БД, то мне выводиться "Пока уроков нет"

2. Я это прекрасно знаю, но суть моих уроков не научить вас делать профессиональны е компоненты, а дать понятия основ. Опять же, не нравиться, в интернете много статей на английском языке, про создание компонента. Дерзайте.
Ответить | Ответить с цитатой | Цитировать
 
Добавить комментарий


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