Yii:如何仅使用1个表单1模型和1个动作更新多个模型?

时间:2013-03-22 21:57:37

标签: php yii

我有一个模型website和一个模型url

每个url data都附加到website dataurl通过websitewebsite_id相关联。

在我的网络应用中,我需要在接受数据之前检查数据。

我想在屏幕上看到有关url data的所有数据,我设法做到了这一点。

现在,我还想更新屏幕上列出的所有数据。

在屏幕上,我有整个url datawebsite data,但当我尝试保存数据时,website data为空。

我的逻辑是向url模型添加一个属性:public $website;

url模型中,方法aftersave

protected function afterSave() {
    $w = null;
    $w = Website::model()->findByAttributes(array('id' => $this->website_id));
    //echo '<pre>';
    //print_r($w);
    print_r($this->website);
    $w->link = $this->website['link'];
    $w->domain = $this->website['domain'];
    $w->description = $this->website['description'];
    $w->save(false);
    die;
    return parent::afterSave();
}

以下是_form文件中的重要代码:

<div class="row">
    <?php echo $form->labelEx($model,'will_expire'); ?>
    <?php echo $form->dropDownList($model,'will_expire',array(0=>'No',1=>'Yes')); ?>
    <?php echo $form->error($model,'will_expire'); ?>
</div>

<div class="row">
    <?php echo $form->labelEx($model_website,'link'); ?>
    <?php echo $form->textField($model_website,'link'); ?>
    <?php echo $form->error($model_website,'link'); ?>
</div>

<div class="row">
    <?php echo $form->labelEx($model_website,'domain'); ?>
    <?php echo $form->textField($model_website,'domain'); ?>
    <?php echo $form->error($model_website,'domain'); ?>
</div>

<div class="row">
    <?php echo $form->labelEx($model_website,'description'); ?>
    <?php echo $form->textField($model_website,'description'); ?>
    <?php echo $form->error($model_website,'description'); ?>
</div>

2 个答案:

答案 0 :(得分:1)

问题很少:

  1. 是否在模型中定义了关系urlwebsite,以便现有网址的$url->website为您提供有效的网站记录?
  2. 您表单显示,您没有使用任何website_id,表示您为每个网址创建新网站记录,表示$w = Website::model()->findByAttributes(array('id' => $this->website_id));将始终返回NULL
  3. 我假设您已在website模型中定义了URL的关系。 根据我的理解建议的功能:

    protected function afterSave() {
        //data is already assigned by the caller
        $w = null;
        $w = Website::model()->findByAttributes(array('id' => $this->website_id));
        if($w)
        {
            Yii::log("updating existing website data","info");
            $this->website->save();
        }
        else
        {
            Yii::log("creating new website data","info");
            $this->website->save();
            $this->website_id = $this->website->website_id;
            $this->update(array('website_id')); //save the relation
            Yii::log("created new website {$this->website_id}","info");
        }
        return parent::afterSave();
    }
    

答案 1 :(得分:0)

原来是w而不是W的小错误,对象属性而不是数组;

好的,让我教你如何做到这一点;

我有2个模型:UrlWebsite

Url模型具有外键website_id以及与模型Website的关系;

Url模型中,我有一个名为website的属性,我将其声明为:public $website = array();;

通过使用bookmarklet的{​​{1}}添加数据,以便在管理员更新/检查时数据将会出现;

API模型中,我有一个方法Url

afterSave

其中protected function afterSave() { $w = null; $w = Website::model()->findByAttributes(array('id' => $this->website_id)); if($w) { $w->link = $this->website['link']; $w->domain = $this->website['domain']; $w->description = $this->website['description']; $w->save(); } return parent::afterSave(); } 填充在$this->website UrlController上,如:

actionUpdate

并稍后传递给public function actionUpdate($id, $type = 'update') { $model = $this->loadModel($id); // Uncomment the following line if AJAX validation is needed // $this->performAjaxValidation($model); if (isset($_POST['Url'])) { $model->attributes = $_POST['Url']; $model->website = $_POST['Website']; if ($model->save()) if ($type == 'update') $this->redirect(array('view', 'id' => $model->id)); else $this->redirect(array('/admin/url/approvePublicLink')); } $model_website = Website::model()->findByAttributes(array('id'=>$model->website_id)); $this->render('update', array( 'model' => $model, 'model_website' => $model_website, )); } 方法;

这是afterSave视图:

_update

这是获得部分的<div style="padding:20px 20px;"> <h1>Update Url, Website, Keywords ...</h1> <?php echo $this->renderPartial('_form', array( 'model'=>$model, 'model_website' => $model_website, )); ?> </div> 视图:

_form

我希望它有所帮助。