2012-10-27 9 views
5

Qualcuno sa come aggiungere più record utilizzando solo un modulo in Yii? Tutti i record appartengono allo stesso modello e sono dello stesso formato.Yii - più record in una sottomissione di modulo

Molte grazie,

Nick

+2

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

+0

Grazie! Proprio quello che stavo cercando. – goose

+0

Qualcuno è in grado di confermare la sintassi per il metodo batchCreate equivalente? Questo manca nella pagina collegata sopra. – goose

risposta

9

Il metodo equivalente "batchCreate" della "batchUpdate" from the guide potrebbe essere qualcosa di simile:

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

L'unica preoccupazione è che una nuova istanza ha da creare per ciascun modello che si sta salvando, utilizzando new. Il resto della logica può essere implementato in qualsiasi modo desideri, ad esempio nell'esempio sopra tutti i modelli vengono convalidati e quindi salvati, mentre potresti aver interrotto la convalida se qualche modello non era valido, o forse salvato direttamente i modelli, lasciando che la validazione avvenga durante la chiamata save. Quindi la logica dipenderà davvero dalla tua ux della tua app.

+1

Grazie per questo e mi dispiace per la risposta in ritardo. Questo ha aiutato. – goose

0

Inserire questo codice nella cartella components sotto il nome di file 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); 
    } 
} 

e l'uso ovunque:

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

Questo solo eseguire una query.