Comments (12)
Ensure you have added all the fields you want to validate the 'FormFields' attribute.
How is the code in your view?
from yii2-dynamicform.
Hello,
I have this:
<?php DynamicFormWidget::begin([
'dynamicItems' => '#form-qualifications',
'dynamicItem' => '.form-qualifications-item',
'model' => $modelsQualifications[0],
'formId' => 'dynamic-form',
'formFields' => [
'employee_qualification_position',
'employee_qualification_start_date',
'employee_qualification_end_date',
'employee_qualification_reason',
'employee_qualification_organisation',
'employee_qualification_town',
'employee_qualification_country',
],
'options' => [
'limit' => 4, // the maximum times, an element can be cloned (default 999)
]
]); ?>
<div id="form-qualifications">
<?php foreach ($modelsQualifications as $i => $modelQualifications): ?>
<div class="form-qualifications-item panel panel-default">
<div class="panel-heading">
<h3 class="panel-title pull-left">Qualifications</h3>
<div class="pull-right">
<button type="button" class="clone btn btn-success btn-xs"><i class="glyphicon glyphicon-plus"></i></button>
<button type="button" class="delete btn btn-danger btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
</div>
<div class="clearfix"></div>
</div>
<div class="panel-body">
<?php
// necessary for update action.
if (!$modelQualifications->isNewRecord) {
echo Html::activeHiddenInput($modelQualifications, "[{$i}]id");
}
?>
<?= $form->field($modelQualifications, "[{$i}]employee_qualification_position")->textInput(['maxlength' => 64]) ?>
<div class="row">
<div class="col-sm-6">
<? // $form->field($modelQualifications, "[{$i}]employee_qualification_start_date")->textInput(['maxlength' => 128]) ?>
<?= yii\jui\DatePicker::widget(['name' => '[{'.$i.'}]employee_qualification_start_date', 'clientOptions' => ['defaultDate' => '2014-01-01']]) ?>
</div>
<div class="col-sm-6">
<?= $form->field($modelQualifications, "[{$i}]employee_qualification_end_date")->textInput(['maxlength' => 128]) ?>
</div>
</div><!-- .row -->
<div class="row">
<div class="col-sm-4">
<?= $form->field($modelQualifications, "[{$i}]employee_qualification_reason")->textInput(['maxlength' => 64]) ?>
</div>
<div class="col-sm-4">
<? //$form->field($modelQualifications, "[{$i}]employee_qualification_organisation")->textInput(['maxlength' => 32]) ?>
</div>
<div class="col-sm-4">
<?= $form->field($modelQualifications, "[{$i}]employee_qualification_town")->textInput(['maxlength' => 15]) ?>
</div>
<div class="col-sm-4">
<?= $form->field($modelQualifications, "[{$i}]employee_qualification_country")->textInput(['maxlength' => 15]) ?>
</div>
</div><!-- .row -->
</div>
</div>
<?php endforeach; ?>
</div>
<?php DynamicFormWidget::end(); ?>
So I have 2 problems so far:
- When I click [+] on form to duplicate the fieldset, only the first set validates
- Datepicker is not working on duplicated fieldset
from yii2-dynamicform.
Not working with jui datepicker.
Try: http://demos.krajee.com/widget-details/datepicker
from yii2-dynamicform.
Thank you! Will try to replace jui datepicker with krajee's!
What can be the problem with cloned fields validation? any hints?
from yii2-dynamicform.
I'm unable to reproduce your problem. I need to see the whole view code for analysis :(
from yii2-dynamicform.
Are you trying it on Yii v 2.0.0 or 2.0.1, maybe it makes difference? if you're on 2.0.1 then I will upload entire code, thanks!
from yii2-dynamicform.
controllers\EmployeesController.php // here I call actionRegistrationstepone to display the form
<?php
namespace frontend\controllers;
use Yii;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use app\base\Model;
use yii\web\Response;
use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper;
use yii\web\Controller;
use yii\data\Pagination;
use frontend\models\Employees;
use frontend\models\EmployeeQualifications;
class EmployeesController extends \yii\web\Controller
{
public function actionIndex()
{
return $this->render('index');
/*,['model' => new Employees] */
}
public function actionRegistrationstepone()
{
$modelEmployee = new Employees();
$modelsQualifications = [new EmployeeQualifications];
if ($modelEmployee->load(Yii::$app->request->post())) {
$modelsQualifications = Model::createMultiple(Address::classname());
Model::loadMultiple($modelsQualifications, Yii::$app->request->post());
// ajax validation
if (Yii::$app->request->isAjax) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ArrayHelper::merge(
ActiveForm::validateMultiple($modelsQualifications),
ActiveForm::validate($modelEmployee)
);
}
// validate all models
$valid = $modelEmployee->validate();
$valid = Model::validateMultiple($modelsQualifications) && $valid;
if ($valid) {
$transaction = \Yii::$app->db->beginTransaction();
try {
if ($flag = $modelEmployee->save(false)) {
foreach ($modelsQualifications as $modelsQualifications) {
$modelsQualifications->customer_id = $modelEmployee->id;
if (! ($flag = $modelsQualifications->save(false))) {
$transaction->rollBack();
break;
}
}
}
if ($flag) {
$transaction->commit();
return $this->redirect(['view', 'id' => $modelEmployee->id]);
}
} catch (Exception $e) {
$transaction->rollBack();
}
}
}
return $this->render('registrationstepone', [
'modelEmployee' => $modelEmployee,
'modelsQualifications' => (empty($modelsQualifications)) ? [new Address] : $modelsQualifications
]);
}
/*
return $this->render('registrationstepone', [
'modelEmployee' => $modelEmployee,
'modelsQualifications' => (empty($modelsQualifications)) ? [new EmployeeQualifications] : $modelsQualifications
]);
*/
/*if($model->load(Yii::$app->request->post()) && $model->validate())
{
//echo "validated";
//break;
return $this->render('Registrationsteptwo',['model'=>$model]);
} else {
return $this->render('registrationstepone',['model'=>$model]);
}
}*/
}
models\Employees.php
<?php
namespace frontend\models;
use Yii;
use yii\db\ActiveRecord;
/**
* This is the model class for table "employees".
*
* @property integer $employee_id
* @property integer $employee_title
* @property string $employee_firstname
* @property string $employee_lastname
* @property boolean $employee_workpermit
* @property string $employee_email
* @property string $employee_phone
* @property string $employee_mobile
* @property string $employee_address
* @property string $employee_town
* @property integer $employee_country
* @property string $employee_postcode
* @property boolean $employee_convict
* @property string $employee_convict_description
* @property boolean $employee_med_examination
* @property boolean $employee_declaration
* @property integer $employee_nationality
* @property integer $employee_nino
* @property boolean $employee_nonino
* @property string $employee_dob
* @property integer $employee_marital_status
* @property string $employee_bank_holder_name
* @property string $employee_bank_name
* @property string $employee_bank_sortcode
* @property string $employee_bank_account_number
* @property boolean $employee_nobank
* @property string $employee_kin_firstname
* @property string $employee_kin_lastname
* @property string $employee_kin_contactno
* @property string $employee_kin_relationship
* @property string $employee_kin_address
* @property string $employee_kin_postcode
* @property boolean $employee_details_held
* @property string $employee_absence_days
* @property string $employee_absence_periods
* @property boolean $employee_medication
* @property boolean $employee_treatment
* @property boolean $employee_injury
* @property boolean $employee_disability
* @property boolean $employee_worktime
* @property integer $employee_status
* @property integer $employee_registration_code
* @property string $employee_password
* @property integer $employee_registration_date
* @property integer $employee_edit_date
* @property string $employee_auth_key
* @property string $employee_passwordreset_token
*
* @property CompetenceLanguages[] $competenceLanguages
* @property EmployeeAvailability[] $employeeAvailabilities
* @property EmployeeQualifications[] $EmployeeQualifications
* @property EmployeeReferences[] $employeeReferences
* @property TitlesList $employeeTitle
* @property Countries $employeeCountry
* @property EmployeeStatuses $employeeStatus
* @property MaritalStatuses $employeeMaritalStatus
*/
class Employees extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'employees';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['employee_id', 'employee_title', 'employee_firstname', 'employee_lastname', 'employee_email', 'employee_phone', 'employee_mobile', 'employee_address', 'employee_town', 'employee_country', 'employee_postcode', 'employee_convict_description', 'employee_nationality', 'employee_nino', 'employee_dob', 'employee_marital_status', 'employee_bank_holder_name', 'employee_bank_name', 'employee_bank_sortcode', 'employee_bank_account_number', 'employee_kin_firstname', 'employee_kin_contactno', 'employee_kin_relationship', 'employee_absence_days', 'employee_absence_periods', 'employee_status', 'employee_registration_code', 'employee_password', 'employee_registration_date', 'employee_edit_date', 'employee_auth_key'], 'required'],
[['employee_id', 'employee_title', 'employee_country', 'employee_nationality', 'employee_nino', 'employee_marital_status', 'employee_status', 'employee_registration_code', 'employee_registration_date', 'employee_edit_date'], 'integer'],
[['employee_workpermit', 'employee_convict', 'employee_med_examination', 'employee_declaration', 'employee_nonino', 'employee_nobank', 'employee_details_held', 'employee_medication', 'employee_treatment', 'employee_injury', 'employee_disability', 'employee_worktime'], 'boolean'],
[['employee_dob'], 'safe'],
[['employee_firstname', 'employee_lastname', 'employee_email', 'employee_address', 'employee_bank_holder_name', 'employee_bank_name', 'employee_bank_sortcode', 'employee_bank_account_number', 'employee_kin_firstname', 'employee_kin_lastname', 'employee_kin_contactno', 'employee_kin_relationship', 'employee_kin_address', 'employee_kin_postcode', 'employee_absence_days', 'employee_absence_periods', 'employee_password', 'employee_passwordreset_token'], 'string', 'max' => 255],
[['employee_phone', 'employee_mobile', 'employee_postcode'], 'string', 'max' => 10],
[['employee_town', 'employee_auth_key'], 'string', 'max' => 32],
[['employee_convict_description'], 'string', 'max' => 1024],
[['employee_registration_code'], 'unique'],
[['EmployeeQualifications[0]'],'required'],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'employee_id' => 'Employee ID',
'employee_title' => 'Employee Title',
'employee_firstname' => 'First name',
'employee_lastname' => 'Last name',
'employee_workpermit' => 'Employee Workpermit',
'employee_email' => 'Employee Email',
'employee_phone' => 'Employee Phone',
'employee_mobile' => 'Employee Mobile',
'employee_address' => 'Employee Address',
'employee_town' => 'Employee Town',
'employee_country' => 'Employee Country',
'employee_postcode' => 'Employee Postcode',
'employee_convict' => 'Employee Convict',
'employee_convict_description' => 'Employee Convict Description',
'employee_med_examination' => 'Employee Med Examination',
'employee_declaration' => 'Employee Declaration',
'employee_nationality' => 'Employee Nationality',
'employee_nino' => 'Employee Nino',
'employee_nonino' => 'Employee Nonino',
'employee_dob' => 'Employee Dob',
'employee_marital_status' => 'Employee Marital Status',
'employee_bank_holder_name' => 'Employee Bank Holder Name',
'employee_bank_name' => 'Employee Bank Name',
'employee_bank_sortcode' => 'Employee Bank Sortcode',
'employee_bank_account_number' => 'Employee Bank Account Number',
'employee_nobank' => 'Employee Nobank',
'employee_kin_firstname' => 'Employee Kin Firstname',
'employee_kin_lastname' => 'Employee Kin Lastname',
'employee_kin_contactno' => 'Employee Kin Contactno',
'employee_kin_relationship' => 'Employee Kin Relationship',
'employee_kin_address' => 'Employee Kin Address',
'employee_kin_postcode' => 'Employee Kin Postcode',
'employee_details_held' => 'Employee Details Held',
'employee_absence_days' => 'Employee Absence Days',
'employee_absence_periods' => 'Employee Absence Periods',
'employee_medication' => 'Employee Medication',
'employee_treatment' => 'Employee Treatment',
'employee_injury' => 'Employee Injury',
'employee_disability' => 'Employee Disability',
'employee_worktime' => 'Employee Worktime',
'employee_status' => 'Employee Status',
'employee_registration_code' => 'Employee Registration Code',
'employee_password' => 'Employee Password',
'employee_registration_date' => 'Employee Registration Date',
'employee_edit_date' => 'Employee Edit Date',
'employee_auth_key' => 'Employee Auth Key',
'employee_passwordreset_token' => 'Employee Passwordreset Token',
];
}
/**
* @return \yii\db\ActiveQuery
*/
public function getCompetenceLanguages()
{
return $this->hasMany(CompetenceLanguages::className(), ['competence_owner' => 'employee_id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getEmployeeAvailabilities()
{
return $this->hasMany(EmployeeAvailability::className(), ['employee_availability_owner' => 'employee_id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getEmployeeQualifications()
{
return $this->hasMany(EmployeeQualifications::className(), ['employee_qualification_owner_id' => 'employee_id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getEmployeeReferences()
{
return $this->hasMany(EmployeeReferences::className(), ['reference_owner_id' => 'employee_id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getEmployeeTitle()
{
return $this->hasOne(TitlesList::className(), ['title_id' => 'employee_title']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getEmployeeCountry()
{
return $this->hasOne(Countries::className(), ['country_id' => 'employee_country']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getEmployeeStatus()
{
return $this->hasOne(EmployeeStatuses::className(), ['status_id' => 'employee_status']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getEmployeeMaritalStatus()
{
return $this->hasOne(MaritalStatuses::className(), ['marital_status_id' => 'employee_marital_status']);
}
public static function createMultiple($modelClass, $multipleModels=null)
{
$model = new $modelClass;
$formName = $model->formName();
$post = Yii::$app->request->post($formName);
$models = [];
$flag = false;
if ($multipleModels !== null && is_array($multipleModels) && !empty($multipleModels)) {
$keys = array_keys(ArrayHelper::map($multipleModels, 'id', 'id'));
$multipleModels = array_combine($keys, $multipleModels);
$flag = true;
}
if ($post && is_array($post)) {
foreach ($post as $i => $item) {
if ($flag) {
if (isset($item['id']) && !empty($item['id']) && isset($multipleModels[$item['id']])) {
$models[] = $multipleModels[$item['id']];
} else {
$models[] = new $modelClass;
}
} else {
$models[] = new $modelClass;
}
}
}
unset($model, $formName, $post);
return $models;
}
}
models\EmployeeQualifications.php
<?php
namespace frontend\models;
use Yii;
/**
* This is the model class for table "employee_qualifications".
*
* @property integer $idemployee_qualification_id
* @property integer $employee_qualification_owner_id
* @property integer $employee_qualification_position
* @property string $employee_qualification_start_date
* @property string $employee_qualification_end_date
* @property string $employee_qualification_reason
* @property string $employee_qualification_organisation
* @property string $employee_qualification_town
* @property integer $employee_qualification_country
*
* @property Employees $employeeQualificationOwner
* @property Positions $employeeQualificationPosition
* @property Countries $employeeQualificationCountry
*/
class EmployeeQualifications extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'employee_qualifications';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['employee_qualification_owner_id', 'employee_qualification_position', 'employee_qualification_start_date', 'employee_qualification_end_date', 'employee_qualification_country'], 'required'],
[['employee_qualification_owner_id', 'employee_qualification_position', 'employee_qualification_country'], 'integer'],
[['employee_qualification_start_date', 'employee_qualification_end_date', 'employee_qualification_reason', 'employee_qualification_organisation', 'employee_qualification_town'], 'string', 'max' => 255]
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'employee_qualification_id' => 'Qualification ID',
'employee_qualification_owner_id' => 'Employee Qualification Owner ID',
'employee_qualification_position' => 'Employee Qualification Position',
'employee_qualification_start_date' => 'Employee Qualification Start Date',
'employee_qualification_end_date' => 'Employee Qualification End Date',
'employee_qualification_reason' => 'Employee Qualification Reason',
'employee_qualification_organisation' => 'Employee Qualification Organisation',
'employee_qualification_town' => 'Employee Qualification Town',
'employee_qualification_country' => 'Employee Qualification Country',
];
}
/**
* @return \yii\db\ActiveQuery
*/
public function getEmployeeQualificationOwner()
{
return $this->hasOne(Employees::className(), ['employee_id' => 'employee_qualification_owner_id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getEmployeeQualificationPosition()
{
return $this->hasOne(Positions::className(), ['position_id' => 'employee_qualification_position']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getEmployeeQualificationCountry()
{
return $this->hasOne(Countries::className(), ['country_id' => 'employee_qualification_country']);
}
}
views\employees\registrationstepone.php
<?php
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use yii\helpers\URL;
use yii\widgets\ActiveForm;
use frontend\models\TitlesList;
use frontend\models\Yesorno;
use frontend\models\EmployeeQualifications;
use wbraganca\dynamicform\DynamicFormWidget;
?>
<?php
$form = ActiveForm::begin(['id'=>'registration-step-1','options'=>['class'=>'form-block']]);
?>
<?php
$titleslist = ArrayHelper::map(TitlesList::find()->orderBy('title_order')->all(), 'title_id', 'title_name');
$yesornolist = ArrayHelper::map(Yesorno::find()->orderBy('yesorno_order')->all(), 'yesorno_id', 'yesorno_name');
$yesornolist = ArrayHelper::map(Yesorno::find()->orderBy('yesorno_order')->all(), 'yesorno_id', 'yesorno_name');
?>
<?= Html::activeDropDownList($modelEmployee, 'employee_title', $titleslist, array('class'=>'form-control','prompt'=>'Please Select Title')) ?>
<?= $form -> field ($modelEmployee,'employee_firstname') ?>
<?= $form -> field ($modelEmployee,'employee_lastname') ?>
<?= $form -> field ($modelEmployee,'employee_workpermit')->radiolist($yesornolist,['itemOptions' => ['class' =>'radio-inline']]) ?>
<p>Contact Information</p>
<?= $form -> field ($modelEmployee,'employee_email') ?>
<?= $form -> field ($modelEmployee,'employee_phone') ?>
<?= $form -> field ($modelEmployee,'employee_mobile') ?>
<?= $form -> field ($modelEmployee,'employee_address') ?>
<?= $form -> field ($modelEmployee,'employee_town') ?>
<?= $form -> field ($modelEmployee,'employee_country') ?>
<?= $form -> field ($modelEmployee,'employee_postcode') ?>
<p>Education</p>
<?
//echo $form -> field ($modelEmployee,'employeeQualifications')
?>
<?php DynamicFormWidget::begin([
'dynamicItems' => '#form-qualifications',
'dynamicItem' => '.form-qualifications-item',
'model' => $modelsQualifications[0],
'formId' => 'dynamic-form',
'formFields' => [
'employee_qualification_position',
'employee_qualification_start_date',
'employee_qualification_end_date',
'employee_qualification_reason',
'employee_qualification_organisation',
'employee_qualification_town',
'employee_qualification_country',
],
'options' => [
'limit' => 4, // the maximum times, an element can be cloned (default 999)
]
]); ?>
<div id="form-qualifications">
<?php foreach ($modelsQualifications as $i => $modelQualifications): ?>
<div class="form-qualifications-item panel panel-default">
<div class="panel-heading">
<h3 class="panel-title pull-left">Qualifications</h3>
<div class="pull-right">
<button type="button" class="clone btn btn-success btn-xs"><i class="glyphicon glyphicon-plus"></i></button>
<button type="button" class="delete btn btn-danger btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
</div>
<div class="clearfix"></div>
</div>
<div class="panel-body">
<?php
// necessary for update action.
if (!$modelQualifications->isNewRecord) {
echo Html::activeHiddenInput($modelQualifications, "[{$i}]id");
}
?>
<?= $form->field($modelQualifications, "[{$i}]employee_qualification_position")->textInput(['maxlength' => 64]) ?>
<div class="row">
<div class="col-sm-6">
<?php echo $form->field($modelQualifications, "[{$i}]employee_qualification_start_date")->textInput(['maxlength' => 128]) ?>
<? //yii\jui\DatePicker::widget(['name' => '[{'.$i.'}]employee_qualification_start_date', 'clientOptions' => ['defaultDate' => '2014-01-01']]) ?>
</div>
<div class="col-sm-6">
<?= $form->field($modelQualifications, "[{$i}]employee_qualification_end_date")->textInput(['maxlength' => 128]) ?>
</div>
</div><!-- .row -->
<div class="row">
<div class="col-sm-4">
<?= $form->field($modelQualifications, "[{$i}]employee_qualification_reason")->textInput(['maxlength' => 64]) ?>
</div>
<div class="col-sm-4">
<? //$form->field($modelQualifications, "[{$i}]employee_qualification_organisation")->textInput(['maxlength' => 32]) ?>
</div>
<div class="col-sm-4">
<?= $form->field($modelQualifications, "[{$i}]employee_qualification_town")->textInput(['maxlength' => 15]) ?>
</div>
<div class="col-sm-4">
<?= $form->field($modelQualifications, "[{$i}]employee_qualification_country")->textInput(['maxlength' => 15]) ?>
</div>
</div><!-- .row -->
</div>
</div>
<?php endforeach; ?>
</div>
<?php DynamicFormWidget::end(); ?>
<?php
echo Html::input('button','btn_add','Add More',[
'onclick'=>'$.post( "' . Yii::$app->urlManager->createUrl(['employeequalifications/create', 'i'=>'']).'"+$("#counter").val(),
function( data ){
var val = $("#counter").val();
$( "#counter" ).val( parseInt(val) + 1 );
$( "div#newlyaddedfields" ).append( data );
$( "div#newlyaddedfields" ).wrap( "<div class=\'new\'></div>" );
});
',//onclick end
]); ?>
<?= yii\jui\DatePicker::widget(['name' => 'employee_qualification_start_date', 'clientOptions' => ['defaultDate' => '2014-01-01']]) ?>
<?php echo Html::hiddenInput('counter',0,['id'=>'counter',]); ?>
<div id="newlyaddedfields">
</div>
<?php
Html::a('Your Link name','controller/action', [
'title' => Yii::t('yii', 'Close'),
'onclick'=>"$('#close').dialog('open');
$.ajax({
type :'POST',
cache : false,
url : 'controller/action',
success : function(response) {
$('#close').html(response);
}
});return false;",
]);
?>
<?= Html::a('Add', null, [
'class' => 'btn btn-success',
'data' => [
'toggle' => 'reroute',
'action' => Url::toRoute(['addresses/create', 'employee_id' => $modelEmployee->employee_id])
]
]) ?>
<?= Html::a('Remove', null, [
'class' => 'btn btn-danger',
'data' => [
'toggle' => 'reroute',
'action' => Url::toRoute(['addresses/delete', 'employee_id' => $variable->employee_id])
]
]) ?>
<p>Employment in the last two years</p>
<p>Languages</p>
<p>Additional information</p>
<div class="form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
</div>
<?php
ActiveForm::end();
?>
from yii2-dynamicform.
change
'formId' => 'dynamic-form'
To
'formId' => 'registration-step-1'
from yii2-dynamicform.
It is working!!!
Sorry, stupid me :)
Thank you so much for your time!!!
from yii2-dynamicform.
Suggestions:
Remove the "createMultiple" method of model "Employees" and add in a class that inherits from the \yii\base\Model.
Example:
Directory: app\base\Model.php
<?php
namespace app\base;
use Yii;
use yii\helpers\ArrayHelper;
class Model extends \yii\base\Model
{
public static function createMultiple($modelClass, $multipleModels=null)
{
$model = new $modelClass;
$formName = $model->formName();
$post = Yii::$app->request->post($formName);
$models = [];
$flag = false;
if ($multipleModels !== null && is_array($multipleModels) && !empty($multipleModels)) {
$keys = array_keys(ArrayHelper::map($multipleModels, 'id', 'id'));
$multipleModels = array_combine($keys, $multipleModels);
$flag = true;
}
if ($post && is_array($post)) {
foreach ($post as $i => $item) {
if ($flag) {
if (isset($item['id']) && !empty($item['id']) && isset($multipleModels[$item['id']])) {
$models[] = $multipleModels[$item['id']];
} else {
$models[] = new $modelClass;
}
} else {
$models[] = new $modelClass;
}
}
}
unset($model, $formName, $post);
return $models;
}
}
from yii2-dynamicform.
I have problem with update in dynamic forms. Please help me...I'm beginner in php
This is my actionupdate
public function actionUpdate($id) {
$model = $this->findModel($id);
$modelsCtel = $model->ctels;
$modelsDvr = $model->dvrs;
if ($model->load(Yii::$app->request->post()) && $model->save()) {
$oldIDs = ArrayHelper::map($modelsCtel, 'id', 'id');
$oldIDs = ArrayHelper::map($modelsDvr, 'id', 'id');
$modelsCtel = Model::createMultiple(Ctel::classname(), $modelsCtel);
Model::loadMultiple($modelsCtel, Yii::$app->request->post());
$modelsDvr = Model::createMultiple(Dvr::classname(), $modelsDvr);
Model::loadMultiple($modelsDvr, Yii::$app->request->post());
$deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($modelsCtel, 'id', 'id')));
$deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($modelsDvr, 'id', 'id')));
// ajax validation
// validate all models
$valid = $model->validate();
$valid = Model::validateMultiple($modelsCtel) && $valid;
$valid = Model::validateMultiple($modelsDvr) && $valid;
if ($valid) {
$transaction = \Yii::$app->db->beginTransaction();
try {
if ($flag = $model->save(false)) {
if (! empty($deletedIDs)) {
Ctel::deleteAll(['id' => $deletedIDs]);
}
if (! empty($deletedIDs)) {
Dvr::deleteAll(['id' => $deletedIDs]);
}
foreach ($modelsCtel as $modelCtel) {
$modelCtel->id_client = $model->id;
if (!($flag = $modelCtel->save(false))) {
$transaction->rollBack();
break;
}
}
foreach ($modelsDvr as $modelDvr) {
$modelDvr->id_client = $model->id;
if (!($flag = $modelDvr->save(false))) {
$transaction->rollBack();
break;
}
}
}
if ($flag) {
$transaction->commit();
return $this->redirect(['view', 'id' => $model->id]);
}
} catch (Exception $e) {
$transaction->rollBack();
}
}
} else {
return $this->render('update', [
'model' => $model,
'modelsCtel' => (empty($modelsCtel)) ? [new Ctel] : $modelsCtel,
'modelsDvr' =>(empty($modelsDvr)) ? [new Dvr] : $modelsDvr
]);
}
from yii2-dynamicform.
customer_id is required field and will fail on line Model.validateMultiple
from yii2-dynamicform.
Related Issues (20)
- Type Error Argument 1 passed to DOMDocument::importNode() must be an instance of DOMNode, null given HOT 1
- autocomplete and dynamic form
- Updating yii2 Select2 ID in yii2-dynamicform
- hide icon button of class="delete-item" if min 1 or more than 1 HOT 1
- explain $searchModel = new CustomerQuery() this line code for Nested dynamic forms Demo 1
- How to create controller in demo 1 (Nested Dynamic Form) HOT 2
- How to create controller in demo 1 (Nested Dynamic Form)
- Upload widget does not work - Dynamic form Yii2 starter kit HOT 2
- Ajax validation stop working after deleting any dynamic item HOT 1
- TreeViewInput widget from the karti-v/yii2-tree-manager does not work
- dropDownList and checkbox not reset value beforeInsert
- Inconsistency in dom ids
- Speed issues with Dynamic form
- Dynamic form behavior not working properly with javascript alert in yii2
- Uncaught TypeError: yiiActiveFormData is undefined
- dom-crawler bug with PHP 8.1: please use a newer version HOT 7
- Cant save in data in database using dynamic form in one model
- Cannot read properties of undefined (reading 'settings') HOT 1
- Select2 problem on nested
- Clone issue in update form HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from yii2-dynamicform.