понедельник, 25 октября 2010 г.

Создадим самый простой компонент. Часть 4. Заключительная

Вот мы и подошли к концу создания самого простого компонента). Неожиданно, но всё это дело растянулось на 4 части.. хм.. Могло бы и на 5, если быть честным =)) Ну что же, мы имеем компонент, который выводит строки из БД. Осталось сделать только, чтобы эти самые строки мы могли добавлять из пользовательского интерфейса. Не будем делать админскую часть, возможность удаления, редактирования. Сроки жмут =)) Начнём

Первым делом мы должны создать шаблон формы.
/components/com_counter/views/counter/tmpl/default_form.php

<? defined('_JEXEC') or die('доступ запрещен'); ?>
<form method="post" action="index.php?option=com_counter&task=add">
ADD; <input type="text" name="new_comment" />
<input type="submit"  />
</form>
Простенький шаблон. Обычная форма. ссылка index.php?option=com_counter&task=add означает, что мы передаём нашему компоненту данные с заданием add...

Теперь в зависимости от того, авторизован пользователь или нет мы должны показать эту форму или наоборот
Изменим немного представление
/components/com_counter/views/counter/view.html.php

<?php
defined('_JEXEC') or die();
jimport( 'joomla.application.component.view');
class CounterViewCounter extends JView
{
function display ($tpl = null)
{
$user = &JFactory::getUser(); //получаем данные текущего пользователя
$model = &$this->getModel();
$rows = $model->getComments();
foreach($rows as $list)
{
$this->assignRef('username', $model->getUserName($list->user_id));
$this->assignRef('list', $list);
parent::display($tpl);
}
if(!$user->guest) parent::display('form'); // если пользователь не гость, то показать шаблон form
}
}
?>

В представление добавилось всего две строчки. Следует заметить, что когда мы передаём методу parent::display('xxx'); какое-то название, то joomla будет искать шаблон в папке tml(которая находится в той же папке, что и представление), но будет искать не xxx.php, а default_xxx.php

Сейчас мы можем взглянуть на компонент и увидеть, что форма и вправду выводится или нет в зависимости от "авторизованности" пользователя.

Чтобы компонент и вправду был завершен, нам нужно в контроллере реализовать функцию add
/component/com_counter/controller.php


<?
defined('_JEXEC') or die();
jimport('joomla.application.component.controller');

class CounterController extends JController
{
function __construct()
{
parent::__construct();
$this->registerTask('add','add');
$this->registerTask('show','show');
}
function add()
{
$user = &JFactory::getUser();
if(!$user->guest)
{
JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_counter'.DS.'tables');
$row = &JTable::getInstance('counter', 'Table');

$row->user_id = $user->id;
$row->content = JRequest::getVar('new_comment');
if (!$row->store()) {
 JError::raiseError(500, $row->getError());
}
} else echo "Forbidden";
$this->show();
}
function show()
{
parent::display();
}
function display()
{
parent::display();
}
}
?>

Рассмотрим метод add(). Для начала мы проверяем авторизован ли пользователь. Если авторизован, то позволяем ему добавить комментарий. Методы сохранения данных в таблицу могут быть различны, но хотелось испробовать недавно выученный JTable. в шаге 2 мы создавали класс нашей таблицы, который расширял JTable. в этом шаге я решил его использовать. Все известные переменные мы заполнили инфой. Переменные, которые остались установлены в null JTable игнорирует в запросах вставки. Итак, использовать класс для сохранения информации мне понравилось =) Шаги закончены, осталось жуткое послевкусие писанины и ощущение того, что везде всё написано бездарно. Не огорчайся читатель, просто не обращай внимания =)

На самом деле много тем остались не раскрытыми, однако основы освоены. Трубы горят, нужно двигаться быстрее.. Пока некоторые темы отложим до лучших времен

Создадим самый простой компонент. Часть 4. Заключительная

1 комментарий:

  1. Спасибо за статьи - помог разобрать в модели MVC в Джумле, оказалось, что всё сложно только на первый взгляд :)

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