Модель комментариев в блоге yii с многомодельной формой - PullRequest
1 голос
/ 04 ноября 2011

Я хотел бы взять модель комментария блога и превратить форму в многомодельную форму, но я не смог разобраться с этим.Был бы признателен, если бы кто-нибудь мог указать мне правильное направление.

Взяв рисунок ниже, я хочу добавить еще одну таблицу (OtherModel) вне комментария с ФК в комментарии, связывающем таблицы.

enter image description here

Контроллер

public function actionView()
{
    $post=$this->loadModel();
    $comment=$this->newComment($post);

    $this->render('view',array(
        'model'=>$post,
        'comment'=>$comment,
    ));
}

protected function newComment($post)
{
    $comment=new Comment;
    $otherModel=new OtherModel;
    if(isset($_POST['Comment'], $_POST['OtherModel']))
    {
        $comment->attributes=$_POST['Comment'];
        $otherModel->attributes=$_POST['OtherModel'];
        if($post->addComment($comment))
        {
            if($comment->status==Comment::STATUS_PENDING)
                Yii::app()->user->setFlash('commentSubmitted','Thank you...');
            $this->refresh();
        }
    }
    return $comment;
}

модель

public function addComment($comment)
    {
        $comment->other_id=$otherModel->other_id;
        $otherModel->save();
        if(Yii::app()->params['commentNeedApproval'])
            $comment->status=Comment::STATUS_PENDING;
        else
            $comment->status=Comment::STATUS_APPROVED;
        $comment->post_id=$this->id;
        return $comment->save();
    }

визуализация формы через CJuiTabs

'Comment'=>$this->renderPartial('/comment/_form',array($model->$comment=>),true)

форма

<div class="form">

<?php $form=$this->beginWidget('CActiveForm', array(
        'id'=>'comment-form',
        'enableAjaxValidation'=>true,
)); ?>

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

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

        <div class="row">
                <?php echo $form->labelEx($model,'content'); ?>
                <?php echo $form->textArea($model,'content',array('rows'=>6, 'cols'=>50)); ?>
                <?php echo $form->error($model,'content'); ?>
        </div>

        // added otherModel as part of MMF
        <div class="row">
                <?php echo $form->labelEx($otherModel,'name'); ?>
                <?php echo $form->textField($otherModel,'name',array('size'=>60,'maxlength'=>128)); ?>
                <?php echo $form->error($otherModel,'name'); ?>
        </div>

        <div class="row">
                <?php echo $form->labelEx($otherModel,'description'); ?>
                <?php echo $form->textArea($otherModel,'description',array('rows'=>6, 'cols'=>50)); ?>
                <?php echo $form->error($otherModel,'description'); ?>
        </div>

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

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

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

Ответы [ 2 ]

1 голос
/ 11 ноября 2011

Я думаю, что в вашем коде, указанном выше, есть ошибка: вы пытаетесь использовать $otherModel переменную вместо $comment, отображаемой вашим методом actionView().

Вы пытались использовать примеры, размещенные на yiiframework.com?Я имею в виду ссылку, которую вы дали в комментарии к вашему вопросу.Если вас это не устраивает, боюсь, я неправильно понял ваш вопрос.

0 голосов
/ 14 ноября 2011

Я думаю, вам следует проверить обе модели перед сохранением, в противном случае в вашей базе данных окажется устаревшая запись $ otherModel.

protected function newComment($post)
{
    $comment=new Comment;
    $otherModel=new OtherModel;
    if(isset($_POST['Comment'], $_POST['OtherModel']))
    {
        $comment->attributes=$_POST['Comment'];
        $otherModel->attributes=$_POST['OtherModel'];
        // also specify $otherModel as a param
        if($post->addComment($comment, $otherModel))
        {
            if($comment->status==Comment::STATUS_PENDING)
                Yii::app()->user->setFlash('commentSubmitted','Thank you...');
            $this->refresh();
        }
    }
    return $comment;
}


public function addComment($comment, $otherModel)
{
    // Validate both models, return false if there are errors.
    // Errors should be available via $model->getErrors()
    if ($comment->validate() && $otherModel->validate()) {
        // save the otherModel first to obtain the generated ID
        $otherModel->save();
        $comment->other_id=$otherModel->id;                    
        if(Yii::app()->params['commentNeedApproval'])
            $comment->status=Comment::STATUS_PENDING;
        else
            $comment->status=Comment::STATUS_APPROVED;
        $comment->post_id=$this->id;
        return $comment->save();
    } else {
        return false;
    }
}

Примечание. Вы также можете использовать транзакции здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...