2016-04-13 8 views
0

この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.phpComment.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); 
} 

答えて

0

あなたはここにコメントクラスdefenitionを投稿してもらえますか?

Comment :: rules()のidにルールがないと思います。 属性のルールが定義されていないと、属性が安全でなく、$ comment->属性で値を設定できませんコードを次のように変更することができます。

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

約100行です。 'attributeLabels()'を投稿すればよいですか?私は '_commentform.php'の一部を編集しました。何かを強制するかもしれないCActiveFormと関係があります。 –

+0

いいえ、ここに投稿するjust rules()Commentのメソッド –

+0

私は質問を編集しました。 'rules()'がそこにあります。 –

関連する問題