【问题标题】:Manipulating form input values after submission causes multiple instances提交后操作表单输入值导致多个实例
【发布时间】:2012-09-26 11:01:59
【问题描述】:

我正在使用 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 副本都会被删除(或者至少是生成的数据库条目)。
我不知道如何防止这种情况。

更新....

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

我们将不胜感激。 谢谢

JMB

【问题讨论】:

  • 我正要发布同样的问题 :) 我正在浏览 yii 问题,看看是否有其他人发布了这个问题 :) 我遇到了完全相同的问题。模型 A 表单 + 模型 B 表单在同一个 _form.php 中,模型 B 需要模型 A 的 ID。我会查看您发布的链接,看看我是否可以解决我的问题并帮助您解决当前的问题。跨度>
  • 我希望您得到两个 $modelB 实例到 $modelA 之一,因为您保存了 $modelB 然后在 if 条件下再次执行此操作。但是我不明白为什么你会得到这个奇怪的结果($modelA 的 3 个副本到$modelB 的一个??你确定你在$modelB 中没有afterSave 方法吗?!
  • 好的,还有一些调试显示......模型B的实例数似乎是基于表单提交的数量,如果我一个接一个地继续添加更多文档,我会得到更多并且$modelA 的更多实例。模型在代码顶部重置,$modelA = new Documents 和 $modelB = new DocumentVersion。
  • 嗨,我正在尝试为我自己的项目实现相同的想法,但我的代码没有通过 is($valid) 条件。我们是否需要在表单上插入任何排序或代码以允许将模型 A 的 id 插入模型 B?在您的代码中,这 $modelB->document_id = $newdoc;可以解决问题,但我仍然无法通过模型验证。在我的情况下,我正在尝试 3 个模型 ModelA、B 和 C,并且 A 的主键也应该转到 modelB 和 modelC。关于我缺少什么的任何想法?

标签: forms model yii save


【解决方案1】:

好的,我将 Ajax 验证设置为 true。这是调用创建操作并插入条目。我不完全明白这一点,或者如果我真的想在没有这种效果的情况下使用 ajax 验证,但是......至少两个具有关系的模型插入是有效的。

感谢 cmets。 干杯 捷豹路虎

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 2011-10-21
    • 2018-03-14
    • 2013-06-28
    • 1970-01-01
    相关资源
    最近更新 更多