Программирование, веб-кодинг

Yii2: uclead MultipleInput + kartik DepDrop

Настраиваем множественные поля с выпадающим списком

Yii2: uclead MultipleInput + kartik DepDrop

В форме ActiveForm добавляем поля:

<!--?= $form--->field($model, 'hhi_id')->dropDownList(HumanHealthIndicators::find()->select(['name', 'id'])->indexBy('id')->column(), ['id'=>'hhi-id']); ?>
<!--?= $form--->field($model, 'measurements')->widget(MultipleInput::className(), [
        'max' => 50,
        'id' => 'my_id',
        'allowEmptyList' => true,
        'enableGuessTitle'  => true,
        'addButtonPosition' => MultipleInput::POS_HEADER, // show add button in the header
        'sortable' =>true,
        'cloneButton' => true,
        'rowOptions' => [
            'id' => 'row{multiple_index_my_id}',
        ],
        'columns' => [
            [
                'name' => 'measurementname',
                'type' => \kartik\depdrop\DepDrop::class,
                //'type' => 'dropDownList',
                'title' => 'Название измерения',
                //'value' => function($data) {return $data['name'];},
                //'items' =>function($data) {return arrayHelper::map($data, 'id', 'name');},
                'options' => [
                    'data' => range(1, 50),//[1,2,3,4,5,6,7,8,9,10], 
                    'pluginOptions' => [
                        'id' => 'measurementname-{multiple_index_my_id}',
                        'initialize' => true,
                        'depends' => ['hhi-id'],
                        'url' => Url::to(['/human-health-indicators/subcat1']),
                        'placeholder' => 'Выберите...'
                    ],
                ],
            ],
            [
                'name'  => 'measurement',
                'type'  => 'textInput',
                'title' => 'Значение',
                //'defaultValue' => 1,
            ],
        ],]); ?>

Первое поле hhi_id- это выпадающий список с показателями здоровья, такими как ЧСС, АД, Замеры обхватов тела...

Второе поле measurements - это множественное поле, с двумя колонками - measurementname и measurement. В первой колонке выпадающий список DepDrop, зависящий от hhi_id. Вторая колонка - это просто текстовое поле для указания значений. В таблице базы данных measurements хранится в виде строки json.

В опциях строка 'data' => range(1, 50) - это массив для выпадающего списка, так как нельзя выбирать из ничего.

DepDrop заполняется вызовом функции Subcat1

public function actionSubcat1() {
        \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        $out = [];
        if (isset($_POST['depdrop_parents'])) {
            $parents = $_POST['depdrop_parents'];
            if ($parents != null) {
                $cat_id = $parents[0];
                $model = $this->findModel($cat_id);
                $myarray = array_map(function($tag) {
                    return array(
                        'id' => $tag['parametername'],
                        'name' => $tag['parameter']
                    ); }, $model->parameters);
                $out = $myarray;
                return ['output'=>$out, 'selected'=>''];
            }
        }
        return ['output'=>'', 'selected'=>''];
 }

Здесь $myarray нужно, чтобы переназвать ключи для массива параметров parameters, так как вернуть надо массив именно с ключами 'id' и 'name'. При этом сами параметры $model->parameters в таблице базы данных хранятся тоже в одном поле в виде строки json. Но в модели HumanHealthIndicators я их преобразую в массив:

public function afterFind() {
        parent::afterFind();
        $this->parameters = \yii\helpers\Json::decode($this->parameters);
 }

А в контроллере HumanHealthIndicatorsController перед сохранением они из массива становятся строкой json (P.S. Как и измерения measurements тоже гоняются в json и обратно, забыл это сказать).

...
if ($this->request->isPost && $model->load($this->request->post())) {
            $model->parameters = \yii\helpers\Json::encode($model->parameters);
            if($model->save())
                return $this->redirect(['view', 'id' => $model->id]);
        }
...


Ещё покопать можно: