Как добавить DropDown в GridView

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
imediasun
Сообщения: 45
Зарегистрирован: 2015.11.19, 15:46

Как добавить DropDown в GridView

Сообщение imediasun »

Здравствуйте.
У меня есть таблица с офисными сотрудниками.
И есть вот такая таблица (В самом низу см. Сотрудник офиса)

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

 <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'layout' => "{summary}\n{pager}\n{items}\n{pager}",
        'pager' => [
            'class' => CustomPageLinkPager::class,
            'lastPageLabel' => '&raquo;&raquo;|',
            'firstPageLabel' => '|&laquo;&laquo;'
        ],
        'columns' => [
            [
                'attribute' => 'id',
                'label' => 'ID'
            ],

            [
                'format' => 'raw',
                'label' => 'Логин',
                'attribute' => 'user.username',
                'filter' => Html::activeTextInput($searchModel, $searchModel::FIELD_USERNAME,[
                    'class' => 'form-control'
                ])
            ],

            [
                'label' => 'Имя',
                'value' => function(ClientSearch $model)
                {
                    return $model->user->passport->first_name;
                },
                'filter' => Html::activeTextInput($searchModel, $searchModel::FIELD_FIRST_NAME,[
                    'class' => 'form-control'
                ])
            ],
            [
                'label' => 'Фамилия',
                'value' => function(ClientSearch $model)
                {
                    return $model->user->passport->last_name;
                },
                'filter' => Html::activeTextInput($searchModel, $searchModel::FIELD_LAST_NAME,[
                    'class' => 'form-control'
                ])
            ],
            [
                'attribute'=>Client::FIELD_IS_ACTIVE,
                'format'=>'boolean'
            ],
            [
                'label' => 'Activation and Card Fee',
                'value' => function(ClientSearch $model)
                {

                    return yii::$app->formatter->asBoolean(
                        (new \common\components\finance\metadata\AccountMetadataFactory())
                        ->findByMetaKeyId(
                            $model->getDefaultAccount(),
                            \common\components\ServiceFacade::getOperationMetaKeyCommonService()->getIdByName(\common\enums\MetaKeyEnum::ACCOUNT_FEE_PAID))
                        ->value);
                },
                'filter' => Html::activeDropDownList($searchModel, $searchModel::FIELD_FEE_PAID, [
                    // todo: use SelectDecorator and YesNo Enum
                    ''=>'',
                    '1'=>'Да',
                    '0'=>'Нет',
                ] ,[
                    'class' => 'form-control'
                ])
            ],
            [
                'label' => 'Разблокированные расходные операции',
                'value' => function(ClientSearch $model)
                {
                    return yii::$app->formatter->asBoolean(
                        $model->getDefaultAccount()->getOutcomeEnabled());
                },
                'filter' => Html::activeDropDownList($searchModel, $searchModel::FIELD_OUTCOME_ENABLED, [
                    // todo: use SelectDecorator and YesNo Enum
                    ''=>'',
                    '1'=>'Да',
                    '0'=>'Нет',
                ] ,[
                    'class' => 'form-control'
                ])
            ],
            [
                'class' => 'yii\grid\ActionColumn',
                'template' => '{update}'
            ],
            [
                'label'=>Client::FIELD_DOC_CONTROL,
                'value' => function (ClientSearch $model){
                    if($model->doc_control == null )  {
                        return "Нет";
                    }
                    else return "Да";
                }


            ],
            [
                'format'=> 'html',
                'label' => 'needs_overview',
                'value' => function(ClientSearch $model)
                {
                    $service = \common\components\ServiceFacade::getClientCommonService();
                    $docs = $service->hasUnoverviewedDocs($model);
                    if($docs)
                    {
                        return Html::a('<span class="glyphicon glyphicon-flag"></span>','#');
                    }

                },

            ],
            [
                'attribute' =>'status',
                'filter' => Html::activeDropDownList($searchModel, $searchModel::FIELD_STATUS,
                    \common\components\Decorator::decorateSelect([
                        ClientStatusEnum::STATUS_ACTIVE => ClientStatusEnum::STATUS_ACTIVE,
                        ClientStatusEnum::STATUS_DELETED => ClientStatusEnum::STATUS_DELETED
                    ]) ,[
                    'class' => 'form-control', 'style' => 'width:100px'
                ])
            ],
            'create_time:date',
            [
                'label' => 'Сотрудник офиса',
                'value' => function(Client $model)
                {
                    if(isset($model->office_worker)){
                        return $model->office_worker;
                    }
                },
                'filter' => Html::activeTextInput($searchModel, $searchModel::FIELD_FIRST_NAME,[
                    'class' => 'form-control'
                ])
            ],
        ],
    ]); ?>
