Active DropDown List - изменить в опции текст

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Active DropDown List - изменить в опции текст

Сообщение leonenco »

Здраствуйте форумчане!
Такой вопрос:
Создаю таблицу с категориями и их родителями. Имеются две таблицы: Categories(id,parent_id), CategoriesDescription(id, categories_id, categories_name). Имеются связи в моделях один-к-одному. Дефолтную(root) родителя в Categories->parent_id = 0,
в Greedview в поле parent_id поддтягираю имя из связи. Если значение равно 0 проставляю Main Category, подключил фильтр в Greedview. Теперь сам вопрос: как мне в activeDropDownList указать для первого значения фильтра текст?
Или мне надо править в самой модели?

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

<?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'rowOptions' => function($model) {

            if($model->categories_status == $model::STATUS_DISABLED)
            {
                return ['class' => 'danger'];
            } 
        },
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            [
                'attribute' => 'id',
                'label' => 'Name',
                'format' => 'raw',
                'value' => function ($model){ 
                    return $model->categoriesDescription->categories_name;
                }
            ],
            [
                'attribute' => 'categories_parent_id',
                'label' => 'Parent Category',
                'format' => 'raw',
                'value' => function ($model){ 
                    if($model->categories_parent_id == 0){
                        return "Main Category";
                    } else {
                        return $model->parentCategoriesDescription->categories_name;
                    }
                },
                'filter' => Html::activeDropDownList(
                    $searchModel, 'categories_parent_id', 
                    ArrayHelper::map(common\models\Categories::find()->joinWith(['parentCategoriesDescription'])->all(), 
                            'categories_parent_id', 'parentCategoriesDescription.categories_name'),
                        ['class'=>'form-control', 'prompt' => 'Select']
                    ),
            ],
            [
                'attribute'=>'categories_status',
                'label'=>'Status',
                'value'=>function($model){
                    if($model->categories_status == $model::STATUS_ACTIVE)
                    {
                        return "Active";
                    }
                    else if($model->categories_status == $model::STATUS_DISABLED)
                    {
                        return "Disabled";
                    }
                },
                'filter' => Html::activeDropDownList($searchModel, 'categories_status', ['10' => 'Active', '0' => 'Disabled'],['class'=>'form-control','prompt' => 'Select']),
            ],
            [
                'attribute' => 'updated_at',
                'label' => 'Last update',
                'value' => function($model){
                    return date('m/d/Y H:i:s T', strtotime($model->updated_at));
                }
            ],

            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); ?>
Аватара пользователя
Seagull
Сообщения: 31
Зарегистрирован: 2019.01.24, 20:00

Re: Active DropDown List - изменить в опции текст

Сообщение Seagull »

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

'filter' => Html::activeDropDownList(
	$searchModel, 
	'categories_parent_id',
	ArrayHelper::merge(
		[0 => 'Main Category'],
		ArrayHelper::map(
			common\models\Categories::find()->joinWith(['parentCategoriesDescription'])->all(), 
			'categories_parent_id',
			 'parentCategoriesDescription.categories_name'
		)
	),
        ['class'=>'form-control', 'prompt' => 'Select']
)
?
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Active DropDown List - изменить в опции текст

Сообщение leonenco »

Да это в коем-то роде помогло, Спасибо, но вопрос остался, ArrayHelper::merge первый массив должен был перезаписать 0 идекс второго. на деле я получил первый индекс как задумывалось и еще один!!! новый, который в принципе быть не мог:

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

<select id="categoriessearch-categories_parent_id" class="form-control" name="CategoriesSearch[categories_parent_id]">
<option value="">Select</option>
<option value="0" selected="">Main Category</option>
<option value="1"></option> <--------
<option value="24">Figurine Urns</option>
<option value="32">Dogs Category</option>
<option value="225">Companion Series Hollow Figurine</option>
<option value="237">Horse Urns</option>
<option value="210">Brass Paw Print  Urns</option>
<option value="400">Paw Print Jar</option>
<option value="398">Teal Paw Print Vases</option>
<option value="406">Service Urns - Case Quantities</option>
<option value="389">Hunter Series</option>
<option value="395">Combo Urn</option>
</select>
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Active DropDown List - изменить в опции текст

Сообщение leonenco »

В документации говориться что 2-ой массив перезаписывает данные если индексы совпадают, я попробовал поменять местами но результат был обратный, я получил на выходе массив без нового включенияб фактически первоначальную проблему.
вот документация: https://www.yiiframework.com/doc/guide/ ... ing-arrays
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Active DropDown List - изменить в опции текст

Сообщение leonenco »

Как опция, подскажите как бы вы реализовали категирии? отношения, талицы? может первоначально я пошел не той дорогой? За коменты благодарчик. Жду экспертов по нормализации ДБ.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Active DropDown List - изменить в опции текст

Сообщение samdark »

Здесь всё зависит от того, как потом эти самые категории будут использоваться:

1. Выбираем данные по одной категории или по суб-категориям тоже?
2. Нужно ли выводить все категории сразу?
3. Много ли категорий?
4. Какая вложенность?
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Active DropDown List - изменить в опции текст

Сообщение leonenco »

samdark писал(а): 2019.04.11, 11:16 Здесь всё зависит от того, как потом эти самые категории будут использоваться:

1. Выбираем данные по одной категории или по суб-категориям тоже?
2. Нужно ли выводить все категории сразу?
3. Много ли категорий?
4. Какая вложенность?
1. Модель подразумевает неограниченую вложеность (в реальности 1-2 уровня), т.к. каждая следующая категория может иметь родителя - предыдущую категорию.
2. Да, планирую во фронте делать вывод вложенного Navigation. Для этого в поле родитель для корневых каталогов указал дефолтное значение - 0, чтобы не иметь проблем при каждом вызове списка категорий с указанием скажем id != 1 (или другое значение для Главного родителя Root), для родителя. сейчас работаю в бэк-энде модуль редактирования категорий. Обнаружил что при установке фильтра в Гридвью поддтягиваются описания категорий через связи в моделе, но так как на root категорию нет описания он выводит пустое значение.
3. Общий обьем категорий около 150
4. 1-2 уровня.

Спасибо за ответ.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Active DropDown List - изменить в опции текст

Сообщение samdark »

На вопросы 1 и 2 ответ дайте.
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Active DropDown List - изменить в опции текст

Сообщение leonenco »

samdark писал(а): 2019.04.11, 19:23 На вопросы 1 и 2 ответ дайте.
1. По суб-категориям тоже
2. Нет. Выводятся сначала все корневые каталоги, потом суб-категории.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Active DropDown List - изменить в опции текст

Сообщение samdark »

И ещё важный вопрос — как часто будет меняться набор категорий?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Active DropDown List - изменить в опции текст

Сообщение samdark »

Судя по всему, вам лучше подойдёт хранение дерева методом Nested set. Там удобно выбирать категорию и суб-категории.

Вот неплохая реализация: https://github.com/creocoder/yii2-nested-sets
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Active DropDown List - изменить в опции текст

Сообщение leonenco »

Категории менятся будут очень редко (мигрируем с Зенкарта) . Сейчас ознакомлюсь спасибо за ответ.
Ответить