【问题标题】:yii parent child Clistview paging issueyii父子Clistview分页问题
【发布时间】:2011-12-07 14:28:38
【问题描述】:

我正在使用 php 的 Yii 框架。我的情况是我有很多项目,所有项目都有帖子。对于我使用 Clistview 的项目,并且在此控件的“itemView”中指定了另一个名为“_post”的页面。在“_post”页面中,再次指定 ClistView 以显示帖子详细信息。

但问题是当项目的post details Clistview中发生分页并将一个post detail的页码更改为下一页页码时,所有post detail clistview页码都会更改。

我还指定了 post detail 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>'
?>

【问题讨论】:

  • 向我们展示这两个视图的代码。
  • 编辑您的问题,而不是在 cmets 中发布...
  • +1,好问题,我认为您可能必须为内部 clistviews 制作自定义寻呼机,或者尝试覆盖 yiilistview.js,或者在您的数据提供程序中为内部做一些不同的事情clistview,不确定。
  • 你在 yii 论坛发过这个吗?另请查看此扩展程序,这可能会有所帮助:yiiframework.com/extension/nestedsetbehavior
  • 基本上子CLISTVIEW分页调用项目控制器动作,并在这个动作中显示项目页面等等。我也在 yii 论坛上发布了这个问题,但到目前为止没有得到任何回应

标签: php yii


【解决方案1】:

这就是我最终让它工作的方式,它会一直工作,直到你找到更好的解决方案。
我假设 project_id 是你的帖子表中的外键。
这将在您的项目模型中生成(使用 gii)必要的 HAS_MANY 关系,从而使我们能够轻松访问项目的帖子,而无需调用 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更新。
希望这会有所帮助。

【讨论】:

  • 我尝试遵循 MVC 模型。基本上是 PostController 中指定的“CallProjectPosts”方法,该方法根据某些标准进一步调用模型方法“getProjectPosts($id)”。当然,项目 ClistView 也将使用 ajax 在项目级别进行分页。我认为目前的情况还没有在 yii 框架中处理。如果我无法获得解决方案,那么最后我将更改功能的结构。
  • 很公平,但如果项目模型和后期模型是相关的,那么项目具有该关系,我们可以使用该关系,并指定附加条件。我对此并不陌生,所以我不确定使用该关系是否会违反 mvc。基本上你不需要调用 post 模型,它会在使用关系时在内部发生。至于ajax,我相信,如果在项目视图中您只显示项目,那么如果您在没有ajax 的情况下获得下一页就可以了。只有帖子将通过ajax。类似于堆栈溢出中的问题/答案的 cmets..
  • ..questions 是在没有 ajax 的情况下加载的,但 cmets 是。只是分享我的想法:)。
  • 您可以将relatedPosts dataProvider 移动到控制器,也可以使用CActiveDataProvider 代替CArrayDataProvider。
  • 现在我正在考虑改变功能的结构,而不是使用两个 CListView,yii 框架的无限滚动扩展将使用。顺便感谢您的时间 DroidUser。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多