PHP code example of desenvolvedorindie / yii2-dynamicform
1. Go to this page and download the library: Download desenvolvedorindie/yii2-dynamicform library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once ('vendor/autoload.php' );
desenvolvedorindie / yii2-dynamicform example snippets
use yii \helpers \Html ;
use yii \widgets \ActiveForm ;
use wbraganca \dynamicform \DynamicFormWidget ;
namespace app \controllers ;
use Yii ;
use app \models \Customer ;
use app \models \CustomerSearch ;
use app \models \Address ;
use yii \web \Controller ;
use yii \web \NotFoundHttpException ;
use yii \filters \VerbFilter ;
use app \base \Model ;
use yii \web \Response ;
use yii \widgets \ActiveForm ;
use yii \helpers \ArrayHelper ;
class CustomerController extends Controller
{
...
public function actionCreate ()
{
$modelCustomer = new Customer;
$modelsAddress = [new Address];
if ($modelCustomer->load(Yii::$app->request->post())) {
$modelsAddress = Model::createMultiple(Address::classname());
Model::loadMultiple($modelsAddress, Yii::$app->request->post());
if (Yii::$app->request->isAjax) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ArrayHelper::merge(
ActiveForm::validateMultiple($modelsAddress),
ActiveForm::validate($modelCustomer)
);
}
$valid = $modelCustomer->validate();
$valid = Model::validateMultiple($modelsAddress) && $valid;
if ($valid) {
$transaction = \Yii::$app->db->beginTransaction();
try {
if ($flag = $modelCustomer->save(false )) {
foreach ($modelsAddress as $modelAddress) {
$modelAddress->customer_id = $modelCustomer->id;
if (! ($flag = $modelAddress->save(false ))) {
$transaction->rollBack();
break ;
}
}
}
if ($flag) {
$transaction->commit();
return $this ->redirect(['view' , 'id' => $modelCustomer->id]);
}
} catch (Exception $e) {
$transaction->rollBack();
}
}
}
return $this ->render('create' , [
'modelCustomer' => $modelCustomer,
'modelsAddress' => (empty ($modelsAddress)) ? [new Address] : $modelsAddress
]);
}
public function actionUpdate ($id)
{
$modelCustomer = $this ->findModel($id);
$modelsAddress = $modelCustomer->addresses;
if ($modelCustomer->load(Yii::$app->request->post())) {
$oldIDs = ArrayHelper::map($modelsAddress, 'id' , 'id' );
$modelsAddress = Model::createMultiple(Address::classname(), $modelsAddress);
Model::loadMultiple($modelsAddress, Yii::$app->request->post());
$deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($modelsAddress, 'id' , 'id' )));
if (Yii::$app->request->isAjax) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ArrayHelper::merge(
ActiveForm::validateMultiple($modelsAddress),
ActiveForm::validate($modelCustomer)
);
}
$valid = $modelCustomer->validate();
$valid = Model::validateMultiple($modelsAddress) && $valid;
if ($valid) {
$transaction = \Yii::$app->db->beginTransaction();
try {
if ($flag = $modelCustomer->save(false )) {
if (! empty ($deletedIDs)) {
Address::deleteAll(['id' => $deletedIDs]);
}
foreach ($modelsAddress as $modelAddress) {
$modelAddress->customer_id = $modelCustomer->id;
if (! ($flag = $modelAddress->save(false ))) {
$transaction->rollBack();
break ;
}
}
}
if ($flag) {
$transaction->commit();
return $this ->redirect(['view' , 'id' => $modelCustomer->id]);
}
} catch (Exception $e) {
$transaction->rollBack();
}
}
}
return $this ->render('update' , [
'modelCustomer' => $modelCustomer,
'modelsAddress' => (empty ($modelsAddress)) ? [new Address] : $modelsAddress
]);
}
...
}
namespace app \base ;
use Yii ;
use yii \helpers \ArrayHelper ;
class Model extends \yii \base \Model
{
public static function createMultiple ($modelClass, $multipleModels = [])
{
$model = new $modelClass;
$formName = $model->formName();
$post = Yii::$app->request->post($formName);
$models = [];
if (! empty ($multipleModels)) {
$keys = array_keys(ArrayHelper::map($multipleModels, 'id' , 'id' ));
$multipleModels = array_combine($keys, $multipleModels);
}
if ($post && is_array($post)) {
foreach ($post as $i => $item) {
if (isset ($item['id' ]) && !empty ($item['id' ]) && isset ($multipleModels[$item['id' ]])) {
$models[] = $multipleModels[$item['id' ]];
} else {
$models[] = new $modelClass;
}
}
}
unset ($model, $formName, $post);
return $models;
}
}
use yii \helpers \Html ;
use yii \widgets \ActiveForm ;
use wbraganca \dynamicform \DynamicFormWidget ;
php composer.phar