2017-09-07 2 views
0

après ma dernière question J'ai travaillé sur une facture en yii2 et j'ai rencontré un nouveau problème. Après avoir rempli le formulaire et cliqué sur créer, il ne fait rien d'autre que rafraîchir la page et effacer les champs du produit, cependant les informations personnelles comme le nom de l'entreprise et la date ect sont après le rafraîchissement encore rempli ... aussi quand je vérifie la base de données rien ne s'est passé. pourriez-vous s'il vous plaît jeter un oeil au code ci-dessous?YII2 créer la fonction n'envoie pas de données à la base de données

le formulaire de facture

<?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> 

je pensais que ce ne fut pas le problème, car la forme des œuvres, mais encore il est peut-être à portée de main.

la fonction Créer

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 
      ]); 
     } 
    } 

et enfin le 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; 
    } 
} 

J'espère que vous les gars peuvent repérer le gros problème dans mon code, et s'il vous plaît me dire ce que je fait de mal quand vous trouvez un probème. J'essaie d'apprendre ce cadre et je ne veux pas vraiment abandonner

Répondre

0

vous appelez $model->save() pour le même modèle deux fois. la deuxième instance: if ($flag = $model->save(false)) renverra 0 car la deuxième mise à jour n'affecte aucune ligne de la table.
utilisez if ($model->save(false)!==false) pour vérifier si la mise à jour a réussi à la place.

+0

Cela ne semble pas résoudre le problème, ou peut-être que je remplace la mauvaise partie. lequel de $ model-> save() dois-je remplacer? –

+0

supprimer le premier $ model-> save()) .Votre sauvegarde de la même valeur deux fois et deuxième $ model-> save (false) retournera 0 puisque la deuxième mise à jour n'affecte aucune ligne de la table. –

+0

changez ce '($ flag = $ model-> save (false))' en $ model-> save (false)! == false' – Kalu