Нужна помощь в древовидном меню. Не могу найти ошибку

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Нужна помощь в древовидном меню. Не могу найти ошибку

Сообщение espltdmh50 »

Всем доброго дня! Нужна ваша помощь. Не могу отыскать где неверная логика. Сделал древовидное меню. Пока вылазит 4 пункта из базы. Дочерние пункты у меня скрыты (раскрываются при нажатии на пункт. Это работает). В дочерних пунктах я могу перейти по формирующимся ссылкам, а вот по родительскому пункту у которого не вложено дочерок не могу. Не втыкаю как написать, чтобы переходило еще и на род.элементы у которых не вложены дочерки... Заранее,спасибо.

Код: Выделить всё


/** все пункты (раздел услуги) */
    public function allPunkt()
    {       
        $rows = (new \yii\db\Query())
        ->select('uslugi_id, title, parent_id')
        ->from('uslugi')
        ->all();
        
        $res = [];
                
        foreach($rows as $item){               
            $res[ $item['parent_id'] ][] = $item;               
        }            
        return $res;            
    }
	

	
	/** построение дерева */
    function outTree($parent_id, $level)
    {
        if( isset($this->_category_arr[$parent_id]) ) { //Если категория с таким parent_id существует 

			echo '<ul class="mainHome">';
			
			foreach ($this->_category_arr[$parent_id] as $value) { //Обходим ее 
								
				if( $this->_category_arr[$parent_id][0]['parent_id'] == 0 ){
					$url = '#';
					$parametr = 'return false;';					
				}elseif($this->_category_arr[$parent_id][0]['parent_id'] != 0){
					$url = "/uslugi/big/?id=".$value['uslugi_id'];
					$parametr = '';
				}
				
				echo '<a href="'.$url.'" onclick="'.$parametr.'" data-toggle="collapse" data-target="#'.$value['uslugi_id'].'"><li>'.$value['title'].'</li></a>';
				
				$level++; //Увеличиваем уровень вложености 
				
				echo '<div id="'.$value['uslugi_id'].'" class="collapse out" style="padding:0;">';
					$this->outTree($value['uslugi_id'], $level); 
				echo '</div>';
				
                $level--; //Уменьшаем уровень вложености 
            } 

			echo '</ul>';
        }     
    } 

espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Нужна помощь в древовидном меню. Не могу найти ошибку

Сообщение espltdmh50 »

Кто нибудь может помочь в решении проблемы:?
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Нужна помощь в древовидном меню. Не могу найти ошибку

Сообщение espltdmh50 »

неужели никто не делал древовидное раздвижное меню?
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Нужна помощь в древовидном меню. Не могу найти ошибку

Сообщение espltdmh50 »

как осуществить переход по родительским пунктам в которых нет дочерок?
Аватара пользователя
Diplodok
Сообщения: 76
Зарегистрирован: 2012.07.09, 15:55
Контактная информация:

Re: Нужна помощь в древовидном меню. Не могу найти ошибку

Сообщение Diplodok »

Если я правильно понял, то перед foreach надо проверку сделать, чтобы понять есть ли дочерние пункты

Код: Выделить всё

if(count($this->_category_arr[$parent_id]) == 0) {
    // здесь создается ссылка в родительский элемент
}
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Нужна помощь в древовидном меню. Не могу найти ошибку

Сообщение espltdmh50 »

вряд ли, ведь вложенность элементов ведь в цикле надо проверить, а не за рамками цикла. Ну хотя попробую, может и получится. Была еще идея сделать в базе отдельное поле и тупо еще проверку замутить что если например это поле заполнено, то в данном пункте нет дочерок тогда генерим ссылку, а если не заполнено, тогда у ссылки ставим href="#" и вешаем toogle. как-то так. попробую и так и так. спасибо за отклик
Аватара пользователя
Diplodok
Сообщения: 76
Зарегистрирован: 2012.07.09, 15:55
Контактная информация:

Re: Нужна помощь в древовидном меню. Не могу найти ошибку

Сообщение Diplodok »

Так в цикле гоняются дочерние пункты? Если, да то и проверить надо есть ли что гонять, и если нечего, то создавать ссылку.
А вот эта примочка не подойдет?
https://github.com/kartik-v/yii2-tree-manager
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Нужна помощь в древовидном меню. Не могу найти ошибку

Сообщение espltdmh50 »

В моем примере в цикле гоняется все как родители, так и дочерки... В общем не стал париться, просто сделал отдельное поле в бд и повесил кнопку on/off. При нажатии на кнопку в скрытое поле проставляется параметр, который меняет в атрибуте href значение, при on - ставится # и toogle, а при off генерится ссылка... Пока такой вариант меня устроит, потом пойму по ходу как оно...
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Нужна помощь в древовидном меню. Не могу найти ошибку

Сообщение proctoleha »

Если у вас не стописят миллионов ссылок, то изучить и использовать поведение nested sets, и забыть про parent_id как страшный сон.

Если у вас стописят миллионов ссылок, то думать, и всё равно забыть про parent_id как страшный сон.

Имхо, у вас неверная изначальная логика для формирования данных для построения дерева. Всё давно придумано до нас.
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Нужна помощь в древовидном меню. Не могу найти ошибку

Сообщение Dominus »

Используйте NestedSetsBehavior

С ним построение дерева будет выглядеть так:

Код: Выделить всё

    /**
     * Получаем категории
     */
    public function getCategories()
    {
        $model = new BlogCategory();
        $query = $model->find()
            ->where(['status' => self::STATUS_PUBLISH])
            ->andWhere('depth > 0')
            ->orderBy(['lft' => SORT_ASC])
            ->all();
        return $query ? $query : null;
    }
    
    /**
     * Строим дерево
     */
    public function getRenderTree()
    {
        $array = [];
        if ($query = self::getCategories()) {
            $depth = 1;
            $i = 0;
            foreach ($query as $n => $category) {
                if ($category->depth == $depth) {
                    $array[] = $i ? Html::endTag('li') . "\n" : '';
                } else if ($category->depth > $depth) {
                    $array[] = Html::beginTag('ul') . "\n";
                } else {
                    $array[] = Html::endTag('li') . "\n";
                    for ($i = $depth - $category->depth; $i; $i--) {
                        $array[] = Html::endTag('ul') . "\n";
                        $array[] = Html::endTag('li') . "\n";
                    }
                }
                $array[] = Html::beginTag('li') . "\n";
                $array[] = Html::encode($category->name) . "\n";
                $depth = $category->depth;
                $i++;
            }
            for ($i = $depth; $i; $i--) {
                $array[] = Html::endTag('li') . "\n";
                $array[] = Html::endTag('ul') . "\n";
            }
        }
        return $array;
    }
    
Что касается раздвижного меню, то вот пример двух виджетов, вырезал из одного из своих проектов.
https://github.com/Dominus77/yii2-tree-menu-example
Можно переделать для своего проекта.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Ответить