Реально ли создать многоуровневый список через dropDownList?
Реально ли создать многоуровневый список через dropDownList?
Любопытно ,а возможно ли используя dropDownList создать список с вложненным в каждый пункт ещё списком. Т е как бы дерево.
Как реализовать это руками я знаю, но вопрос, а реально ли используя встроенное средство Yii2 dropDownList
Как реализовать это руками я знаю, но вопрос, а реально ли используя встроенное средство Yii2 dropDownList
Изучаю веб-программирование, не ругайтесь сильно)
- vitalik1183
- Сообщения: 1675
- Зарегистрирован: 2014.07.01, 08:42
Re: Реально ли создать многоуровневый список через dropDownList?
https://nix-tips.ru/yii2-vypadayushhij- ... nlist.html
"Групированный список" Вы это имели ввиду?
"Групированный список" Вы это имели ввиду?
Yii2!
Re: Реально ли создать многоуровневый список через dropDownList?
Ага.vitalik1183 писал(а): ↑2018.02.26, 15:57 https://nix-tips.ru/yii2-vypadayushhij- ... nlist.html
"Групированный список" Вы это имели ввиду?
Изучаю веб-программирование, не ругайтесь сильно)
Re: Реально ли создать многоуровневый список через dropDownList?
Вот нашел вариант чтобы дерево пробразовать в многоуровневый массив и вывести в dropDownList, но почему то тут $child_options[$child->id] = $child->name; выводит ошибку Trying to get property of non-objectvitalik1183 писал(а): ↑2018.02.26, 15:57 https://nix-tips.ru/yii2-vypadayushhij- ... nlist.html
"Групированный список" Вы это имели ввиду?
Не знаете почему?
Код: Выделить всё
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;
}
Re: Реально ли создать многоуровневый список через dropDownList?
потому что получаете ->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;
}
Re: Реально ли создать многоуровневый список через dropDownList?
Не работает, метода ->with('childs') нету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; }
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?
Код: Выделить всё
public function getChilds(){
return $this->hasMany(self::className(), ['parent_id' => 'id']);
}
Yii2!
Re: Реально ли создать многоуровневый список через dropDownList?
Огромное спасибо) работает)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' => 'Выбор категории',
]
)
Re: Реально ли создать многоуровневый список через dropDownList?
В базе записывается Null, если никаких значений не пришло
Тольк вот этот запрос, те записи где Null а не 0 не выбирает
Код: Выделить всё
$parents = self::find()->where("parent_id=0")->with('childs')->all();
Re: Реально ли создать многоуровневый список через dropDownList?
Код: Выделить всё
$parents = self::find()->where(["parent_id" => null])->with('childs')->all();
Re: Реально ли создать многоуровневый список через dropDownList?
А так он не выводит те категории где parent_id = 0shnir писал(а): ↑2018.02.27, 11:48Код: Выделить всё
$parents = self::find()->where(["parent_id" => null])->with('childs')->all();
Короче я сделал в Экшене При создании категории $model->parent_id = '0'; Теперь везде ноль сохраняется.
Но тут другая проблема вылезла, Эта функция не выводит категории с parent_id = 0 если у нее нет дочерних категорий, и категории parent_id = 0 Нельзя выбрать при добавлении других категории, можно только дочерние. Как исправить?
Re: Реально ли создать многоуровневый список через dropDownList?
а выбрать нельзя потому что это группированный список, вам нужно очный селект или список в виде http://simonwade.me/jquery-bonsai#auto-radio-buttons
Re: Реально ли создать многоуровневый список через dropDownList?
пример кода находящегося в квери модели вызов через 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;
}
Re: Реально ли создать многоуровневый список через dropDownList?
Это для меня еще пока очень сложно))) для понимания, я сделал проще, для моих нужд этого пока достаточно
Вот мой вариант
Код: Выделить всё
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] => Водитель
)