0

モデルwebsiteとモデルがありurlます。

それぞれurl dataがに接続されていwebsite dataます。Aは経由urlでに関連付けられています。websitewebsite_id

私のWebアプリでは、データを受け入れる前にデータを確認する必要があります。

に関するデータ全体を画面に表示したいのですが、url dataなんとかできました。

ここで、画面に表示されているデータ全体も更新したいと思います。

url data画面にはと全体が表示されていwebsite 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>
4

2 に答える 2

1

いくつかの質問があります:

  1. 既存のURLの関係urlと定義が、有効なWebサイトレコードを提供するwebsiteようにモデルに定義されていますか?$url->website
  2. ショーを作成します。website_idを使用していません。つまり、すべてのURLに対して新しいWebサイトレコードを作成していることを意味します。つまり、$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();
}
于 2013-03-26T10:03:05.840 に答える
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 -->

お役に立てば幸いです。

于 2013-03-26T19:16:44.930 に答える