Hellow, I beg for you help on how i can solve this errors… i need to implement nesteted dynamic form on my project but i get some errors on my codes and i dont know how to solve it coz i’m biginner in yii2.
ERROS I GET
undefined variable: model on create.php file
ERROS IN CONTROLLER
undefined class ‘Model’
Undefined variable ‘$indexWilaya’
on update part in contorller
-Undefined variable ‘$modelsWilaya’
-Undefined variable ‘$katas’
Unhandled exceptions on delete part on controller
ON VIEW MKOA FORM
Undefined variable ‘$modelsWilaya’
MY DATA BASE
MKOA FORM CODE
<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use wbraganca\dynamicform\DynamicFormWidget;
?>
<div class="mkoa-form">
<?php $form = ActiveForm::begin(['id' => 'dynamic-form']); ?>
<div class="row">
<div class="col-sm-6">
<?= $form->field($model, 'MKOA')->textInput(['maxlength' => true]) ?>
</div>
<div class="padding-v-md">
<div class="line line-dashed"></div>
</div>
<?php DynamicFormWidget::begin([
'widgetContainer' => 'dynamicform_wrapper',
'widgetBody' => '.container-items',
'widgetItem' => '.wilaya-item',
'limit' => 10,
'min' => 1,
'insertButton' => '.add-wilaya',
'deleteButton' => '.remove-wilaya',
'model' => $modelsWilaya[0],
'formId' => 'dynamic-form',
'formFields' => [
'WILAYA',
],
]); ?>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Wilaya</th>
<th style="width: 450px;">Rooms</th>
<th class="text-center" style="width: 90px;">
<button type="button" class="add-house btn btn-success btn-xs"><span class="fa fa-plus"></span></button>
</th>
</tr>
</thead>
<tbody class="container-items">
<?php foreach ($modelsWilaya as $indexWilaya => $modelWilaya): ?>
<tr class="wilaya-item">
<td class="vcenter">
<?php
// necessary for update action.
if (! $modelWilaya->isNewRecord) {
echo Html::activeHiddenInput($modelWilaya, "[{$indexWilaya}]id");
}
?>
<?= $form->field($modelWilaya, "[{$indexWilaya}]WILAYA")->label(false)->textInput(['maxlength' => true]) ?>
</td>
<td>
<?= $this->render('_form-kata', [
'form' => $form,
'indexWilaya' => $indexWilaya,
'modelsKata' => $modelsKata[$indexWilaya],
]) ?>
</td>
<td class="text-center vcenter" style="width: 90px; verti">
<button type="button" class="remove-house btn btn-danger btn-xs"><span class="fa fa-minus"></span></button>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php DynamicFormWidget::end(); ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
KATA FORM CODE
<?php
use yii\helpers\Html;
use wbraganca\dynamicform\DynamicFormWidget;
?>
<?php DynamicFormWidget::begin([
'widgetContainer' => 'dynamicform_inner',
'widgetBody' => '.container-kata',
'widgetItem' => '.kata-item',
'limit' => 10,
'min' => 1,
'insertButton' => '.add-kata',
'deleteButton' => '.remove-kata',
'model' => $modelsKata[0],
'formId' => 'dynamic-form',
'formFields' => [
'KATA'
],
]); ?>
<table class="table table-bordered">
<thead>
<tr>
<th>Kata</th>
<th class="text-center">
<button type="button" class="add-room btn btn-success btn-xs"><span class="glyphicon glyphicon-plus"></span></button>
</th>
</tr>
</thead>
<tbody class="container-rooms">
<?php foreach ($modelsKata as $indexKata => $modelKata): ?>
<tr class="kata-item">
<td class="vcenter">
<?php
// necessary for update action.
if (! $modelKata->isNewRecord) {
echo Html::activeHiddenInput($modelKata, "[{$indexWilaya}][{$indexKata}]id");
}
?>
<?= $form->field($modelKata, "[{$indexWilaya}][{$indexKata}]KATA")->label(false)->textInput(['maxlength' => true]) ?>
</td>
<td class="text-center vcenter" style="width: 90px;">
<button type="button" class="remove-kata btn btn-danger btn-xs"><span class="glyphicon glyphicon-minus"></span></button>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php DynamicFormWidget::end(); ?>
MKOA CONTOLLER CODE
<?php
namespace backend\controllers;
use Yii;
use yii\db\Exception;
use yii\helpers\ArrayHelper;
use yii\web\NotFoundHttpException;
use yii\widgets\ActiveForm;
use common\models\Mkoa;
use common\models\Wilaya;
use common\models\kata;
class MkoaController extends \yii\web\Controller
{
public function actionIndex()
{
return $this->render('index');
}
/**
* Displays a single mkoa model.
* @param integer $id
* @return mixed
* @throws NotFoundHttpException
*/
public function actionView($id)
{
$model = $this->findModel($id);
$wilaya = $model->Wilaya;
return $this->render('view', [
'model' => $model,
'wilaya' => $wilaya,
]);
}
/**
* Creates a new Mkoa model.
* If creation is successful, the browser will be redirected to the 'view' page.
* @return mixed
*/
public function actionCreate()
{
$modelMkoa = new Mkoa;
$modelsWilaya = [new Wilaya];
$modelsKata = [[new Kata]];
if ($modelMkoa->load(Yii::$app->request->post())) {
$modelsWilaya = Model::createMultiple(Wilaya::classname());
Model::loadMultiple($modelsWilaya, Yii::$app->request->post());
// validate mkoa and wilaya models
$valid = $modelMkoa->validate();
$valid = Model::validateMultiple($modelsWilaya) && $valid;
if (isset($_POST['KATA'][0][0])) {
foreach ($_POST['KATA'] as $indexHouse => $katas) {
foreach ($katas as $indexKata => $kata) {
$data['Kata'] = $kata;
$modelKata = new Kata;
$modelKata->load($data);
$modelsKata[$indexWilaya][$indexKata] = $modelKata;
$valid = $modelKata->validate();
}
}
}
if ($valid) {
$transaction = Yii::$app->db->beginTransaction();
try {
if ($flag = $modelMkoa->save(false)) {
foreach ($modelsWilaya as $indexWilaya => $modelWilaya) {
if ($flag === false) {
break;
}
$modelWilaya->wilaya_M_id = $modelMkoa->id;
if (!($flag = $modelWilaya->save(false))) {
break;
}
if (isset($modelsKata[$indexWilaya]) && is_array($modelsKata[$indexWilaya])) {
foreach ($modelsKata[$indexWilaya] as $indexKata => $modelKata) {
$modelKata->wilaya_W_ID_id = $modelWilaya->id;
if (!($flag = $modelKata->save(false))) {
break;
}
}
}
}
}
if ($flag) {
$transaction->commit();
return $this->redirect(['view', 'id' => $modelMkoa->id]);
} else {
$transaction->rollBack();
}
} catch (Exception $e) {
$transaction->rollBack();
}
}
}
return $this->render('create', [
'modelMkoa' => $modelMkoa,
'modelsWilaya' => (empty($modelsWilaya)) ? [new Wilaya] : $modelsWilaya,
'modelsKata' => (empty($modelsKata)) ? [[new kata]] : $modelsKata,
]);
}
/**
* Updates an existing mkoa model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param integer $id
* @return mixed
* @throws NotFoundHttpException
*/
public function actionUpdate($id)
{
$modelMkoa = $this->findModel($id);
$modelsWilaya = $modelsWilaya->wilaya;
$modelsKata = [];
$oldKatas = [];
if (!empty($modelsWilaya)) {
foreach ($modelsWilaya as $indexWilaya => $modelWilaya) {
$rooms = $modelWilaya->katas;
$modelsKata[$indexWilaya] = $katas;
$oldKatas = ArrayHelper::merge(ArrayHelper::index($katas, 'id'), $oldKatas);
}
}
if ($modelMkoa->load(Yii::$app->request->post())) {
// reset
$modelsKata = [];
$oldWilayaIDs = ArrayHelper::map($modelsWilaya, 'id', 'id');
$modelsWilaya = Model::createMultiple(Wilaya::classname(), $modelsWilaya);
Model::loadMultiple($modelsWilaya, Yii::$app->request->post());
$deletedWilayaIDs = array_diff($oldWilayaIDs, array_filter(ArrayHelper::map($modelsWilaya, 'id', 'id')));
// validate person and houses models
$valid = $modelMkoa->validate();
$valid = Model::validateMultiple($modelsWilaya) && $valid;
$katasIDs = [];
if (isset($_POST['KATA'][0][0])) {
foreach ($_POST['KATA'] as $indexWilaya => $katas) {
$katasIDs = ArrayHelper::merge($katasIDs, array_filter(ArrayHelper::getColumn($katas, 'KATA_ID')));
foreach ($katas as $indexKata => $kata) {
$data['KATA'] = $kata;
$modelsKata = (isset($kata['KATA_ID']) && isset($oldRooms[$kata['KATA_ID']])) ? $oldKatas[$kata['KATA_ID']] : new Kata;
$modelsKata->load($data);
$modelsKata[$indexWilaya][$indexKata] = $modelsKata;
$valid = $modelsKata->validate();
}
}
}
$oldKatasIDs = ArrayHelper::getColumn($oldKatas, 'KATA_ID');
$deletedKatasIDs = array_diff($oldKatasIDs, $katasIDs);
if ($valid) {
$transaction = Yii::$app->db->beginTransaction();
try {
if ($flag = $modelMkoa->save(false)) {
if (! empty($deletedKatasIDs)) {
Kata::deleteAll(['id' => $deletedKatasIDs]);
}
if (! empty($deletedWilayaIDs)) {
Wilaya::deleteAll(['W_ID' => $deletedWilayaIDs]);
}
foreach ($modelsWilaya as $indexWilaya => $modelWilaya) {
if ($flag === false) {
break;
}
$modelMkoa->mkoa_M_ID = $modelMkoa->M_ID;
if (!($flag = $modelWilaya->save(false))) {
break;
}
if (isset($modelsKata[$indexWilaya]) && is_array($modelsKata[$indexWilaya])) {
foreach ($modelsKata[$indexWilaya] as $indexKata => $modelKata) {
$modelKata->wilaya_W_ID = $modelWilaya->W_ID;
if (!($flag = $modelKata->save(false))) {
break;
}
}
}
}
}
if ($flag) {
$transaction->commit();
return $this->redirect(['view', 'M_ID' => $modelMkoa->M_ID]);
} else {
$transaction->rollBack();
}
} catch (Exception $e) {
$transaction->rollBack();
}
}
}
return $this->render('update', [
'modelPerson' => $modelMkoa,
'modelsHouse' => (empty($modelsWilaya)) ? [new Wilaya] : $modelsWilaya,
'modelsRoom' => (empty($modelsKata)) ? [[new Kata]] : $modelsKata
]);
}
/**
* Deletes an existing Person model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* @param integer $id
* @return mixed
* @throws NotFoundHttpException
*/
public function actionDelete($id)
{
$model = $this->findModel($id);
$name = $model->MKOA;
if ($model->delete()) {
Yii::$app->session->setFlash('success', 'Record <strong>"' . $name . '"</strong> deleted successfully.');
}
return $this->redirect(['index']);
}
/**
* Finds the Person model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* @param integer $id
* @return Mkoa the loaded model
* @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
{
if (($model = Mkoa::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
}
?>