2015-09-09 4 views
0

J'ai mon modèle avec 2 champs product.php:Yii2 Insérer plusieurs enregistrements d'une même table

[['ID_PRODUCT'], 'integer'], 
[['NAME_PRODUCT'], 'string'], 

mon contrôleur ProductController.php:

public function actionCreate() 
    { 
     $model = new Product(); 

     if ($model->load(Yii::$app->request->post()) && $model->save()) { 
      return $this->redirect(['view', 'id' => $model->ID_PRODUCT]); 
     } else { 
      return $this->render('create', [ 
       'model' => $model, 
      ]); 
     } 
    } 

Et je veux insérer plusieurs fois le même table avec ActiveForm:

<?php $form = ActiveForm::begin(); ?> 

    <?= $form->field($model, 'ID_PRODUCT')->textInput(['maxlength' => true]) ?> 

    <?= $form->field($model, 'NAME_PRODUCT')->textInput(['maxlength' => true]) ?> 

    <?= $form->field($model, 'ID_PRODUCT')->textInput(['maxlength' => true]) ?> 

    <?= $form->field($model, 'NAME_PRODUCT')->textInput(['maxlength' => true]) ?> 

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

Mais lorsque j'enregistre les informations, les champs sont remplacés et seulement la dernière reco rd est inséré

Répondre

6

Ce que vous essayez de faire est de collecter, de valider et d'enregistrer des données tabulaires. La raison pour laquelle cela ne fonctionne pas est que dans le formulaire, Yii génère une étiquette de nom basée sur le nom de champ et le modèle, par ex. name="[Product]["ID_PRODUCT"]. Lorsque le formulaire est envoyé au serveur, les premiers champs sont remplacés par les derniers, car ils ont le même nom. La manière correcte de collecter des données tabulaires dans un formulaire consiste à ajouter des parenthèses à la fin du nom, comme ceci; name="[1][Product]["ID_PRODUCT"]. En utilisant cette méthode, Yii donne des moyens de charger et de valider plusieurs modèles.

Modifiez le code de votre contrôleur pour utiliser plusieurs modèles;

<?php 

namespace app\controllers; 

use Yii; 
use yii\base\Model; 
use yii\web\Controller; 
use app\models\Setting; 

class ProductController extends Controller 
{ 
    public function actionCreate(){ 

     //Find out how many products have been submitted by the form 
     $count = count(Yii::$app->request->post('Product', [])); 

     //Send at least one model to the form 
     $products = [new Product()]; 

     //Create an array of the products submitted 
     for($i = 1; $i < $count; $i++) { 
      $products[] = new Product(); 
     } 

    //Load and validate the multiple models 
    if (Model::loadMultiple($products, Yii::$app->request->post()) &&                       Model::validateMultiple($products)) { 

     foreach ($products as $product) { 

      //Try to save the models. Validation is not needed as it's already been done. 
      $product->save(false); 

     } 
     return $this->redirect('view'); 
    } 

    return $this->render('create', ['products' => $products]); 
    } 
} 

Maintenant vous avez toutes les données dont vous avez besoin pour remplir le formulaire, y compris les messages d'erreur générés pour les cas individuels de modèle que vous product. Le fichier de vue pour le formulaire doit être modifié comme ceci, pour utiliser les modèles multiples;

foreach ($products as $index => $product) { 
    echo $form->field($product, "[$index]ID_PRODUCT")->label($product->ID_PRODUCT); 
    echo $form->field($product, "[$index]NAME_PRODUCT")->label($product->NAME_PRODUCT); 
} 

Tout cela est couvert dans le Yii2 documentation