2012-10-27 14 views
5

Czy ktoś wie, jak dodać wiele rekordów za pomocą tylko jednego formularza w Yii? Wszystkie rekordy należą do tego samego modelu i mają ten sam format.Yii - wiele rekordów w jednym formularzu składania

Dziękujemy,

Nick

+2

http://www.yiiframework.com/doc/guide/1.1/en/form.table – dInGd0nG

+0

Dzięki! właśnie tego szukałem. – goose

+0

Czy ktoś jest w stanie potwierdzić składnię równoważnej metody batchCreate? Tego nie ma na stronie powiązanej powyżej. – goose

Odpowiedz

9

Odpowiednikiem "batchCreate" Sposób "batchUpdate" from the guide może być coś takiego:

public function actionBatchCreate() { 
    $models=array(); 
    // since you know how many models 
    $i=0; 
    while($i<5) { 
     $models[]=Modelname::model(); 
     // you can also allocate memory for the model with `new Modelname` instead 
     // of assigning the static model 
    } 
    if (isset($_POST['Modelname'])) { 
     $valid=true; 
     foreach ($_POST['Modelname'] as $j=>$model) { 
      if (isset($_POST['Modelname'][$j])) { 
       $models[$j]=new Modelname; // if you had static model only 
       $models[$j]->attributes=$model; 
       $valid=$models[$j]->validate() && $valid; 
      } 
     } 
     if ($valid) { 
      $i=0; 
      while (isset($models[$i])) { 
       $models[$i++]->save(false);// models have already been validated 
      } 
      // anything else that you want to do, for example a redirect to admin page 
      $this->redirect(array('modelname/admin')); 
     } 
    } 

    $this->render('batch-create-form',array('models'=>$models)); 
} 

Jedynym problemem jest to, że nowa instancja ma do utworzenia dla każdego modelu, który zapisujesz, używając new. Resztę logiki można zaimplementować w dowolny sposób, na przykład w powyższym przykładzie wszystkie modele są sprawdzane, a następnie zapisywane, podczas gdy można zatrzymać sprawdzanie poprawności, jeśli którykolwiek model był nieprawidłowy, lub może bezpośrednio zapisać modele, dopuszczenie do sprawdzania poprawności podczas połączenia save. Tak więc logika naprawdę zależy od kodu ux twojej aplikacji.

+1

Dziękuję za to i przepraszam za opóźnioną odpowiedź. To pomogło. – goose

0

Umieść ten kod w folderze components pod nazwą pliku GeneralRepository.php.

<?php 
class GeneralRepository 
{ 
    /** 
    * Creates and executes an INSERT SQL statement for several rows. 
    * 
    * Usage: 
    * $rows = array(
    *  array('id' => 1, 'name' => 'John'), 
    *  array('id' => 2, 'name' => 'Mark') 
    *); 
    * GeneralRepository::insertSeveral(User::model()->tableName(), $rows); 
    * 
    * @param string $table the table that new rows will be inserted into. 
    * @param array $array_columns the array of column datas array(array(name=>value,...),...) to be inserted into the table. 
    * @return integer number of rows affected by the execution. 
    */ 
    public static function insertSeveral($table, $array_columns) 
    { 
     $connection = Yii::app()->db; 
     $sql = ''; 
     $params = array(); 
     $i = 0; 
     foreach ($array_columns as $columns) { 
      $names = array(); 
      $placeholders = array(); 
      foreach ($columns as $name => $value) { 
       if (!$i) { 
        $names[] = $connection->quoteColumnName($name); 
       } 
       if ($value instanceof CDbExpression) { 
        $placeholders[] = $value->expression; 
        foreach ($value->params as $n => $v) 
         $params[$n] = $v; 
       } else { 
        $placeholders[] = ':' . $name . $i; 
        $params[':' . $name . $i] = $value; 
       } 
      } 
      if (!$i) { 
       $sql = 'INSERT INTO ' . $connection->quoteTableName($table) 
       . ' (' . implode(', ', $names) . ') VALUES (' 
       . implode(', ', $placeholders) . ')'; 
      } else { 
       $sql .= ',(' . implode(', ', $placeholders) . ')'; 
      } 
      $i++; 
     } 
     $command = Yii::app()->db->createCommand($sql); 
     return $command->execute($params); 
    } 
} 

i użytkowania w dowolnym miejscu:

$rows = array(
    array('id' => 1, 'name' => 'John'), 
    array('id' => 2, 'name' => 'Mark') 
); 
GeneralRepository::insertSeveral(User::model()->tableName(), $rows); 

To tylko wykonać jedno zapytanie.