Yii2动态形式

Yii2动态形式,yii,yii2,yii2-advanced-app,Yii,Yii2,Yii2 Advanced App,我正在为我自己的项目使用wbraganca的dynamicform示例代码。我的代码及其相应的错误如下 查看文件夹下的 _form.php <?php use yii\helpers\Html; use yii\widgets\ActiveForm; use yii\helpers\ArrayHelper; use frontend\models\Items; use frontend\models\Employees; use frontend\models\Departments;

我正在为我自己的项目使用wbraganca的
dynamicform
示例代码。我的代码及其相应的错误如下

查看文件夹下的

_form.php
<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper;
use frontend\models\Items;
use frontend\models\Employees;
use frontend\models\Departments;
use dosamigos\datepicker\DatePicker;
use wbraganca\dynamicform\DynamicFormWidget;     
/* @var $this yii\web\View */
/* @var $model backend\models\Borrow */
/* @var $form yii\widgets\ActiveForm */
$js = '
jQuery(".dynamicform_wrapper").on("afterInsert", function(e, item) {

jQuery(".dynamicform_wrapper .panel-title-address").each(function(index) {

    jQuery(this).html("Items: " + (index + 1))

  });

});
jQuery(".dynamicform_wrapper").on("afterDelete", function(e) {

jQuery(".dynamicform_wrapper .panel-title-address").each(function(index) {

    jQuery(this).html("Items: " + (index + 1))

});

 });

';

 $this->registerJs($js);?>
<div class="borrow-form">
<?php $form = ActiveForm::begin(['id'=>'dynamic-form']); ?>
       <div class="row">
            <div class="col-xs-4">
            <?= $form->field($model,'dept_id')->dropDownList(
                ArrayHelper::map(Departments::find()->all(),'id','dept_name'),
                ['prompt'=>'select departments'])
            ?>
        </div>
        <div class="col-xs-4">
            <?=$form->field($model, 'return_date')->widget(
                DatePicker::className(), [
                'inline' => false, 
                'clientOptions' => [
                'autoclose' => true,
                'format' => 'yyyy-mm-dd'
                ]
            ]);?>
        </div>
</div>  
<div class="padding-v-md">

    <div class="line line-dashed"></div>

</div>
<!-- beginning of dynamic form -->
<?php DynamicFormWidget::begin([
    'widgetContainer' => 'dynamicform_wrapper', // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
    'widgetBody' => '.container-items', // required: css class selector
    'widgetItem' => '.item', // required: css class
    'limit' => 10, // the maximum times, an element can be added (default 999)
    'min' => 1, // 0 or 1 (default 1)
    'insertButton' => '.add-item', // css class
    'deleteButton' => '.remove-item', // css class
    'model' => $modelsAddress[0],
    'formId' => 'dynamic-form',
    'formFields' => [
        'items_id',
        'unit',
        'request',
        'allowed',
    ],
]); ?>
<div class="panel panel-default">
    <div class="panel-heading">
        <h4><i class="glyphicon glyphicon-envelope"></i> Items              
        </h4>
    </div>
    <div class="panel-body">
        <div class="container-items"><!-- widgetBody -->
        <?php foreach ($modelsAddress as $i => $modelAddress): ?>
            <div class="item panel panel-default"><!-- widgetItem -->
                <div class="panel-heading">
                    <h3 class="panel-title pull-left">Items</h3>
                    <div class="pull-right">
                        <button type="button" class="add-item btn btn-success btn-xs"><i class="glyphicon glyphicon-plus"></i></button>
                        <button type="button" class="remove-item 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 (! $modelAddress->isNewRecord) {
                            echo Html::activeHiddenInput($modelAddress, "[{$i}]id");
                        }
                    ?>

                    <div class="row">
                        <div class="col-xs-4">
                            <?= $form->field($modelAddress, "[{$i}]items_id")->dropDownList(
                            ArrayHelper::map(Items::find()->all(),'id','item_name'),
                            ['prompt'=>'select items']) ?>
                        </div>
                        <div class="col-xs-2">
                            <?= $form->field($modelAddress, "[{$i}]unit")->textInput(['maxlength' => true]) ?>
                        </div>
                        <div class="col-xs-2">
                            <?= $form->field($modelAddress, "[{$i}]request")->textInput(['maxlength' => true]) ?>
                        </div>                        

                        <div class="col-xs-2">
                            <?= $form->field($modelAddress, "[{$i}]allowed")->textInput(['maxlength' => true]) ?>
                        </div>
                        <div class="col-xs-2">
                            <?= $form->field($modelAddress, "[{$i}]unit_price")->textInput(['maxlength' => true])  ?>

                        </div>
                    </div><!-- .row -->
                </div>
            </div>
        <?php endforeach; ?>
        </div>
    </div>
