【发布时间】:2014-02-11 04:56:05
【问题描述】:
我在很长一段时间内都面临着一个麻烦的情况,但没有任何明确的解决方案。问题是我有一个网格视图,它显示产品信息和 5d、6m 和 12m 的投资回报率以及另一个称为总利润百分比的列。这个总盈利百分比列是针对每个月单独计算的,并存储在数据库中的单独列中。
现在的问题是,如何让这个名为总盈利百分比的列显示用户当前正在排序的 roi 月份的信息。因此,如果用户对 5d ROI 列进行排序,总盈利百分比将重新计算为 5 天总盈利百分比。如果用户在 6m ROI 列上排序,则总盈利百分比将再次重新计算为 6m ,依此类推。我一直试图找到一种方法来实现这一点,方法是将“可见”属性设置为 false 为整个月的总盈利百分比列,除了用户正在对 ROI 列进行排序的列,但它不起作用全部。
这是有问题的网格视图。
$this->widget('bootstrap.widgets.TbGridView', array(
'id' => 'product-news-grid-'. $id,
'itemsCssClass' => 'table table-striped',
'htmlOptions' => array(
'class' => 'news-datagrid',
),
'dataProvider' => $dataProvider->searchProductNewsSymbol($name, $headlines, $publish_date),
'filter' => $dataProvider,
'enableHistory' => false,
'ajaxUpdate' => 'product-news-grid-'. $id,
'ajaxUrl' => Yii::app()->createUrl('/productDetails/AjaxUpdateProductNews'),
'pager' => array(
'header' => '',
'cssFile' => false,
'maxButtonCount' => 5,
'selectedPageCssClass' => 'active',
'hiddenPageCssClass' => 'disabled',
'firstPageCssClass' => 'previous',
'lastPageCssClass' => 'next',
'firstPageLabel' => '<<',
'lastPageLabel' => '>>',
'prevPageLabel' => '<',
'nextPageLabel' => '>',
),
'summaryCssClass' => 'label label-warning',
'columns' => array(
array(
'name' => 'name',
'header' => 'Name',
'value' => function($data) {
return '<div class="product-name"> <a target="_blank" href="'. $data->id .'" > '. $data->name .'</a></div>';
},
'type' => 'raw',
),
array(
'name' => 'headlines',
'header' => 'Headlines',
'value' => function($data) {
return '<div class="product-news"> <a target="_blank" href="'. $data->link .'" > '. $data->headlines .'</a></div>';
},
'type' => 'raw',
),
array(
'name' => 'publish_date',
'header' => 'Date',
'value' => function($data) {
return '<span class="news-pub-date">'. $data->publish_date .'</span>';
},
'type' => 'raw',
),
array(
'name' => 'fived_roi',
'header' => '5d ROI',
'value' => function($data) {
return '<span class="news-pub-date">'. $data->fived_roi .'</span>';
},
'type' => 'raw',
),
array(
'name' => 'sixm_roi',
'header' => '6m ROI',
'value' => function($data) {
return '<span class="news-pub-date">'. $data->sixm_roi .'</span>';
},
'type' => 'raw',
),
array(
'name' => 'twlm_roi',
'header' => '12m ROI',
'value' => function($data) {
return '<span class="news-pub-date">'. $data->twlm_roi .'</span>';
},
'type' => 'raw',
),
array(
'name' => 'fived_profit',
'header' => 'Total Profit %',
'value' => function($data) {
return '<span class="news-pub-date">'. $data->fived_profit .'%</span>';
},
'type' => 'raw',
),
array(
'name' => 'sixm_profit',
'header' => 'Total Profit %',
'value' => function($data) {
return '<span class="news-pub-date">'. $data->sixm_profit .'%</span>';
},
'type' => 'raw',
'visible' => false
),
array(
'name' => 'twlm_profit',
'header' => 'Total Profit %',
'value' => function($data) {
return '<span class="news-pub-date">'. $data->twlm_profit .'%</span>';
},
'type' => 'raw',
'visible' => true
),
)
));
?>
我试图通过将点击处理程序附加到表格列标题并呈现一个不同的视图来完成这项工作,该视图可以显示任何总盈利百分比列。但它不起作用,因为排序不起作用,渲染不同的网格后整个网格崩溃了。
所以任何人都可以为我指出如何达到预期结果的正确方向。我将不胜感激。
谢谢, 马克斯
编辑
这里是 searchProductNewsSymbol() 的代码
public function searchProductNewsSymbol ( $name ,
$headlines = NULL ,
$publish_date = NULL ) {
// @todo Please modify the following code to remove attributes that should not be searched.
$criteria = new CDbCriteria ;
$criteria->select = 'name, publish_timestamp, publish_date, headlines, link, last_updated';
$criteria->group = 'headlines';
$criteria->compare ( 'name' ,
$name ,
true ) ;
if ( isset ( $headlines ) || $headlines != "" ) {
$criteria->compare ( 'headlines' ,
$headlines ,
TRUE ,
'AND' ) ;
}
if ( isset ( $publish_date ) || $publish_date != "" ) {
$criteria->compare ( 'publish_date' ,
$publish_date ,
TRUE ,
'AND' ) ;
}
return new CActiveDataProvider ( $this ,
array (
'criteria' => $criteria ,
'sort' => array (
'defaultOrder' => 'publish_date desc' ,
) ,
) ) ;
}
【问题讨论】:
-
请贴出数据库表的结构。
-
@jailedabroad 架构与帖子中指定的列相同
-
@mazraara 感谢您的链接。我之前尝试过该解决方案,您知道在计时器上进行 ajax 更新网格。但在我的情况下,应该在列排序时触发 ajax 更新。
-
@Maxx 试试我发布的这个答案。