Answer the question
In order to leave comments, you need to log in
Yii2 Widgets - how to remove duplicate parent menu category?
Hello!
I have a problem with Yii2. I learned how to work with the basic part, but it’s a real problem with widgets, I don’t understand them, help me out!
There is a widget:
class MenuWidget extends Widget{
public $tpl;
public $model;
public $data;
public $tree;
public $menuHtml;
public function init(){
parent::init();
if( $this->tpl === null ){
$this->tpl = 'menu';
}
$this->tpl .= '.php';
}
public function run(){
// get cache
if($this->tpl == 'menu.php'){
$menu = Yii::$app->cache->get('menu');
if($menu) return $menu;
}
$this->data = Category::find()->indexBy('id')->asArray()->all();
$this->tree = $this->getTree();
$this->menuHtml = $this->getMenuHtml($this->tree);
// set cache
if($this->tpl == 'menu.php'){
Yii::$app->cache->set('menu', $this->menuHtml, 60);
}
return $this->menuHtml;
}
protected function getTree(){
$tree = [];
foreach ($this->data as $id=>&$node) {
if (!$node['parent_id'])
$tree[$id] = &$node;
else
$this->data[$node['parent_id']]['childs'][$node['id']] = &$node;
}
return $tree;
}
protected function getMenuHtml($tree, $tab = ''){
$str = '';
foreach ($tree as $category) {
$str .= $this->catToTemplate($category, $tab);
}
return $str;
}
protected function catToTemplate($category, $tab){
ob_start();
include __DIR__ . '/menu_tpl/' . $this->tpl;
return ob_get_clean();
}
}
<li class="group-item">
<a href="<?= \yii\helpers\Url::to(['category/view', 'id' => $category['id'], 'slug' => $category['slug']]) ?>">
<?= $category['name']?>
</a>
<?php if( isset($category['childs']) ): ?>
<div class="group-tree-icon expand"></div>
<ul class="sub-groups-list">
<?= $this->getMenuHtml(($category['childs']))?>
</ul>
<?php endif;?>
</li>
<?= $this->getMenuHtml(($category['childs']))?>
I don't know how to make another code for subcategories, everything is duplicated from the parent. Save Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question