</div><!-- .panel -->
<?php DynamicFormWidget::end(); ?>
<!-- end dynamic form-->

<div class="row">
        <div class="col-xs-5">

            <?= $form->field($model,'emp_id')->dropDownList(
                    ArrayHelper::map(Employees::find()->all(),'id','emp_name'),
                    ['prompt'=>'select employees'])
             ?>
            <?= $form->field($model,'head_id')->dropDownList(
                    ArrayHelper::map(Employees::find()->all(),'id','emp_name'),
                    ['prompt'=>'select dept heads'])
             ?>
            <?= $form->field($model,'man_id')->dropDownList(
                    ArrayHelper::map(Employees::find()->all(),'id','emp_name'),
                    ['prompt'=>'select stoke managers'])
             ?>
            <?= $form->field($model,'keeper_id')->dropDownList(
                    ArrayHelper::map(Employees::find()->all(),'id','emp_name'),
                    ['prompt'=>'select stoke keepers'])
             ?>  
        </div>
        <div class="col-xs-5">

            <?=$form->field($model, 'emp_date')->widget(
                DatePicker::className(), [
                'inline' => false, 
                'clientOptions' => [
                'autoclose' => true,
                'format' => 'yyyy-mm-dd'
                ]
            ]);?>

            <?=$form->field($model, 'head_date')->widget(
                DatePicker::className(), [
                    'inline' => false, 
                    'clientOptions' => [
                    'autoclose' => true,
                    'format' => 'yyyy-mm-dd'
                    ]
            ]);?>

            <?=$form->field($model, 'man_date')->widget(
                DatePicker::className(), [
                    'inline' => false, 
                    'clientOptions' => [
                    'autoclose' => true,
                    'format' => 'yyyy-mm-dd'
                    ]
            ]);?>

            <?=$form->field($model, 'keeper_date')->widget(
                DatePicker::className(), [
                    'inline' => false, 
                    'clientOptions' => [
                    'autoclose' => true,
                    'format' => 'yyyy-mm-dd'
                    ]
            ]);?>
        </div>                  
    </div>  
<div class="form-group">
    <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>

<?php ActiveForm::end(); ?>  
public function actionCreate()
{
    $model = new Borrow();
    $modelsAddress = [new Borrow];
    if ($model->load(Yii::$app->request->post())) {


        $modelsAddress = Model::createMultiple(Borrow::classname());

        Model::loadMultiple($modelsAddress, Yii::$app->request->post());


        // validate all models

        $valid = $model->validate();

        $valid = Model::validateMultiple($modelsAddress) && $valid;


        if ($valid) {

            $transaction = \Yii::$app->db->beginTransaction();


            try {

                if ($flag = $model->save(false)) {

                    foreach ($modelsAddress as $modelAddress) {

                        $modelAddress->id = $model->id;

                        if (! ($flag = $modelAddress->save(false))) {

                            $transaction->rollBack();

                            break;

                        }

                    }

                }


                if ($flag) {

                    $transaction->commit();

                    return $this->redirect(['view', 'id' => $model->id]);

                }

            } catch (Exception $e) {

                $transaction->rollBack();

            }

        }

    }


    return $this->render('create', [

        'model' => $model,

        'modelsAddress' => (empty($modelsAddress)) ? [new Address] : $modelsAddress

    ]);
}
<?php
namespace frontend\models;

use Yii;
use yii\helpers\ArrayHelper;

class Model extends \yii\base\Model
 {
/**
 * Creates and populates a set of models.
 *
 * @param string $modelClass
 * @param array $multipleModels
 * @return array
 */
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 => $borrow) {
            if (isset($borrow['id']) && !empty($borrow['id']) && isset($multipleModels[$borrow['id']])) {
                $models[] = $multipleModels[$borrow['id']];
            } else {
                $models[] = new $modelClass;
            }
        }
    }

    unset($model, $formName, $post);

    return $models;
 }
}

模型文件夹下的模型类

_form.php
<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper;
use frontend\models\Items;
use frontend\models\Employees;
use frontend\models\Departments;
use dosamigos\datepicker\DatePicker;
use wbraganca\dynamicform\DynamicFormWidget;     
/* @var $this yii\web\View */
/* @var $model backend\models\Borrow */
/* @var $form yii\widgets\ActiveForm */
$js = '
jQuery(".dynamicform_wrapper").on("afterInsert", function(e, item) {

jQuery(".dynamicform_wrapper .panel-title-address").each(function(index) {

    jQuery(this).html("Items: " + (index + 1))

  });

});
jQuery(".dynamicform_wrapper").on("afterDelete", function(e) {

jQuery(".dynamicform_wrapper .panel-title-address").each(function(index) {

    jQuery(this).html("Items: " + (index + 1))

});

 });

';

 $this->registerJs($js);?>
<div class="borrow-form">
<?php $form = ActiveForm::begin(['id'=>'dynamic-form']); ?>
       <div class="row">
            <div class="col-xs-4">
            <?= $form->field($model,'dept_id')->dropDownList(
                ArrayHelper::map(Departments::find()->all(),'id','dept_name'),
                ['prompt'=>'select departments'])
            ?>
        </div>
        <div class="col-xs-4">
            <?=$form->field($model, 'return_date')->widget(
                DatePicker::className(), [
                'inline' => false, 
                'clientOptions' => [
                'autoclose' => true,
                'format' => 'yyyy-mm-dd'
                ]
            ]);?>
        </div>
</div>  
<div class="padding-v-md">

    <div class="line line-dashed"></div>

</div>
<!-- beginning of dynamic form -->
<?php DynamicFormWidget::begin([
    'widgetContainer' => 'dynamicform_wrapper', // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
    'widgetBody' => '.container-items', // required: css class selector
    'widgetItem' => '.item', // required: css class
    'limit' => 10, // the maximum times, an element can be added (default 999)
    'min' => 1, // 0 or 1 (default 1)
    'insertButton' => '.add-item', // css class
    'deleteButton' => '.remove-item', // css class
    'model' => $modelsAddress[0],
    'formId' => 'dynamic-form',
    'formFields' => [
        'items_id',
        'unit',
        'request',
        'allowed',
    ],
]); ?>
<div class="panel panel-default">
    <div class="panel-heading">
        <h4><i class="glyphicon glyphicon-envelope"></i> Items              
        </h4>
    </div>
    <div class="panel-body">
        <div class="container-items"><!-- widgetBody -->
        <?php foreach ($modelsAddress as $i => $modelAddress): ?>
            <div class="item panel panel-default"><!-- widgetItem -->
                <div class="panel-heading">
                    <h3 class="panel-title pull-left">Items</h3>
                    <div class="pull-right">
                        <button type="button" class="add-item btn btn-success btn-xs"><i class="glyphicon glyphicon-plus"></i></button>
                        <button type="button" class="remove-item 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 (! $modelAddress->isNewRecord) {
                            echo Html::activeHiddenInput($modelAddress, "[{$i}]id");
                        }
                    ?>

                    <div class="row">
                        <div class="col-xs-4">
                            <?= $form->field($modelAddress, "[{$i}]items_id")->dropDownList(
                            ArrayHelper::map(Items::find()->all(),'id','item_name'),
                            ['prompt'=>'select items']) ?>
                        </div>
                        <div class="col-xs-2">
                            <?= $form->field($modelAddress, "[{$i}]unit")->textInput(['maxlength' => true]) ?>
                        </div>
                        <div class="col-xs-2">
                            <?= $form->field($modelAddress, "[{$i}]request")->textInput(['maxlength' => true]) ?>
                        </div>                        

                        <div class="col-xs-2">
                            <?= $form->field($modelAddress, "[{$i}]allowed")->textInput(['maxlength' => true]) ?>
                        </div>
                        <div class="col-xs-2">
                            <?= $form->field($modelAddress, "[{$i}]unit_price")->textInput(['maxlength' => true])  ?>

                        </div>
                    </div><!-- .row -->
                </div>
            </div>
        <?php endforeach; ?>
        </div>
    </div>
</div><!-- .panel -->
<?php DynamicFormWidget::end(); ?>
<!-- end dynamic form-->