Что нужно сделать в модели Client и что нужно добавить в GridView Чтобы у каждого клиента появился имя сотрудника офиса который его обслуживает (Сейчас только его айдишник выводится)
Написал вот такую функцию в модели Client

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

 public function getOfficeWorker()
    {
        return $this->hasOne(OfficeWorker::className(), [OfficeWorker::FIELD_ID => self::FIELD_OFFICE_WORKER]);
    }
Создал вот такую миграцию

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

use common\models\Client;
use yii\db\Migration;

class m171020_120446_alter_add_office_worker_client_table extends Migration
{
    public function up()
    {
        $this->addColumn(Client::tableName(), Client::FIELD_OFFICE_WORKER, $this->integer());
    }

    public function down()
    {
        $this->dropColumn('client', 'office_worker');
    }
  
}
При нажатии на редактирование профиля клиента появляется вот такая форма
http://prntscr.com/gztt61
Вот к примеру я пытаюсь вставить сюда выпадающий список OFFiCE_WORKER

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

<div class="control-group">
                    <?= $form->field($model, $model::FIELD_PRODUCT_NAME) ?>
                    <?= $form->field($model, $model::FIELD_AGIO_CREDIT)
                        ->dropDownList(\common\enums\YesNoEnum::map()) ?>
                    <?= $form->field($model, $model::FIELD_OFFICE_WORKER)
                        ->dropDownList() ?>
                    <? if (\common\models\User::current()->checkRole(\common\enums\RoleEnum::ROLE_ADMIN)):
                        print $form->field($model, $model::FIELD_CONTRACT_SUM);
                    else: ?>
                        <div class='form-group'>
                            <?= Html::label('Contract Sum', null, ['class' => 'control-label']) ?>
                            <?= Html::input('number', null, $model->contract_sum, ['disabled' => true,  'class' => 'form-control']); ?>
                        </div>
                    <? endif ?>
                    <?= $form->field($model, $model::FIELD_IS_PEP)
                        ->dropDownList(\common\enums\YesNoEnum::map()) ?>

                </div>
Но не знаю что пишется в ->dropDownList()
Аватара пользователя
Haku
Сообщения: 58
Зарегистрирован: 2015.03.11, 07:39

Re: Как добавить DropDown в GridView

Сообщение Haku »

В первом аргументе передаётся массив со значениями, которые будут элементами выпадающего списка, во втором необязательном аргументе передаются html-атрибуты, добавляемые к тегу "select". Документация вам в помощь: dropDownList().
imediasun
Сообщения: 45
Зарегистрирован: 2015.11.19, 15:46

Re: Как добавить DropDown в GridView

Сообщение imediasun »

Помогите пожалуйста разобраться что не так
Значения я пытаюсь передать вот так

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

->dropDownList($model->getOfficeWorker()) ?>
Но получаю ошибку
http://prntscr.com/gzua7b
Аватара пользователя
Haku
Сообщения: 58
Зарегистрирован: 2015.03.11, 07:39

Re: Как добавить DropDown в GridView

Сообщение Haku »

imediasun писал(а): 2017.10.20, 18:30 Помогите пожалуйста разобраться что не так
Значения я пытаюсь передать вот так

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

->dropDownList($model->getOfficeWorker()) ?>
Вы передаёте в dropDownList() объект ActiveRecord, а нужно передавать туда массив (тип "array"). Методы hasOne() и hasMany() возвращают объекты, поэтому вам нужно перевести результат их работы в массив.
imediasun
Сообщения: 45
Зарегистрирован: 2015.11.19, 15:46

Re: Как добавить DropDown в GridView

Сообщение imediasun »

а как это сделать?
Ответить