Embedded Multiple Input
// MODEL
<?php
namespace app\models\set;
use Yii;
use yii\web\Response;
use app\models\db\Group;
use app\models\db\GroupSubject;
class WizGroupSubject extends \yii\base\Model
{
public $wgs = [];
public static function ValidateWGS ($wgs) {
$result = true;
$error = [];
$names = [];
if (isset($wgs)) {
foreach ($wgs as $i=>$list) {
foreach ($list as $ii=>$row) {
$numerr = 0;
$msg = [];
// check if name is empty
if ($row['name']=='') {
$msg[$numerr] = Yii::t('stz', 'could not be empty');
$numerr++;
}
// check if name is unique
if (in_array(strtoupper($row['name']),$names)) {
$msg[$numerr] = Yii::t('stz', 'name must be unique');
$numerr++;
} else {
$names[] = strtoupper($row['name']);
}
$error["wizgroupsubject-".$i."-".$ii."-name"] = $msg;
foreach ($row['subject'] as $s=>$subject) {
$unique = array();
foreach ($subject as $ss=>$array) {
$numerr = 0;
$msg = [];
if (! in_array($array,$unique)) {
$unique[] = $array;
} else {
//id_subject double
$msg[$numerr] = Yii::t('stz', 'duplicate value');
$error["wizgroupsubject-".$i."-".$ii."-subject-id_subject-".$ss] = $msg; //wizgroupsubject-wgs-0-subject-id_subject-2
}
}
}
}
}
$error = array_filter($error);
if (empty($error)) {
return true;
} else {
return \yii\helpers\Json::encode($error);
}
}
return "general error";
}
public static function PopulateWGS($id_calendar)
{
$wgs = new WizGroupSubject();
$calc= 0;
$groups = Group::find()->where(['id_calendar'=>$id_calendar])->all();
foreach ($groups as $group) {
$wgs->wgs[$calc]['id_group'] = $group->id;
$wgs->wgs[$calc]['name'] = $group->name;
$groupsubjects = GroupSubject::find()->where(['id_group'=>$group->id])->all();
$calc2 = 0;
foreach ($groupsubjects as $gs) {
$wgs->wgs[$calc]['subject']['id_subject'][$calc2] = $gs->id_subject;
$calc2++;
}
$calc++;
}
return $wgs;
}
}
// CONTROLLER
//...
public function actionWiz_cal_group($id_calendar)
{
$subject_items = ArrayHelper::map(CalendarSubject::find()->where(['id_calendar' => $id_calendar])->orderBy('name')->all(),'id_subject','name');
$wizmodel = WizGroupSubject::PopulateWGS($id_calendar);
//return \yii\helpers\Json::encode($wizmodel);
//return print_r($wizmodel);
$this->CheckStatus($calendar, $season);
$request = Yii::$app->getRequest();
// ajax validation
if ($request->isPost && $request->post('ajax') !== null) {
$wgs = $_POST['WizGroupSubject'];
//return \yii\helpers\Json::encode($wgs);
return WizGroupSubject::ValidateWGS($wgs);
}
// insert/update
if ($request->isPost && $request->post('ajax') == null) {
$wgs = $_POST['WizGroupSubject'];
//TODO: function for insert/update
$wizmodel = WizGroupSubject::PopulateWGS($id_calendar); // ONLY FOR TEST
}
return $this->render('wiz_cal_group', [
'subject_items' => $subject_items,
'wizmodel' => $wizmodel,
]);
}
// VIEW wiz_cal_group
<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use unclead\widgets\MultipleInput;
use unclead\widgets\MultipleInputColumn;
$commonAttributeOptions = [
'enableAjaxValidation' => true,
'enableClientValidation' => false,
'validateOnChange' => false,
'validateOnSubmit' => true,
'validateOnBlur' => false,
];
?>
<?php $form = ActiveForm::begin([
'id' => 'multi-group',
'layout' => 'horizontal',
'enableAjaxValidation' => true,
'enableClientValidation' => false,
'validateOnChange' => false,
'validateOnSubmit' => true,
'validateOnBlur' => false,
]); ?>
<div class="panel panel-default">
<div class="panel-heading">
<h6> <?= \app\models\db\SportElement::se($calendar->id_sport,'group',2,true,true) ?></h6>
</div>
<div class="panel-body">
<?= \unclead\widgets\MultipleInput::widget([
'model' => $wizmodel,
'attribute' => 'wgs',
'attributeOptions' => $commonAttributeOptions,
'columns' => [
[
'name' => 'id_group',
'type' => \unclead\widgets\MultipleInputColumn::TYPE_HIDDEN_INPUT
],
[
'name' => 'name',
'title' => Yii::t('stz', 'Name') .' '. \app\models\db\SportElement::se($calendar->id_sport,'group',1,true,true),
'enableError' => true,
],
[
'name' => 'subject',
'type' => MultipleInput::class,
'options' => [
'attributeOptions' => $commonAttributeOptions,
'model' => $wizmodel,
'attribute' => 'wgs',
'columns' => [
[
'name' => 'id_subject',
'type' => MultipleInputColumn::TYPE_DROPDOWN,
'title' => \app\models\db\SportElement::se($calendar->id_sport,'subject',2,true,true),
'enableError' => true,
'items' => $subject_items,
'options' => [
//'prompt'=>Yii::t('stz', 'Select') .' '. \app\models\db\SportElement::se($calendar->id_sport,'subject',1,true,true).' ...',
],
]
]
]
]
],
]); ?>
</div>
</div>
<div class="form-group">
<?= Html::submitButton(Yii::t('stz', 'Next'), ['class' => 'btn btn-success']) ?>
</div>
<?php ActiveForm::end(); ?>