Реально ли создать многоуровневый список через dropDownList?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Реально ли создать многоуровневый список через dropDownList?

Сообщение dunakov »

Любопытно ,а возможно ли используя dropDownList создать список с вложненным в каждый пункт ещё списком. Т е как бы дерево.
Как реализовать это руками я знаю, но вопрос, а реально ли используя встроенное средство Yii2 dropDownList
Изучаю веб-программирование, не ругайтесь сильно)
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Реально ли создать многоуровневый список через dropDownList?

Сообщение vitalik1183 »

https://nix-tips.ru/yii2-vypadayushhij- ... nlist.html
"Групированный список" Вы это имели ввиду?
Yii2!
dunakov
Сообщения: 65
Зарегистрирован: 2018.02.19, 09:19
Откуда: Беларусь

Re: Реально ли создать многоуровневый список через dropDownList?

Сообщение dunakov »

vitalik1183 писал(а): 2018.02.26, 15:57 https://nix-tips.ru/yii2-vypadayushhij- ... nlist.html
"Групированный список" Вы это имели ввиду?
Ага.
Изучаю веб-программирование, не ругайтесь сильно)
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Реально ли создать многоуровневый список через dropDownList?

Сообщение alexa777 »

vitalik1183 писал(а): 2018.02.26, 15:57 https://nix-tips.ru/yii2-vypadayushhij- ... nlist.html
"Групированный список" Вы это имели ввиду?
Вот нашел вариант чтобы дерево пробразовать в многоуровневый массив и вывести в dropDownList, но почему то тут $child_options[$child->id] = $child->name; выводит ошибку Trying to get property of non-object
Не знаете почему?

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

 public static function getHierarchy()
     {
         $options = [];

         $parents = self::find()->where("parent_id=0")->all();

         foreach ($parents as $id => $p) {

             $children = self::find()->where('parent_id=:parent_id', ['parent_id' => $p->id])->asArray()->all();
             $child_options = [];

             foreach ($children as $child)
             {
                 $child_options[$child->id] = $child->name;
             }
             $options[$p->name] = ArrayHelper::map($children, 'id', 'name');
         }
         return $options;
     }
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Реально ли создать многоуровневый список через dropDownList?

Сообщение andku83 »

потому что получаете ->asArray()->all(), а пытаетесь обратиться как к объекту
и это не единственная ошибка в этом коде

если уж подобным способом делать то лучше вот так:

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

 public static function getHierarchy()
     {
         $options = [];

         $parents = self::find()->where("parent_id=0")->with('childs')->all();

         foreach ($parents as $id => $p) {
            
             foreach ($p->childs as $child)
             {
                 $options[$p->name][$child->id] = $child->name;
             }
             
         }
         return $options;
     }
а еще лучше получить все одним запросом и построить дерево
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Реально ли создать многоуровневый список через dropDownList?

Сообщение alexa777 »

shnir писал(а): 2018.02.26, 21:28 потому что получаете ->asArray()->all(), а пытаетесь обратиться как к объекту
и это не единственная ошибка в этом коде

если уж подобным способом делать то лучше вот так:

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

 public static function getHierarchy()
     {
         $options = [];

         $parents = self::find()->where("parent_id=0")->with('childs')->all();

         foreach ($parents as $id => $p) {
            
             foreach ($p->childs as $child)
             {
                 $options[$p->name][$child->id] = $child->name;
             }
             
         }
         return $options;
     }
а еще лучше получить все одним запросом и построить дерево
Не работает, метода ->with('childs') нету

common\models\Category has no relation named "childs".

Caused by: Unknown Method – yii\base\UnknownMethodException
Calling unknown method: common\models\Category::getchilds()
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Реально ли создать многоуровневый список через dropDownList?

Сообщение vitalik1183 »

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

public function getChilds(){
    return $this->hasMany(self::className(), ['parent_id' => 'id']);
}
Yii2!
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Реально ли создать многоуровневый список через dropDownList?

Сообщение alexa777 »

vitalik1183 писал(а): 2018.02.27, 09:35

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

public function getChilds(){
    return $this->hasMany(self::className(), ['parent_id' => 'id']);
}
Огромное спасибо) работает)
Вопрос А многоуровневую вложенность можно так выводить?

И как сделать чтобы 'prompt' => Передавал в Базу 0(ноль)

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

<?= $form->field($model, 'parent_id')->dropDownList($model->getCategorys(),
    [
    'prompt' => 'Выбор категории',
    ]
 )
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Реально ли создать многоуровневый список через dropDownList?

