我需要帮助来跟踪此Web应用程序。我是Yii的新手,我试图剖析现有的应用程序以更好地理解它。我试图创建一个编辑函数,视频教程让我相信它具有与添加函数[save()
]完全相同的过程,除非您指定要覆盖的ID(我很可能这是错的。)
我可以说,以下文件正在播放中:
我无法真正改变现有的内容,但我可以添加自己的内容。它以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.php
和Comment.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);
}
答案 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);
}