
В форме 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]); } ...
Ещё покопать можно:
- https://yiiframework.ru/forum/viewtopic.php?t=4134...
- https://des1roer.blogspot.com/2016/01/yii-2-kartik...
- https://stackoverflow.com/questions/28925624/yii2k...
- https://stackoverflow.com/questions/33369613/yii2-...
- https://stackoverflow.com/questions/51847967/yii2-...
12 декабря 2022, Программирование, веб-кодинг

