我想从表单中保存多条记录

时间:2013-12-10 08:22:22

标签: php forms yii widget batch-updates

我正在尝试从表单保存批处理记录并保存到数据库。 我从Advanced Example获得了样本,它是一个小部件。这个。示例仅添加记录而不保存它我在窗口小部件下添加保存底部并形成窗口小部件的顶部。添加代码以进行添加或更新,我在小部件中添加了id。从数据库读取的记录。 当我更新记录我没有任何问题,但当我添加记录我的程序不保存新记录我跟踪程序,并看到$ _post [模型]包括旧记录,并没有新的记录。当我从中元素id字段时。所有记录重新保存我离开了程序

pic1 pic2

_form_batch.php

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'person-form',
    'enableAjaxValidation'=>true,

    'enableClientValidation' => true,
)); ?>
<h2><?php 

$persons2=Person::model()->findAll();
echo Help::item('annotation','title',!Yii::app()->user->isGuest); ?></h2>
<div class="large-text"><?php echo Help::item('annotation','content'); ?></div>sas
<?php $this->widget('ext.widgets.tabularinput.XTabularInput',array(
        'models'=>$persons2,
        'containerTagName'=>'table',
        'headerTagName'=>'thead',
        'header'=>'
            <tr>
                                <td>'.CHtml::activeLabelEX(Person::model(),'id').'</td>
                <td>'.CHtml::activeLabelEX(Person::model(),'firstname').'</td>
                <td>'.CHtml::activeLabelEX(Person::model(),'lastname').'</td>
                                <td>'.CHtml::activeLabelEX(Person::model(),'country_id').'</td>    
                <td>'.CHtml::activeLabelEX(Person::model(),'eyecolor_code').'</td>
                                <td>'.CHtml::activeLabelEX(Person::model(),'email').'</td>
                <td></td>
            </tr>
        ',
        'inputContainerTagName'=>'tbody',
        'inputTagName'=>'tr',
        'inputView'=>'extensions/_tabularInputAsTable',
        'inputUrl'=>$this->createUrl('request/addTabularInputsAsTable2'),
        'addTemplate'=>'<tbody><tr><td colspan="6">{link}</td></tr></tbody>',
        'addLabel'=>Yii::t('ui','Add new row'),
        'addHtmlOptions'=>array('class'=>'blue pill full-width'),
        'removeTemplate'=>'<td>{link}</td>',
        'removeLabel'=>Yii::t('ui','Delete'),
        'removeHtmlOptions'=>array('class'=>'red pill'),
    )); ?>

    <div class="action">
        <?php echo CHtml::submitButton($model->isNewRecord ? Yii::t('ui', 'Create') : Yii::t('ui','Save'),array('class'=>'btn btn-primary')); ?>
        <?php echo CHtml::link(Yii::t('ui', 'Cancel'), $model->isNewRecord ? array('admin') : $this->getReturnUrl(), array('class'=>'btn')) ?>
    </div>
<?php $this->endWidget(); ?>

控制器:

      $person = new Person;
        $persons = $this->getItemsToUpdate();
        //  print_r($_POST); exit;
        if (isset($_POST['Person'])) {
            $valid = true;
            foreach ($persons as $i => $person) {
                if (isset($_POST['Person'][$i]))
                $person->attributes = $_POST['Person'][$i];
                $valid = $person->validate() && $valid;
                print_r($_POST['Person'][$i]);
                $person->save();
                $errores = $person->getErrors();
               // print_r($errores);
               // echo " valid: " . $valid . "<br>";
            }
        }
        $this->render('hame', array(
            'model' => $persons,
        ));
    }

    public function getItemsToUpdate() {
        // Create an empty list of records
        $persons = array();
print_r($_POST['Person']);
        // Iterate over each item from the submitted form
        if (isset($_POST['Person']) && is_array($_POST['Person'])) {
            foreach ($_POST['Person'] as $person) {

                // If item id is available, read the record from database 
                if (array_key_exists('id', $person)) {
                    $persons[] = Person::model()->findByPk($person['id']);
                }
                // Otherwise create a new record
                else {

                    $persons[] = new Person();
                }
            }
        }
        return $persons;
    }

2 个答案:

答案 0 :(得分:0)

第一点是:

**$person** = new Person;
foreach ($persons as $i => **$person**) {

第二是:

我遇到了foreach的一些问题并保存,更好地使用

$cmd = Yii::app()->db->createCommand();
$cmd->insert(...
$cmd->update(...

否则你必须在每次迭代时创建新模型,而不是使用save()

答案 1 :(得分:0)

您应该为您的模型创建多个模型对象。看看这个链接: Yii - multiple records in one form submission