このWebアプリケーションのトレースには助けが必要です。私はYiiにとって非常に新しく、既存のアプリを解剖してより良く理解しようとしています。私は編集機能を作成しようとしています。ビデオチュートリアルでは、上書きするIDを指定する点を除いて、追加機能と全く同じプロセスがあると信じています(私は間違いかもしれません)。私が言うことができるように近くYii:ロード時に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をデータベースから取得します。アプリケーションログでわかるように、これはうまくいきます。
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
ある:ForumController.php
におけるこの特定の関数を呼び出す
。それはIDが存在するかどうかをチェックしますが、テキストボックスだけです。そうであれば、既存のコメントを編集しています。そうでなければ、新しいコメントを作成しています。送信ボタンは、isNewRecord
の値に応じて、Reply
からUpdate
に変更されます。
EDIT:ヘルプの場合には、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
の部分だ:私はログに出newComment()
から$comment
を書き出す場合
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;
}
興味深いことに、それは編集したコメント(すなわちプリントアウトしない、それが印刷さ私が既存のコメント「誰がチャンピオンですか?」を編集した場合、「john cena」が出ますが、$comment->id
はnullを返します。更新するのではなく、編集したコメントを新しいものとして保存します。
モデルの場合、Forum.php
とComment.php
は、何らかの理由でフォーラムとコメントを1つのテーブルに入れることにしたので、同じデータベーステーブルを奇妙に指しています。 Forum.php
には、実際のaddComment
関数(私が奇妙な発見をするプレースメント)も含まれていますが、フローがそこに到達するまでにコメントIDはもちろんnullですが、編集されたコメント自体はそこにあります。
どこが間違っていましたか?私は何かが欠けていたか?
編集:ここでコメントモデルの属性やルールです:
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);
}
約100行です。 'attributeLabels()'を投稿すればよいですか?私は '_commentform.php'の一部を編集しました。何かを強制するかもしれないCActiveFormと関係があります。 –
いいえ、ここに投稿するjust rules()Commentのメソッド –
私は質問を編集しました。 'rules()'がそこにあります。 –