我正在使用CActiveDataProvider填充显示用户之间消息的网页。我有一个视图php文件,它使用'zii.widgets.CListView'和CActiveDataProvider。
我正在使用部分_item.php文件来呈现每条消息。目前,每条消息都会在每条消息上方呈现实线,每条消息由_item.php文件指定。
<hr style="border-bottom:solid 1px #efefef; border-top:solid 0px #fff;" />
我想仅在以前显示的消息来自其他用户时才显示此行。我之所以这样做,我需要能够从dataprovider获取有关前一项(或者下面的项)的信息。我该如何做到这一点?
它看起来像什么:
用户1:foobar blah blah
用户2:asdlkfj; ajd
用户2:aljs; dfjlkjk
我希望它看起来像是什么:
用户1:foobar blah blah
用户2:asdlkfj; ajd
用户2:aljs; dfjlkjk
这就是我的控制器的样子:
$dataProvider = new CActiveDataProvider('MailboxMessage', array(
'criteria' => array(
'condition' => 'conversation_id=:cid',
'params' => array(
':cid' => $_GET['id']
),
),
'sort' => array(
'defaultOrder' => 'created DESC' // this is it.
),
'pagination' => array('pageSize' =>20),
));
答案 0 :(得分:1)
我假设你的消息历史记录有这样的订单
user1: Hi Pete!
--------------------------------
user2: Hi Michael!
user2: Do you think about our plan yet?
--------------------------------
user1: Yes, I do.
Message表中的那些记录看起来像
-----------------------------------------------------------
msg_id | msg | user_id (FK)
-----------------------------------------------------------
12004 Hi Pete! 1
12005 Hi Michael! 2
12006 Do you think about our plan yet? 2
12007 Yes, I do. 1
在$show_line
模型中添加一个属性Message
,不要忘记将其设为safe
属性
$list_msg = Message:model->findAll(); // could be changed by your way to fetch all of messages & sort them by order of message
if(count($list_msg)>2){
for($i=0; $i<count($list_msg);$i++){
if($i < count($list_msg)-1){
//check if owner of current message item is owner of next message also
$list_msg[$i]->show_line = $list_msg[$i]->user_id == $list_msg[$i+1]->user_id; // user_id in my case is FK on Message table. I am not sure what it was in your db but you can customize it to appropriately
}
}
}
//$dataProvider = new CArrayDataProvider('Message');
//$dataProvider->setData($list_msg);
$dataProvider=new CArrayDataProvider($list_msg, array(
'id'=>'msg',
'sort'=>array(
.....
),
'pagination'=>array(
'pageSize'=>20,
),
));
将DataProvider
设置到列表视图中
然后在项目视图中,您将捕获布尔show_line以显示或隐藏hr
行
<?php if($data->show_line) {?> <hr .../> <?php } ?>
以上是如何使其工作的一种方式,它无法完全匹配您的代码。