Yii:ID在加载时被覆盖

时间:2016-04-13 17:22:43

标签: php yii

我需要帮助来跟踪此Web应用程序。我是Yii的新手,我试图剖析现有的应用程序以更好地理解它。我试图创建一个编辑函数,视频教程让我相信它具有与添加函数[save()]完全相同的过程,除非您指定要覆盖的ID(我很可能这是错的。)

我可以说,以下文件正在播放中:

  • 视图/论坛/ view.php
  • 视图/论坛/ _commentform.php
  • 视图/论坛/ _comments.php
  • 控制器/ ForumController.php
  • 模型/ Forum.php
  • 模型/ Comment.php

我无法真正改变现有的内容,但我可以添加自己的内容。它以view.php开头,其中显示了大部分内容。最底层是:

<?php
$this->widget('zii.widgets.CListView',
    array('dataProvider'=>$dataProvider, 'itemView'=>'_comments', 'summaryText'=>'',)); 
?>

_comments.php显示评论的所有常见元素,例如来自Facebook。我在那里制作了一个编辑按钮,代码在这里:

<?php echo CHtml::link(CHtml::encode('Edit'),array('forum/editcomment','reply'=>$data->id,'topic'=>$data->content_id)); ?>

该编辑按钮从数据库中获取当前注释的ID。接近应用程序日志可以告诉我,这确实有效。

ForumController.php中调用此特定函数:

public function actionEditComment() {
    if(isset($_GET['reply'])) { 
        $comment=Comment::model()->findByAttributes(array('id'=>$_GET['reply']));
        $topic=Forum::model()->findByAttributes(array('id'=>$comment->content_id));
        $this->renderPartial('_commentform', array('forum'=>$topic, 'model'=>$comment, 'view'=>'view',));
    }
}

接下来是_commentform.php。没什么,只是一个文本框,虽然它确实检查是否存在ID;如果是,它正在编辑现有注释,否则,它正在创建一个新注释。提交按钮也会从Reply更改为Update,具体取决于isNewRecord的值。

编辑:如果有任何帮助,还有一个CActiveForm。可能与路由有关吗?

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'comment-form',
    'action'=>Yii::app()->createUrl('forum/view/id/'.$forum->id),
    'enableAjaxValidation'=>false,
)); ?>

<?php
if ($view == 'view') {
    echo CHtml::submitButton($model->isNewRecord ? 'Reply' : 'Update', array('id'=>'comment'.$model->id));
}?>

同样,通过应用程序日志确认,评论的ID正在传递,尽管是id => comment<commentID>。然后这就是朦胧的地方。我假设流程返回ForumController.php,根据我的日志记录,ID丢失了。

以下是我认为负责的ForumController.php部分:

public function actionView() {      
    $post=$this->loadModel();
    $comment=$this->newComment($post);
    $viewcount=$post->view_count+1;
    $post->view_count=$viewcount;
    $post->save();

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

private $_model;
public function loadModel() {
    if($this->_model===null) {
        if(isset($_GET['id'])) {
            $this->_model=Forum::model()->findByPk($_GET['id'], $condition);
        }
        if($this->_model===null)
            throw new CHttpException(404,'The requested page does not exist.');
    }
    return $this->_model;
}

protected function newComment($post) {
    $comment=new Comment;
    if(isset($_POST['Comment'])) {
        $comment->attributes=$_POST['Comment'];
        $post->addComment($comment);
    }
    return $comment;
}

有趣的是,如果我从$comment写出newComment()到日志,它会打印出已编辑的评论(即打印出&#34; john cena&#34;如果我编辑现有评论&#34;谁是冠军?&#34;),但是$comment->id产生一个null,我认为这是为什么而不是更新,编辑后的评论被保存为新的。

对于模型,Forum.phpComment.php奇怪地指向同一个数据库表,因为出于某种原因,他们决定将Forums和Comments放入一个表中。 Forum.php还包含实际的addComment函数(我觉得很奇怪的位置),但是当流程到达那里时,注释ID当然是空的,尽管编辑的注释本身就在那里。

我哪里出错了?我错过了什么吗?

编辑:这里是评论模型的属性和规则:

public function attributeLabels() {
    return array(
        'id' => 'ID',
        'node_type' => 'Node Type',
        'party_id' => 'Party',
        'category' => 'Category',
        'title' => 'Title',
        'content' => 'Content',
        'date_created' => 'Create Time',
        'date_modified' => 'Update Time',
        'status' => 'Status',);
}

public function rules()
{
    /* combine parent and own rules */
    $parentRules = parent::rules();

    $myRules = array(
        array('node_type_id', 'default', 'value'=>'7'), /* set type to Person */
        array('node_type_id', 'in', 'range'=>array('7')), /* allow only Person type */
        array('party_id, date_created, date_modified, status', 'numerical', 'integerOnly'=>true),
        array('category, title, content', 'safe'),
    );

/* you want to apply parent rules last, delete them here if necessary */
    return array_merge($myRules);
}

1 个答案:

答案 0 :(得分:0)

你能在这里发表评论课辩护吗?

我认为你在Comment :: rules()中没有“id”的规则, 如果未定义属性规则,则属性将不安全,您无法通过$ comment-&gt;属性设置其值,或者您可以将代码更改为:

if(isset($_POST['Comment']) && isset($_POST['Comment']['id'])) {
    $comment = Comment::model()->findByPk($_POST['Comment']['id']);
    $comment->attributes=$_POST['Comment'];
    $post->addComment($comment);
}