2011-12-07 12 views
1

私はPHPのYiiフレームワークを使用しています。私のシナリオでは、私はプロジェクトの数を持っており、すべてのプロジェクトに投稿があります。私がClistviewを使ったプロジェクトでは、このコントロールの 'itemView'に '_ post'という名前の別のページが指定されています。 '_post'ページで、ClistViewは投稿の詳細を表示するために指定されています。yii親子Clistviewページング問題

しかし、プロジェクトの投稿詳細Clistviewでページングが発生し、1つの投稿詳細のページ番号を次のページ番号に変更すると、すべての投稿詳細clistviewページ番号が変更されます。

投稿の詳細clistview 'id'を指定しましたが、無駄はありません。プロジェクトのための

:ポストの詳細については

<?php 
$this->pageTitle=Yii::app()->name . ' - Project Post Details'; 
echo '<div class="listViewBorder">'; 
$this->widget('zii.widgets.CListView', 
       array(
        'dataProvider'=>$dataProvider, 
        'id'=>'projectListView', 
        'itemView'=>'_post', // refers to the partial view 
        'enablePagination'=>true, 
      )); 
echo '</div><br />' 
?> 

:あなたはより良い解決策を見つけるまで

<?php 
echo '<h2>Project: '. CHTML::encode($data->title).' </h2>'; 
echo '<div class="listViewBorder">'; 
$this->widget('zii.widgets.CListView', 
       array(
        'dataProvider'=>$this->CallProjectPosts($data->id), 
        'id'=>'postListView'.$data->id, 
        'itemView'=>'_postDetail', 
        'enablePagination'=>true, 
      )); 
echo '</div>' 
?> 
+0

両方のビューのコードを表示します。 – Jon

+3

あなたの質問を編集するのではなく、コメントを投稿してください... – matino

+0

+1、良い質問、私は内側のclistviews用のカスタムページャを作ったり、yiilistview.jsを試してオーバーライドしたり、内側のclistview用のデータプロバイダ。 –

答えて

1

これは私が最終的にはそれが働いて得た方法で、それが動作します。
私は、project_idがあなたの投稿テーブルの外部キーだと仮定しています。
プロジェクトモデルで必要なHAS_MANYリレーションを生成する(giiを使用)と、CallProjectPostsメソッドを呼び出すことなくプロジェクトの投稿に簡単にアクセスできます。

だからあなたのポストビュー(_post.php)を変更します。プロジェクトのリストについては

<?php 
echo '<h2>Project: '. CHTML::encode($data->title).' </h2>'; 
echo '<div class="listViewBorder">'; 

$relatedPosts=new CArrayDataProvider($data->posts, // this is where the HAS_MANY relation comes into play 
     array(
      'pagination'=>array(
       'pageSize'=>1, // whatever your size was 
      ) 
     ) 
); 
$this->widget('zii.widgets.CListView', 
      array(
       'dataProvider'=>$relatedPosts, 
       'id'=>'postListView'.$data->id, 
       'itemView'=>'_postDetail', 
       'enablePagination'=>true, 
      )); 
echo '</div>' 
?> 

<?php 
$this->pageTitle=Yii::app()->name . ' - Project Post Details'; 
echo '<div class="listViewBorder">'; 
$this->widget('zii.widgets.CListView', 
      array(
       'dataProvider'=>$dataProvider, 
       'id'=>'projectListView', 
       'itemView'=>'_post', // refers to the partial view 
       'enablePagination'=>true, 
       'ajaxUpdate'=>false 
     ) 
); 
echo '</div><br />' 
?> 

あなたが見るように、私はプロジェクトリストビューの無効ajaxUpdateを持っている場合などそれが有効になっていれば解決策は機能しませんので、ajaxを介してプロジェクトリストを表示/更新する必要がある場合、これは機能しません。現在、プロジェクト投稿のみがajaxによって更新されます。
これが役に立ちます。

+0

私はMVCモデルに従おうとしました。基本的に、PostControllerで指定された "CallProjectPosts"メソッドは、いくつかの基準に従ってモデルメソッド "getProjectPosts($ id)"を呼び出します。そしてもちろん、プロジェクトClistViewはプロジェクトレベルでもページングにajaxを使用します。今のところyiiの枠組みでは現在の状況は扱われていないと思います。ソリューションを手に入れることができなかったら、最後に機能の構造を変更します。 –

+0

十分ですが、プロジェクトモデルとポストモデルが関連している場合、プロジェクトにはその関係があり、**その追加の基準**を指定してその関係を使用できます。私はこれを初めて使っているので、その関係を使ってmvcに違反するかどうかは分かりません。基本的にはポストモデルを呼び出す必要はありませんが、関係を使用すると内部的に発生します。 ajaxについては、プロジェクトビューでのみプロジェクトを表示している場合は、次のページをAjaxなしで取得しても問題ありません。投稿のみがajaxを経由します。スタックオーバーフローの質問/回答へのコメントに似ています。 –

+0

..質問はajaxなしで読み込まれますが、コメントはあります。ちょうど私の考えを共有する:)。 –

関連する問題