Суть проблемы, не получается полноценно вывести все дерево целиком со всеми вложенностями.
Решил проблему так: (собираем глобальный массив всех категорий)
Код: Выделить всё
// список id категорий
$category_id = array(1,2,3,4);
// общий массив для вывода
$categories = array();
foreach($category_id as $id)
{
$categories_data = $this->findAll(array('condition'=>'root='.$id,'order'=>'lft'));
$categories = array_merge($categories,$categories_data);
}
$level=0;
// вывод списком
Код: Выделить всё
foreach($categories as $n=>$category)
{
if($category->level==$level)
echo CHtml::closeTag('li')."\n";
else if($category->level>$level)
echo CHtml::openTag('ul')."\n";
else
{
echo CHtml::closeTag('li')."\n";
for($i=$level-$category->level;$i;$i--)
{
echo CHtml::closeTag('ul')."\n";
echo CHtml::closeTag('li')."\n";
}
}
echo CHtml::openTag('li');
echo CHtml::encode($category->name);
$level=$category->level;
}
for($i=$level;$i;$i--)
{
echo CHtml::closeTag('li')."\n";
echo CHtml::closeTag('ul')."\n";
}
// вывод выпадающим списком
Код: Выделить всё
echo'<select>'."\n";
foreach($categories as $n=>$category)
{
if($category->level==$level)
{
// echo CHtml::closeTag('1option')."\n";
}
else if($category->level>$level);
else
{
//echo CHtml::closeTag('2option')."\n";
for($i=$level-$category->level;$i;$i--)
{
}
}
echo CHtml::openTag('option');
$level=$category->level;
for($i=0;$i<$level;$i++)
{
echo '- ';
}
echo CHtml::encode($category->name);
echo CHtml::closeTag('option')."\n";
}
for($i=$level;$i;$i--)
{
// echo CHtml::closeTag('3option')."\n";
}
echo '</select>';
Все работает отлично. И при этом хотелось бы узнать, как можно отойти от array_marge и вывести все дерево полноценно ?
П.С. на 1500 записей вывод производится за 1 секунду. Вроде многовато.