И так дерево. Вот что, получилось. Взял рекурсивную функцию построения дерева из сети. Хм. Сейчас поискал где взял и не нашел. Да ладно, дальше.
После небольшой переделки она приняла такой вид:
(в models/categoryes.php добавим)
function getTree($tree = array(), $parentID = 0, $level=0)
{
$q1 = array();
$q = $this->_allcategoryes;//вот и понадобилась
if (!$q) return false;
for ($i=0, $n=count( $q ); $i < $n; $i++){
If ($q[$i]->parent_id == $parentID)
$q1[] = $q[$i];
}
$level++;
for ($i=0, $n=count( $q1 ); $i < $n; $i++){
$q1[$i]->title = str_repeat (' - ', $level).$q1[$i]->title.'<br />';
$tree[] = $q1[$i];
$tree = $this->getTree($tree, $q1[$i]->id, $level);
}
return $tree;
}
Вот такое деревце. Выводим в шаблон. Но сперва подготовим к выводу. В views/categoryes/view.html.php добавим функцию.
function CTree()
{
$plist = array();
$plist = & $this->get('Allcategoryes');//инициализируем $_ allcategoryes
$tree =& $this->get('Tree');
if (!$tree) return JText::_( 'The list of categories is empty' );
$tr = array();
foreach ($tree as $tr)
{
$link = JRoute::_( 'index.php?option=com_simplecatalog&controller=categoryes&task=edit&cid[]='. $tr->id );
echo '<a href="'.$link.'" title="'.JText::_( "Edit" ).'">'.$tr->title.'</a>';
};
}
Ну и поскольку в развернутом виде это дерево как-то не смотрится, сделаем его гармошкой. В views/categoryes/tmpl/default.php в самом верху сразу после кнопочек управления добавим перед закрывающим тегом ?>:
jimport('joomla.html.pane');
$pane =& JPane::getInstance('Sliders', array('startOffset'=>1, 'allowAllClose' => true));
echo $pane->startPane('tree');
echo $pane->startPanel(JText::_( 'Tree Categories' ),'tree');
?>
<div id='tree' style="padding:20px;">
<?php
print_r ($this->CTree());
?>
</div>
<?php echo $pane->endPanel();
echo $pane->endPane();
В выпадающем списке как-то неудобно выбирать родительскую категорию не видя соподчиненности, то добавим это дерево и туда. В контроллере controllers/categoryes.php после строки :
$allcategoryes = $model->getAllcategoryes();
Добавим
$tree = $model->getTree();
А строку
foreach ($allcategoryes as $k=>$catlist)
Перепишем
foreach ($tree as $k=>$catlist)
Вот что получилось. Собрал в компонент и прикрепил к посту. Можно посмотреть. Но еще раз повторюсь.
Для админки, это не подойдет, нет защиты «от дурака». Хотя наверное вполне подойдет для frontend-a, где нет возможности редактирования категорий.
И еще. Код не причесан и возможны ошибки, все наспех, ибо сегодня время на это есть, а завтра его уже нету.
Добавим еще удаление категорий. Сегодня понадобилось.
В файле models/categoryes.php добавим функцию удаления
function delete()
{
$cids = JRequest::getVar( 'cid', array(0), 'post', 'array' );
$table =& $this->getTable();
if (count( $cids ))
{
foreach($cids as $cid) {
if (!$table->delete( $cid )) {
$this->setError( $table->getErrorMsg() );
return false;
}
}
}else{
if (empty( $cid )) {
return JError::raiseWarning( 500, JText::_( 'No items selected' ) );
}
}
return true;
}
В контроллере controllers/categoryes.php
Зарегистрируем команду, благо кнопочка удаления в шаблоне уже есть.
$this->registerTask( 'delete' , 'remove' );
Ну и сам обработчик
Function remove()
{
JRequest::checkToken() or jexit( 'Invalid Token' );
$model = $this->getModel();
if(!$model->delete()) {
$msg = JText::_( 'Error: One or More Categories Could not be removed' );
} else {
$msg = JText::_( 'Categoty(s) Deleted' );
}
$this->setRedirect( 'index.php?option=com_simplecatalog&controller=categoryes', $msg );
}
canDelete() будет позже. Кажется нашел запрет удаления не пустых категорий, но не разобрался еще.
Все пока. Но дерево в админке нужно, буду думать дальше.
[вложение удалено Администратором]