提交后操作表单输入值会导致多个实例

时间:2012-09-26 11:02:00

标签: forms model yii save

我正在用Yii构建一个表格,一次更新两个模型 表单将每个模型的输入作为$ modelA和$ modelB,然后按照此处所述单独处理它们http://www.yiiframework.com/wiki/19/how-to-use-a-single-form-to-collect-data-for-two-or-more-models/

这一切都很好。我对示例的不同之处在于,必须保存$ modelA(文档)并检索其ID,然后必须保存$ modelB,包括来自$ model A的ID,因为它们是相关的。

另外还有一个问题,即$ modelB有一个需要保存的文件。

我的行动代码如下:

if(isset($_POST['Documents'], $_POST['DocumentVersions']))
    {
        $modelA->attributes=$_POST['Documents'];
        $modelB->attributes=$_POST['DocumentVersions'];


        $valid=$modelA->validate();
        $valid=$modelB->validate() && $valid;


        if($valid)
        {

            $modelA->save(false); // don't validate as we validated above.
            $newdoc = $modelA->primaryKey; // get the ID of the document just created

            $modelB->document_id = $newdoc;         // set the Document_id of the DocumentVersions to be $newdoc
            // todo: set the filename to some long hash

            $modelB->file=CUploadedFile::getInstance($modelB,'file');       
            // finish set filename
            $modelB->save(false);

            if($modelB->save()) {
                $modelB->file->saveAs(Yii::getPathOfAlias('webroot').'/uploads/'.$modelB->file);
                }

            $this->redirect(array('projects/myprojects','id'=>$_POST['project_id']));
        }
    }
    ELSE {

    $this->render('create',array(
        'modelA'=>$modelA,
        'modelB'=>$modelB,
        'parent'=>$id,
        'userid'=>$userid,
        'categories'=>$categoriesList
    ));
    }

您可以看到我将'file'和'document_id'的新值推送到$ modelB。这一切都没有问题,但是......每当我将其中一个值推入$ modelB时,我似乎得到了一个$ modelA的新实例。所以净结果,我得到3个新文件,1个新版本。新版本都正确链接,但其他两个文件只是直接重复 我已经测试了删除$ modelB更新步骤,果然,对于每个删除了一个$ modelA的副本被删除(或者至少是结果数据库条目)。 我不知道如何防止这种情况。

... UPDATE

在下面的评论中,进一步测试显示$ modelA的实例数取决于表单提交的次数。即使在此期间访问其他页面/视图,如果在短时间内重新提交表单,每次我在数据库中获得额外的条目。如果这是由于某种形式的持久性,那么我希望获得PREVIOUS模型的额外副本,而不是当前模型的倍数。所以我怀疑它的保存方式,就像有一些计数器正在递增,但我不知道在哪里寻找这个,或者每次如何将它归零。

非常感谢一些帮助。 感谢

JMB

1 个答案:

答案 0 :(得分:1)

好的,我将Ajax验证设置为true。这是调用create动作并插入条目。我没有完全得到这个,或者如果我真的想要没有这种效果我怎么能使用ajax验证,但是......至少两个模型插入关系有效。

感谢您的评论。 干杯 JMB

相关问题