Как сделать подкатегорий в меню виджет select yii2?

Для создания подкатегорий в виджете select в Yii2, вам понадобится использовать элементы массива, чтобы определить иерархию данных. Далее, вы можете использовать рекурсию для построения выпадающего списка с подкатегориями.

Давайте рассмотрим пример, как добавить подкатегории в меню виджета select в Yii2.

1. Во-первых, вам нужно создать список категорий с иерархическими данными. Для этого вы можете использовать массив следующего вида:

$categories = [
    [
        'id' => 1,
        'name' => 'Категория 1',
        'parent_id' => 0,
    ],
    [
        'id' => 2,
        'name' => 'Подкатегория 1.1',
        'parent_id' => 1,
    ],
    [
        'id' => 3,
        'name' => 'Подкатегория 1.2',
        'parent_id' => 1,
    ],
    [
        'id' => 4,
        'name' => 'Категория 2',
        'parent_id' => 0,
    ],
    // и так далее...
];

Здесь каждый элемент массива представляет одну категорию, указывая 'id', 'name' и 'parent_id' для каждой категории. 'parent_id' определяет, к какой категории относится данная подкатегория. Если значение 'parent_id' равно 0, это означает, что категория не имеет родительской категории.

2. Затем, вам понадобится метод, который будет строить выпадающий список с подкатегориями. Для этого вы можете создать метод в модели или вспомогательном классе.

public function buildCategoryList($categories, $parent_id = 0, $prefix = '') {
    $list = [];
    
    foreach ($categories as $category) {
        if ($category['parent_id'] == $parent_id) {
            $list[$category['id']] = $prefix . $category['name'];
            
            // Рекурсивно вызываем метод для построения подкатегорий
            $list += $this->buildCategoryList($categories, $category['id'], $prefix . '—');
        }
    }
    
    return $list;
}

Этот метод принимает массив категорий, идентификатор родительской категории (по умолчанию 0) и префикс (для создания отступа). Он проверяет каждую категорию, и если она имеет родительскую категорию с указанным идентификатором, добавляет ее в список и рекурсивно вызывает метод для создания подкатегорий с новым префиксом.

3. Наконец, вы можете использовать этот метод в вашем виде представления (view) для создания списка категорий с подкатегориями.

use yiihelpersHtml;
use yiiwidgetsActiveForm;

$model = new YourModel();

$form = ActiveForm::begin();

// Построение списка категорий с подкатегориями
$categoryList = $model->buildCategoryList($categories);

echo $form->field($model, 'category')->dropDownList($categoryList);

ActiveForm::end();

В этом примере мы создаем экземпляр модели (YourModel) и используем метод buildCategoryList для построения списка категорий с подкатегориями. Затем этот список передается в метод dropDownList виджета ActiveForm для отображения выпадающего списка на форме.

Таким образом, вы можете создать подкатегории в меню виджете select в Yii2, используя иерархические данные и рекурсию.