Первым делом мы должны создать шаблон формы.
/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 игнорирует в запросах вставки. Итак, использовать класс для сохранения информации мне понравилось =) Шаги закончены, осталось жуткое послевкусие писанины и ощущение того, что везде всё написано бездарно. Не огорчайся читатель, просто не обращай внимания =)
На самом деле много тем остались не раскрытыми, однако основы освоены. Трубы горят, нужно двигаться быстрее.. Пока некоторые темы отложим до лучших времен
Спасибо за статьи - помог разобрать в модели MVC в Джумле, оказалось, что всё сложно только на первый взгляд :)
ОтветитьУдалить