2013-03-22 134 views
0

我有一個模型website和模型urlYii:如何僅使用1個表單1模型和1個動作來更新多個模型?

每個url data附加到website data。 A url通過website_idwebsite相關。

在我的網絡應用程序中,我需要在接受它之前檢查數據。

我想在屏幕上看到有關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> 
+0

這些通過外鍵鏈接? Yii的ORM/DBAL不支持級聯保存相關對象嗎? – prodigitalson 2013-03-22 22:04:19

+0

是的,它們是相關的;一個網址通過website_id與網站相關 – 2013-03-23 12:51:40

+0

是否總是會有一個網站模型返回給定的ID在你的Url :: afterSave中?如果不是,則$ w​​將爲空。在前面的步驟中是否保存在其他地方? – bcmcfc 2013-03-23 14:40:33

回答

0

它竟然是小錯誤,類似於w,而不是W,對象屬性,而不是陣列;

好吧,讓我教你如何做到這一點;

我有2個機型:UrlWebsite

Url模型有一個外鍵website_id和關係到型號Website;

Url模型中,我有一個名爲website的屬性,我宣佈它爲:public $website = array();;

數據通過bookmarklet添加,使用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觀點:

<div class="form"> 

<?php 

$form=$this->beginWidget('CActiveForm', array(
    'id'=>'url-form', 
    'enableAjaxValidation'=>false, 
)); 
?> 

    <p class="note">Fields with <span class="required">*</span> are required.</p> 

    <?php echo $form->errorSummary($model); ?> 

    <div class="row"> 
     <?php echo $form->labelEx($model,'website_id'); ?> 
     <?php echo CHtml::link($model->relation_website->domain,$model->relation_website->domain,array('class'=>'avia','target'=>'_blank')); ?> 
     <?php echo $form->error($model,'website_id'); ?> 
    </div> 

    <div class="row"> 
     <?php echo $form->labelEx($model,'link'); ?> 
     <?php echo $form->textField($model,'link',array('size'=>60,'maxlength'=>255)); ?> 
     <?php echo $form->error($model,'link'); ?> 
    </div> 

    <div class="row"> 
     <?php echo $form->labelEx($model,'title'); ?> 
     <?php echo $form->textField($model,'title',array('size'=>60,'maxlength'=>255)); ?> 
     <?php echo $form->error($model,'title'); ?> 
    </div> 

    <div class="row"> 
     <?php echo $form->labelEx($model,'description'); ?> 
     <?php echo $form->textField($model,'description',array('size'=>60,'maxlength'=>255)); ?> 
     <?php echo $form->error($model,'description'); ?> 
    </div> 

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

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

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

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

    <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> 

    <div class="row"> 
     <?php echo $form->labelEx($model,'status'); ?> 
     <?php echo $form->dropDownList($model,'status',array(-1=>'Banned',0=>'Normal',1=>'Active')); ?> 
     <?php echo $form->error($model,'status'); ?> 
    </div> 

    <div class="row buttons"> 
     <?php echo CHtml::submitButton('Save'); ?> 
    </div> 

<?php $this->endWidget(); ?> 

</div><!-- form --> 

我希望它能幫助。

1

有幾個問題:

  1. urlwebsite模型使得現有的URL的$url->website爲您提供了有效的網站記錄所定義的關係?
  2. 你表單顯示,不使用任何website_id,意味着你正在爲每一個URL一個新的網站記錄,意味着$w = Website::model()->findByAttributes(array('id' => $this->website_id));總是返回NULL

我假設你已經中定義的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(); 
} 
+0

將調查此... – 2013-03-26 10:54:13

+0

我檢查了它,它不工作;然而,我發現了這個錯誤 – 2013-03-26 19:02:34