Не правильная структура вывода категорий?

Доброй ночи!
Не могу правильно в теги <option> правильно вывести структурированный список категорий с подкатегориями в админке.

Модель Category
protected function buildTree($data)
    {
        $parent_arr = [];
        foreach ($data as $key => $item) {
            $parent_arr[$item['parent_id']][$item['id']] = $item;
        }

        $treeElem = $parent_arr[0];
        $this->generateElemTree($treeElem, $parent_arr);

        return $treeElem;
    }

    public function generateElemTree(&$treeElem, $parent_arr)
    {
        foreach ($treeElem as $key => $item) {
            if (!isset($item['children'])) {
                $treeElem[$key]['children'] = [];
            }
            if (array_key_exists($key, $parent_arr)) {
                $treeElem[$key]['children'] = $parent_arr[$key];
                $this->generateElemTree($treeElem[$key]['children'], $parent_arr);
            }
        }
    }

    public function elemOption($data)
    {
        $arr = '';
        foreach ($data as $menu) {

            if ($menu['parent_id'] == 0) {
                    $arr .= '<option value="' . $menu['id'] . '">' . $menu['title'].'</option>';
            } else {
                $arr .= '<option value="' . $menu['id'] . '">' . ' --- ' . $menu['title'].'</option>';
            }

            if (!empty($menu['children'])) {
                $arr .= $this->elemOption($menu['children']);
            }

        }
        return $arr;
    }


Это у меня в админке форма
<select id="category-parent_id" class="form-control" name="Category[parent_id]">
        <?= $cat->getCategories() ?>
    </select>


Сама БД
id | parent_id | title

Что выводиться на экране
Протеин
 --- Соевый протеин
 --- Молочный казеин
Казеин


А должно быть
Протеин
 --- Соевый протеин
Казеин
 --- Молочный казеин


Мне кажется что не хватается проверки в методе elemOption, для правильного построения!
  • Вопрос задан
  • 58 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Arik
Если про все забыть и во вью сделать так:
<?php

$fGetSelectOptions = function ($fGetSelectOptions, array $data, $parentId = 0, $level = 0) {
    $return = '';

    foreach ($data as $d) {
        if($d['parent_id'] == $parentId) {
            $prefix = str_repeat('- ', $level);
            $return .= '<option value="' . $d['id'] . '">' . $prefix .  $d['title'] . '</option>';
        } else {
            $return .= $fGetSelectOptions($fGetSelectOptions, $data, $d['id'], ++$level);
        }
    }
    return $return;
};

$selectData = [
    [
        'id' => 1,
        'title' => 'odin',
        'parent_id' => 0,
    ],
    [
        'id' => 2,
        'title' => 'dva',
        'parent_id' => 1,
    ],
];
?>

<select id="category-parent_id" class="form-control" name="Category[parent_id]">
    <?= $fGetSelectOptions($fGetSelectOptions, $selectData) ?>
</select>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы