2016-11-28 67 views
0

我正在使用wbraganca的dynamicform樣本代碼爲我自己的項目。我的代碼及其相應的錯誤如下。Yii2動態表格

下視圖文件夾

_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; 
} 
} 

運行我的代碼,它提供了以下錯誤: PHP Fatal Error – yii\base\ErrorException Class 'frontend\controllers\Model' not found,如下圖所示。

Image

+0

感謝很多現在看來不錯,但是當我插入數據是空插入到數據庫和檢索空值的網格視圖。 請幫忙嗎? 謝謝 – hafhag

回答

0

它看起來像你有沒有在控制器命名空間frontend\models\Model

開頭添加有:

use frontend\models\Model; 
+0

太謝謝了太多了!!!沒有致命錯誤,但它無法將數據插入到數據庫,並且無法檢索到網格視圖。 – hafhag

+0

非常感謝,現在看起來不錯,但是當我插入數據時,它向數據庫插入空值並將空值檢索到網格視圖。 請幫忙嗎? 謝謝 – hafhag

+0

這是不同的問題。請爲它創建新的問題。如果這個答案對您有所幫助,請將其標記爲已接受。 – Bizley