Сообщение andku83 »

при правильной структуре данных в БД должен быть NULL, а не 0

gii
категории
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Реально ли создать многоуровневый список через dropDownList?

Сообщение alexa777 »

shnir писал(а): 2018.02.27, 11:06 при правильной структуре данных в БД должен быть NULL, а не 0

gii
категории
В базе записывается Null, если никаких значений не пришло

Тольк вот этот запрос, те записи где Null а не 0 не выбирает

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

         $parents = self::find()->where("parent_id=0")->with('childs')->all();
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Реально ли создать многоуровневый список через dropDownList?

Сообщение andku83 »

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

$parents = self::find()->where(["parent_id" => null])->with('childs')->all();
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Реально ли создать многоуровневый список через dropDownList?

Сообщение alexa777 »

shnir писал(а): 2018.02.27, 11:48

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

$parents = self::find()->where(["parent_id" => null])->with('childs')->all();
А так он не выводит те категории где parent_id = 0
Короче я сделал в Экшене При создании категории $model->parent_id = '0'; Теперь везде ноль сохраняется.
Но тут другая проблема вылезла, Эта функция не выводит категории с parent_id = 0 если у нее нет дочерних категорий, и категории parent_id = 0 Нельзя выбрать при добавлении других категории, можно только дочерние. Как исправить?
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Реально ли создать многоуровневый список через dropDownList?

Сообщение andku83 »

alexa777 писал(а): 2018.02.27, 12:57 А так он не выводит те категории где parent_id = 0
shnir писал(а): 2018.02.27, 11:06 при правильной структуре данных в БД должен быть NULL, а не 0
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Реально ли создать многоуровневый список через dropDownList?

Сообщение andku83 »

а выбрать нельзя потому что это группированный список, вам нужно очный селект или список в виде http://simonwade.me/jquery-bonsai#auto-radio-buttons
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Реально ли создать многоуровневый список через dropDownList?

Сообщение andku83 »

пример кода находящегося в квери модели вызов через Page::find()->getListForSelectAsTree()
но вам подумать все равно придется куда это вам ставить

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

    public function getListForSelectAsTree()
    {
        $tree = $this->getAllAsTree();
        return $this->createTreeSelect($tree);
    }

    public function getAllAsTree()
    {
        $this->select(['name', 'id', 'parent_id'])
            ->addOrderBy(['id' => SORT_ASC])
            ->indexBy('id');

        $this->_data = $this->asArray()->all();

        $result = $this->createTree();
        return $result;
    }
    protected function createTreeSelect($data = array(), $prefix = '')
    {
        $list = [];
        foreach ($data as $item) {
            $list[$item['id']] = $prefix.$item['name'];
            if (!empty($item['items'])) {
                $list = $list + $this->createTreeSelect($item['items'], ($prefix) . $item['name'] . '->' );
            }
        }
        return $list;
    }
    protected function createTree()
    {
        $tree = [];
        foreach ($this->_data as $key => &$item) {
            if (!$item['parent_id']){
                $tree[$item['id']] = &$item;
            } elseif(!empty($this->_data[$item['parent_id']])) {
                    $this->_data[$item['parent_id']]['items'][$item['id']] = &$item;
            }
        }
        return $tree;
    }
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Реально ли создать многоуровневый список через dropDownList?

Сообщение alexa777 »

shnir писал(а): 2018.02.27, 13:19
Это для меня еще пока очень сложно))) для понимания, я сделал проще, для моих нужд этого пока достаточно

Вот мой вариант

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

public function getChilds(){
    return $this->hasMany(self::className(), ['parent_id' => 'id']);
}

 public static function getCategorys()
     {
         
         
             $options = [];
             $sep = '-----';

         $parents = self::find()->where("parent_id = 0")->with('childs')->all();

         foreach ($parents as $root) {
               $options[$root->id] = $root->name;
             foreach ($root->childs as $child)
             {    
                 $options[$child->id] = $sep . $child->name;
                 if (isset($child->childs)){
                     foreach ($child->childs as $two){
                         $options[$two->id] = $sep . $sep . $two->name;
                     }
 
                 }
             }
         }
         return $options;

}
Выводит такой массив

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

Array
(
    [9] => Авто
    [16] => -----Иномарки
    [17] => -----Отечественные 
    [10] => Недвижимость
    [14] => -----Аренда
    [15] => -----Продажа
    [11] => Работа
    [12] => -----Вакансии
    [18] => ----------Водители
    [13] => -----Резюме
    [22] => Водитель
)
Ответить