2017-09-07 1 views
0

nach meiner letzten Frage Ich habe an einer Rechnung in yii2 gearbeitet und kam über ein neues Problem. nachdem Sie das Formular ausfüllen und klicken Sie auf Erstellen es nicht wirklich etwas außer das Aktualisieren der Seite und das Löschen der Produktfelder, aber die persönlichen Informationen wie Firmenname und Datum ect ist nach der Aktualisierung immer noch ausgefüllt ... auch wenn ich überprüfe In der Datenbank ist nichts passiert. Könnten Sie sich bitte den folgenden Code ansehen?YII2 create Funktion sendet keine Daten an die Datenbank

das Rechnungsformular

<?php 

use yii\helpers\Html; 
use yii\widgets\ActiveForm; 
use wbraganca\dynamicform\DynamicFormWidget; 
use kartik\datecontrol\Module; 
use kartik\datecontrol\DateControl; 
use kartik\select2\Select2; 
use yii\helpers\ArrayHelper; 
use app\models\Companies; 
use app\models\Spokepersons; 



/* @var $this yii\web\View */ 
/* @var $model app\models\Facturen */ 
/* @var $form yii\widgets\ActiveForm */ 
?> 

<div class="facturen-form"> 

    <?php $form = ActiveForm::begin(['id' => 'dynamic-form']); ?> 

    <?= $form->field($model, 'company_name')->widget(Select2::classname(), [ 
    'data' => ArrayHelper::map(Companies::find()->all(), 'company_id', 'company_name'), 
    'language' => 'nl', 
    'options' => ['placeholder' => 'Selecteer een bedrijf'], 
    'pluginOptions' => [ 
     'allowClear' => true 
    ], 
])?> 

    <?= $form->field($model, 'spokes_person')->widget(Select2::classname(), [ 
    'data' => ArrayHelper::map(Spokepersons::find()->all(), 'person_id', 'first_name'), 
    'language' => 'nl', 
    'options' => ['placeholder' => 'Selecteer een contactpersoon'], 
    'pluginOptions' => [ 
     'allowClear' => true 
    ], 
])?> 

    <?= $form->field($model, 'date')->widget(DateControl::classname(), [ 
    'type' => 'date', 
    'ajaxConversion' => true, 
    'autoWidget' => true, 
    'widgetClass' => '', 
    'displayFormat' => 'php:d-F-Y', 
    'saveFormat' => 'php:Y-m-d', 
    'saveTimezone' => 'UTC', 
    'displayTimezone' => 'Europe/Amsterdam', 
    'saveOptions' => [ 
     //'label' => 'Input saved as: ', 
     // 'type' => 'text', 
     'readonly' => true, 
     'class' => 'hint-input text-muted' 
    ], 
    'widgetOptions' => [ 
     'pluginOptions' => [ 
      'autoclose' => true, 
      'format' => 'php:d-F-Y' 
     ] 
    ], 
    'language' => 'nl' 
]) ?> 

    <div class="row"> 
     <div class="panel-body"> 
      <?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' => 999, // the maximum times, an element can be cloned (default 999) 
       'min' => 1, // 0 or 1 (default 1) 
       'insertButton' => '.add-item', // css class 
       'deleteButton' => '.remove-item', // css class 
       'model' => $modelProducten[0], 
       'formId' => 'dynamic-form', 
       'formFields' => [ 
        'product_id', 
        'product_name', 
        'amount', 
        'price', 
       ], 
      ]); ?> 

      <div class="container-items"><!-- widgetContainer --> 
      <?php foreach ($modelProducten as $i => $modelProduct): ?> 
       <div class="item panel panel-default"><!-- widgetBody --> 
        <div class="panel-heading"> 
         <label class="panel-title pull-left">Product</label> 
         <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 (! $modelProduct->isNewRecord) { 
           echo Html::activeHiddenInput($modelProduct, "[{$i}]id"); 
          } 
         ?> 
         <div class="row"> 
          <div class="col-sm-3"> 
         <?= $form->field($modelProduct, "[{$i}]product_id")->textInput(['maxlength' => true]) ?> 
          </div> 
          <div class="col-sm-3"> 
           <?= $form->field($modelProduct, "[{$i}]product_name")->textInput(['maxlength' => true]) ?> 
          </div> 
          <div class="col-sm-3"> 
           <?= $form->field($modelProduct, "[{$i}]amount")->textInput(['maxlength' => true]) ?> 
          </div> 
          <div class="col-sm-3"> 
           <?= $form->field($modelProduct, "[{$i}]price")->textInput(['maxlength' => true]) ?> 
          </div> 
         </div><!-- .row --> 
        </div> 
       </div> 
      <?php endforeach; ?> 
      </div> 
      <?php DynamicFormWidget::end(); ?> 
     </div> 

    <div class="form-group"> 
     <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => 'btn btn-primary']) ?> 
    </div> 

    <?php ActiveForm::end(); ?> 

</div> 
</div> 

Ich dachte, dies ist nicht das Problem, weil die Form Werke war aber immer noch kann es praktisch sein.

die create Funktion

public function actionCreate() 
    { 
     $model = new Facturen(); 
     $modelProducten = [new Producten]; 
     if ($model->load(Yii::$app->request->post()) && $model->save()) 
     { 
      $modelProducten = Model::createMultiple(Producten::classname()); 
      Model::loadMultiple($modelProducten, Yii::$app->request->post()); 

      // validate all models 
      $valid = $model->validate(); 
      $valid = Model::validateMultiple($modelProducten) && $valid; 

      if ($valid) { 
       $transaction = \Yii::$app->db->beginTransaction(); 
       try { 
        if ($flag = $model->save(false)) { 
         foreach ($modelProducten as $modelProduct) 
         { 
          $modelProduct->factuur_id = $model->id; 
          if (! ($flag = $modelProduct->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('create', [ 
       'model' => $model, 
       'modelProducten' => (empty($modelProducten)) ? [new Producten] : $modelProducten 
      ]); 
     } 
    } 

und schließlich die Model.php

<?php 

namespace app\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 => $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; 
    } 
} 

Ich hoffe, euch die probelm in meinem Code erkennen kann, und mir bitte sagen, was ich falsch gemacht haben, wenn Sie feststellen, ein probelem. Ich versuche dieses Framework zu lernen und möchte nicht wirklich aufgeben

Antwort

0

Sie rufen $model->save() für das gleiche Modell zweimal. die zweite Instanz: if ($flag = $model->save(false)) wird 0 zurückgeben, da die zweite Aktualisierung keine Zeile in der Tabelle beeinflusst.
Verwenden Sie if ($model->save(false)!==false), um zu überprüfen, ob das Update erfolgreich war.

+0

Das scheint das Problem nicht zu beheben, oder vielleicht ersetze ich den falschen Teil. welche von te $ modell-> save() sollte ich ersetzen? –

+0

Entfernen Sie das erste $ model-> save()). Sie speichern den gleichen Wert zweimal und die zweite $ model-> save (false) wird 0 zurückgeben, da die zweite Aktualisierung keine Zeile in der Tabelle betrifft. –

+0

ändere dies '($ flag = $ model-> save (false))' nach '$ model-> save (false)! == false' – Kalu

Verwandte Themen