<div class="row">
        <div class="col-xs-5">

            <?= $form->field($model,'emp_id')->dropDownList(
                    ArrayHelper::map(Employees::find()->all(),'id','emp_name'),
                    ['prompt'=>'select employees'])
             ?>
            <?= $form->field($model,'head_id')->dropDownList(
                    ArrayHelper::map(Employees::find()->all(),'id','emp_name'),
                    ['prompt'=>'select dept heads'])
             ?>
            <?= $form->field($model,'man_id')->dropDownList(
                    ArrayHelper::map(Employees::find()->all(),'id','emp_name'),
                    ['prompt'=>'select stoke managers'])
             ?>
            <?= $form->field($model,'keeper_id')->dropDownList(
                    ArrayHelper::map(Employees::find()->all(),'id','emp_name'),
                    ['prompt'=>'select stoke keepers'])
             ?>  
        </div>
        <div class="col-xs-5">

            <?=$form->field($model, 'emp_date')->widget(
                DatePicker::className(), [
                'inline' => false, 
                'clientOptions' => [
                'autoclose' => true,
                'format' => 'yyyy-mm-dd'
                ]
            ]);?>

            <?=$form->field($model, 'head_date')->widget(
                DatePicker::className(), [
                    'inline' => false, 
                    'clientOptions' => [
                    'autoclose' => true,
                    'format' => 'yyyy-mm-dd'
                    ]
            ]);?>

            <?=$form->field($model, 'man_date')->widget(
                DatePicker::className(), [
                    'inline' => false, 
                    'clientOptions' => [
                    'autoclose' => true,
                    'format' => 'yyyy-mm-dd'
                    ]
            ]);?>

            <?=$form->field($model, 'keeper_date')->widget(
                DatePicker::className(), [
                    'inline' => false, 
                    'clientOptions' => [
                    'autoclose' => true,
                    'format' => 'yyyy-mm-dd'
                    ]
            ]);?>
        </div>                  
    </div>  
<div class="form-group">
    <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>

<?php ActiveForm::end(); ?>  
public function actionCreate()
{
    $model = new Borrow();
    $modelsAddress = [new Borrow];
    if ($model->load(Yii::$app->request->post())) {


        $modelsAddress = Model::createMultiple(Borrow::classname());

        Model::loadMultiple($modelsAddress, Yii::$app->request->post());


        // validate all models

        $valid = $model->validate();

        $valid = Model::validateMultiple($modelsAddress) && $valid;


        if ($valid) {

            $transaction = \Yii::$app->db->beginTransaction();


            try {

                if ($flag = $model->save(false)) {

                    foreach ($modelsAddress as $modelAddress) {

                        $modelAddress->id = $model->id;

                        if (! ($flag = $modelAddress->save(false))) {

                            $transaction->rollBack();

                            break;

                        }

                    }

                }


                if ($flag) {

                    $transaction->commit();

                    return $this->redirect(['view', 'id' => $model->id]);

                }

            } catch (Exception $e) {

                $transaction->rollBack();

            }

        }

    }


    return $this->render('create', [

        'model' => $model,

        'modelsAddress' => (empty($modelsAddress)) ? [new Address] : $modelsAddress

    ]);
}
<?php
namespace frontend\models;

use Yii;
use yii\helpers\ArrayHelper;

class Model extends \yii\base\Model
 {
/**
 * Creates and populates a set of models.
 *
 * @param string $modelClass
 * @param array $multipleModels
 * @return array
 */
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 => $borrow) {
            if (isset($borrow['id']) && !empty($borrow['id']) && isset($multipleModels[$borrow['id']])) {
                $models[] = $multipleModels[$borrow['id']];
            } else {
                $models[] = new $modelClass;
            }
        }
    }

    unset($model, $formName, $post);

    return $models;
 }
}

看起来您在控制器中没有命名
frontend\models\Model

在开头添加:

use frontend\models\Model;

控制器中似乎没有名称空间
frontend\models\Model

在开头添加:

use frontend\models\Model;

哇,太谢谢你了!!!没有致命错误,但它无法将数据插入数据库,也无法检索到网格视图。非常感谢,现在它看起来很好,但在我插入数据时,它会将null插入数据库,并检索到网格视图的null值。需要帮忙吗?谢谢这是另一个问题。请为其创建新问题。如果对您有帮助,请将此答案标记为已接受。感谢您的快速重播。我为上述问题创建了一个新问题。但是我仍然在等待你的帮助。谢谢。哇,太感谢了!!!没有致命错误,但它无法将数据插入数据库,也无法检索到网格视图。非常感谢,现在它看起来很好,但在我插入数据时,它会将null插入数据库,并检索到网格视图的null值。需要帮忙吗?谢谢这是另一个问题。请为其创建新问题。如果对您有帮助,请将此答案标记为已接受。感谢您的快速重播。我为上述问题创建了一个新问题。但是我仍然在等待您的帮助。谢谢。非常感谢,现在看起来很好,但是当我插入数据时,会将null插入数据库,并将null值检索到网格视图。需要帮忙吗?非常感谢,现在看起来很好,但是当我插入数据时,会将null插入数据库,并将null值检索到网格视图。需要帮忙吗?谢谢