Мы вроде вложенность категорий делать хотели. Начнем.
В таблице поле parent_id уже имеется. На уровне базы данных возможность организовать вложенность категорий. т.е дальше второго уровня, уже есть. А вспомнив, что это копия родной таблицы Joomla, задаемся вопросом, почему этой возможности нет в движке. Впрочем вопрос риторический.
Еще пара отступлений. Предвижу две большие проблемы. Первая, это случай когда пользователь удаляет родительскую категорию. Что тогда будет с ее дочерними. Тут или запрет на удаление не пустой категории или каскадное удаление всего, что ниже. И вторая это случай, когда пользователь назначает категории в качестве родительской ее же дочернюю. Получится, что у нас две категории и родительская и дочерняя друг другу одновременно. Что будем с этим делать пока понятия не имею. Но будем решать проблемы по мере их поступления.
Чтобы видеть что происходит, выведем поле parent_id в нашу таблицу.
В файле view/catrgoryes/tmpl/default.php
В секции заголовков таблицы добавляем заголовок
<th style="text-align:center;">
<?php echo JHTML::_('grid.sort', 'Parent category', 'parent_id', $this->lists['order_Dir'], $this->lists['order'] );?>
</th>
И в теле таблицы поле
<td style="text-align:center;">
<?php echo $row->parent_id; ?>
</td>
Переносим поле id рядом с полем parent_id для наглядности и заменяем его заголовок на «ID». Не обязательно, но желательно.
Кстати сделаем попутно поле «номер по порядку». Для этого самым первым заголовком ставим
<th width="5">
<?php echo JText::_( '#' ); ?>
</th>
И первым полем в теле таблицы
<td style="text-align:center;">
<?php echo $this->pagination->getRowOffset( $i ); ?>
</td>
Получаем поле 'Parent category' с нулевыми значениями. Надо заполнять. А для этого в форме редактирования сделать поле с выпадающим списком категорий. Чтобы вывести список надо его из БД получить, а функция getCategoryes, как помним, выводит нам только количество категорий на страницу. Поэтому в модели (models/categoryes.php) делаем новую функцию. Назовем ее getAllcategoryes()
В секции объявления переменных пишем
И саму функцию
function getAllcategoryes()
{
If (empty($this->_allcategoryes))
{
$db = $this->getDBO();
$query = "SELECT * FROM ". $db->nameQuote('#__simcat_categories');
$this->_allcategoryes = $this->_getList($query);
}
return $this->_allcategoryes;
}
Поскольку форму мы вызывали прямо из контроллера то и данные получаем в нем же
(controllers/categoryes.php)
В функции editCats() выше $view->display('form'); добавляем
JRequest::setVar('hidemainmenu', 1);//отключение верхнего меню админки, надо было сразу сделать
$allcategoryes = $model->getAllcategoryes();//получение списка категорий
$cat_list = array();
//первая строка списка, переведем позже
$cat_list[] = JHTML::_('select.option','0', '- '.JText::_('MAIN CATEGORY').' -', 'id', 'title');
$k = 0;
//исключаем из списка саму редактируемую категорию
foreach ($allcategoryes as $k=>$catlist)
{
if (($catlist->id != $category->id))$cat_list[] = $catlist;
}
//создание самого списка
$lists['cat_list'] = JHTML::_('select.genericlist', $cat_list, 'parent_id', '', 'id', 'title', $category->parent_id);
//Передача в шаблон
$view->assignRef('categorieslist', $lists);
И получаем все это добро в шаблоне (views/categoryes/tmpl/default_form.php) ниже заголовка добавляем
<tr>
<td width="100px" align="right" class="key">
<label for="greeting">
<?php echo JText::_( 'Parent category' ); ?>:
</label>
</td>
<td>
<?php echo $this->categorieslist['cat_list']; ?>
</td>
</tr>
Упс. Функцию сохранения забыли. Делаем
В этом же файле вверху, где кнопки управления, вместо JToolBarHelper::editList(); ибо нафиг она здесь нужна, вставляем
В контроллере (controllers/categoryes.php)
Регистрируем команду save
$this->registerTask( 'save' , 'save' );
Ну и сам обработчик
function save()
{
$data = JRequest::get('POST');
$model = $this->getModel();
if ($model->store())
{
$message = JText::_('Category').' '.$data['name'].' '.JText::_('Saved');
}
else
{
$message = JText::_('Category Save Failed');
}
$this->setRedirect('index.php?option=com_simplecatalog', $message);
}
А скрытое поле
<input type="hidden" name="id" value="" />
В views/categoryes/tmpl/default_form.php
Заменим на
<input type="hidden" name="id" value="<?php echo $this->ct->id; ?>" />
Иначе будет не редактирование, а добавление.
Хм. Вот теперь здесь так и просится дерево категорий. Но это позже. Как его сделать, понятия пока не имею. Надеюсь, что следующий пост будет об этом, но это как бог даст и мозги сработают.