Собирались заняться контроллером. Им и займёмся. Стоит четыре задачи, сохранение, удаление, редактирование, опубликование.
Это пока. Начнём с редактирования.
Кнопка "изменить" у нас есть, но не работают чекбоксы. А не работают из за ошибки. Открываем default.php находим
<th width="20px">
<input type="checkbox" name="toggle" value=""onclick="checkAll(<?php echo count( $cat ); ?>);" />
</th>
и <?php echo count( $cat ); ?> переписываем в <?php echo count( $this->cat ); ?>. Чекбоксы заработали.
Отмечаем чекбокс, нажимаем и происходит черт знает что. Вылетаем в начало компонента. А ничего, кроме перезагрузки страницы происходить не должно. Вот оно - методы get и post в файле входа нам аукнулись. Идем в simplecatalog.php и из строки
If ($cont = Jrequest::getVar('controller','','get')){
убираем этот get вообще, то есть так
If ($cont = Jrequest::getVar('controller','')){
во теперь вроде нормально.
Кнопка Edit по умолчанию отправляет в контроллер пару task=>edit. Поэтому переходим в контроллер и секцию _construct
пишем так:
function __construct()
{
parent::__construct();
$this->registerTask( 'edit' , 'editCats' );
}
Регистрируем нашу команду task, первый параметр это собственно команда от кнопки, второй имя функции (метода) в нашем контроллере которая эту команду будет исполнять. Я назвал её editCats можно как то и по другому.
Раз у нас редактирование, то это связано с изменением БД, а за это отвечает модель. Поэтому файл модели /models/categoryes.php и пишем функцию сохранения:
function store()
{
$row =& $this->getTable();
$data = JRequest::get( 'post' );
// Bind the form fields to the hello table
if (!$row->bind($data)) {
$this->setError($this->_db->getErrorMsg());
return false;
}
// Make sure the hello record is valid
if (!$row->check()) {
$this->setError($this->_db->getErrorMsg());
return false;
}
// Store the web link table to the database
if (!$row->store()) {
$this->setError( $row->getErrorMsg() );
return false;
}
return true;
}
Основано на функциях API joomla смотрим там и взято из знаменитого com_hello.
Функция сохранения изменений и ни одного SQL запроса UPDATE. Это потому, что за нас его сделает класс JTаble.
Переходим в /tables/categoryes.php и пишем:
<?php
class TableCategoryes extends JTable
{
/** @var int Primary key */
var $id = null;
/** @var int */
var $parent_id = null;
/** @var string The menu title for the category (a short name)*/
var $title = null;
/** @var string The full name for the category*/
var $name = null;
/** @var string The the alias for the category*/
var $alias = null;
/** @var string */
var $image = null;
/** @var string */
var $section = null;
/** @var int */
var $image_position = null;
/** @var string */
var $description = null;
/** @var boolean */
var $published = null;
/** @var boolean */
var $checked_out = 0;
/** @var time */
var $checked_out_time = 0;
/** @var int */
var $ordering = null;
/** @var int */
var $access = null;
/** @var string */
var $params = null;
/**
* @param database A database connector object
*/
function __construct( &$db )
{
parent::__construct( '#__simplecatalog_categoryes', 'id', $db );
}
}
?>
Скопировано из родного файла Joomla и отредактировано. Пока устраивает.
Вообще то редактирование осуществляется в открывающейся форме. Поэтому ее как минимум сделать нужно. Делаем. В каталоге views/tmpl cоздаем файл form.php и пишем:
<?php defined('_JEXEC') or die('Restricted access'); ?>
<form action="index.php" method="post" name="adminForm" id="adminForm">
<div class="col100">
<fieldset class="adminform">
<legend><?php echo JText::_( 'Title' ); ?></legend>
<table class="admintable">
<tr>
<td width="100" align="right" class="key">
<label for="greeting">
<?php echo JText::_( 'Description' ); ?>:
</label>
</td>
<td>
<input class="text_area" type="text" name="Title" id="greeting" size="32" maxlength="250" value="" />
</td>
</tr>
</table>
</fieldset>
</div>
<div class="clr"></div>
<input type="hidden" name="option" value="com_simplecatalog" />
<input type="hidden" name="id" value="" />
<input type="hidden" name="task" value="" />
<input type="hidden" name="controller" value="categoryes" />
</form>
Взято из того-же компонента com_hello4 и нeмного отредактирвано.
И так, задача написать в контроллере такую функцию которая, пока хотя бы, подгружала нашу форму. Нажата кнопка Edit загружается форма. Пишем:
function editCats()
{
$view = $this->getView('categoryes','html');
$view->display('form');
}
Нажимаем Edit? ничего не происходит.
Изменим наше представление (view.html.php)
function display (tpl=null) сделаем так, а parent::display($tpl) так.
Пробуем.
Не работает. Идем в файл simplecatalog.php и сроку controller->execute( 'task');
заменяем на:
$task=JRequest::getCmd('task', 'display');
$controller->execute( $task);
Забыли блин.
Нажимаем Edit снова.
Упс. Ругается. Файл form_default не найден. Мы не гордые переименуем. Переименовываем файл form.php в form_default.php. Загружается. И не надо заморачиваться со всякими loadTemplate.
Самое начало шаблона формы напишем так:
<?php defined('_JEXEC') or die('Restricted access');
JToolBarHelper::save();
JToolBarHelper::apply();
JToolBarHelper:: cancel();
?>
Неудобно через браузер возвращаться, поэтому сначала обработаем кнопку Cancel. В контроллере напишем:
$this->registerTask( 'cancel' , 'cancel' );/*это рядом с аналогичной строкой*/
А это в теле класса
function Cancel()
{
$this->setRedirect('index.php?option=com_simplecatalog&controller=categoryes');
}
Сообщение об отмене операции позже напишем, сейчас только мешать будет. Занесем в Task list, чтобы не забыть.
Вернемся к Edit.
Форма у нас предназначена для отображения единичной записи, а функции для ее извлечения в модели нет, возвращаемся в модель и пишем:
В секции var
var $_category; //на всякий случай, вдруг понадобиться
Метод класса модели:
function getCategory()
{
/* Загружает данные категории если они еще не загружены в виде stdClass-ов*/
if (!$this->_category)
{
$db =& $this->getDBO();
$query = "SELECT * FROM ".$db->nameQuote('#__simplecatalog_categoryes').
" WHERE ".$db->nameQuote('id')." = ".$this->_id ;
$db->setQuery($query);
$this->_category = $db->loadObject();
}
// выдаем данные как результат функции
return $this->_category;
}
Переходим в контроллер в CatsEdit выше display(‘form’) пишем.
$model=$this->getModel();
$category = $model->getCategory();
$view->assignRef('ct', $category);
И ловим нашу ct в шаблоне формы, строку:
<input class="text_area" type="text" name="Title" id="greeting" size="32" maxlength="250" value="" />
Переписываем так:
<input class="text_area" type="text" name="Title" id="greeting" size="32" maxlength="250" value="<?php echo $this->ct->title;?>" />
Отмечаем в чекбоксе категорию, жмем Edit, отображается именно та строка. Должна по крайней мере.
Вот так в контроллере можно написать практически новое представление. MVC не соответствует, но мне показалось рациональнее, чем создавать новые контроллеры, представления и пр. Впрочем наверное есть другие решения.
По принципу <?php echo $this->ct->имя поля БД;?> можно вывести все данные для редактирования.
Вызов редактора.
Поле description в HTML-овском textarea редактировать не очень удобно поэтому вызовем редактор.
В вверху (где кнопочки прописаны) шаблона формы пишем:
$editor = &JFactory::getEditor();
А там где поля выводятся, в нужном месте (в каком считаете нужным) вставляем:
<tr>
<td width="100" align="right" class="key">
<label for="greeting">
<?php echo JText::_( 'Description' ); ?>:
</label>
</td>
<td>
<?php
// parameters : areaname, content, width, height, cols, rows
echo $editor->display( 'description', $this->ct->description , '100%', '550', '75', '20') ;?>
</td>
</tr>
Подумал будем ли вставлять картинки, разрыв страницы, разделять на вступительный и полный текст. Потом глянул на таблицу, подумал о назначении этой фигни и решил что нет, кнопки разрыва страницы, вставки картинки и пр. нам не нужны. А потому перепишем.
echo $editor->display( 'description', $this->cat->description , '100%', '550', '75', '20', false) ;?>
Вывод на редактирование у нас получился. Как сохрянять отредактирвоанное немного позже.