包 | zii.widgets |
---|---|
继承 | class CListView » CBaseListView » CWidget » CBaseController » CComponent |
源自 | 1.1 |
版本 | $Id: CListView.php 3286 2011-06-16 17:34:34Z qiang.xue $ |
源码 |
Unlike CGridView which displays the data items in a table, CListView allows one to use a view template to render each data item. As a result, CListView could generate more flexible rendering result.
CListView supports both sorting and pagination of the data items. The sorting and pagination can be done in AJAX mode or normal page request. A benefit of using CListView is that when the user browser disables JavaScript, the sorting and pagination automatically degenerate to normal page requests and are still functioning as expected.
CListView should be used together with a data provider, preferrably a CActiveDataProvider.
The minimal code needed to use CListView is as follows:
$dataProvider=new CActiveDataProvider('Post'); $this->widget('zii.widgets.CListView', array( 'dataProvider'=>$dataProvider, 'itemView'=>'_post', // refers to the partial view named '_post' 'sortableAttributes'=>array( 'title', 'create_time'=>'Post Time', ), ));
The above code first creates a data provider for the
Post
ActiveRecord class.
It then uses CListView to display every data item as returned by the data provider.
The display is done via the partial view named '_post'. This partial view will be rendered
once for every data item. In the view, one can access the current data item via variable $data
.
For more details, see itemView.
In order to support sorting, one has to specify the sortableAttributes property. By doing so, a list of hyperlinks that can sort the data will be displayed.
公共属性
属性 | 类型 | 描述 | 定义在 |
---|---|---|---|
actionPrefix | string | actions的ID的前缀。 当微件在CController::actions中声明了 动作提供者,可以为其动作的ID指定前缀以区别 于别的微件或控制器。当微件用于控制器 的视图中时,必须配置同样的前缀。 | CWidget |
afterAjaxUpdate | string | a javascript function that will be invoked after a successful AJAX response is received. | CListView |
ajaxUpdate | mixed | the ID of the container whose content may be updated with an AJAX response. | CListView |
ajaxUrl | mixed | the URL for the AJAX requests should be sent to. | CListView |
ajaxVar | string | the name of the GET variable that indicates the request is an AJAX request triggered by this widget. | CListView |
baseScriptUrl | string | the base script URL for all list view resources (e. | CListView |
beforeAjaxUpdate | string | a javascript function that will be invoked before an AJAX update occurs. | CListView |
controller | CController | 返回此微件所属的控制器。 | CWidget |
cssFile | string | the URL of the CSS file used by this list view. | CListView |
dataProvider | IDataProvider | 视图需要显示的数据源。 | CBaseListView |
emptyText | string | 当dataProvider为空时显示的内容。 | CBaseListView |
enablePagination | boolean | 是否启用分页。注意:当IDataProvider::pagination的属性 dataProvider为false时则此属性为false,即不启用分页。 当启用分页时,页码会在视图中显示。 默认为true。 | CBaseListView |
enableSorting | boolean | 是否启用排序。注意:当IDataProvider::sort的属性 dataProvider为false时则此属性为false,即不启用排序。 当启用排序时,点击列名就可按该列排序。 默认为true。 | CBaseListView |
htmlOptions | array | 部件的HTML属性。 | CBaseListView |
id | string | 返回此微件的ID。如果需要的话,将生产一个新的ID并将其返回。 | CWidget |
itemView | string | the view used for rendering each data item. | CListView |
itemsCssClass | string | 显示各条数据的容器的CSS类。默认为‘items’。 | CBaseListView |
itemsTagName | string | the HTML tag name for the container of all data item display. | CListView |
loadingCssClass | string | the CSS class name that will be assigned to the widget container element when the widget is updating its content via AJAX. | CListView |
owner | CBaseController | 返回此微件的所有者或创建者。 | CWidget |
pager | array | pager 的配置信息。默认为array('class'=>'CLinkPager') . |
CBaseListView |
pagerCssClass | string | 显示页码的容器的CSS类。默认为‘pager’。 | CBaseListView |
separator | string | the HTML code to be displayed between any two consecutive items. | CListView |
skin | mixed | 微件使用的皮肤的名称。默认为“default”。 如果此属性设置为false,微件将不会有皮肤被使用。 | CWidget |
sortableAttributes | array | list of sortable attribute names. | CListView |
sorterCssClass | string | the CSS class name for the sorter container. | CListView |
sorterFooter | string | the text shown after sort links. | CListView |
sorterHeader | string | the text shown before sort links. | CListView |
summaryCssClass | string | 显示摘要的容器的CSS类。默认为‘summary’。 | CBaseListView |
summaryText | string | 摘要内容使用的模板。
下面的这些标记将会被对应的内容替换:
|
CBaseListView |
tagName | string | 视图容器的标签。默认为‘div’。 | CBaseListView |
template | string | the template to be used to control the layout of various components in the list view. | CListView |
updateSelector | string | the jQuery selector of the HTML elements that may trigger AJAX updates when they are clicked. | CListView |
viewData | array | additional data to be passed to itemView when rendering each data item. | CListView |
viewPath | string | 返回包含此微件所需的视图文件的路径。 | CWidget |
公共方法
受保护方法
方法 | 描述 | 定义在 |
---|---|---|
renderSection() | 渲染指定部分的内容。 | CBaseListView |
属性详细
a javascript function that will be invoked after a successful AJAX response is received.
The function signature is function(id, data)
where 'id' refers to the ID of the list view
'data' the received ajax response data.
the ID of the container whose content may be updated with an AJAX response. Defaults to null, meaning the container for this list view instance. If it is set false, it means sorting and pagination will be performed in normal page requests instead of AJAX requests. If the sorting and pagination should trigger the update of multiple containers' content in AJAX fashion, these container IDs may be listed here (separated with comma).
the URL for the AJAX requests should be sent to. CHtml::normalizeUrl() will be called on this property. If not set, the current page URL will be used for AJAX requests.
the name of the GET variable that indicates the request is an AJAX request triggered by this widget. Defaults to 'ajax'. This is effective only when ajaxUpdate is not false.
the base script URL for all list view resources (e.g. javascript, CSS file, images). Defaults to null, meaning using the integrated list view resources (which are published as assets).
a javascript function that will be invoked before an AJAX update occurs.
The function signature is function(id)
where 'id' refers to the ID of the list view.
the URL of the CSS file used by this list view. Defaults to null, meaning using the integrated CSS file. If this is set false, you are responsible to explicitly include the necessary CSS file in your page.
the view used for rendering each data item. This property value will be passed as the first parameter to either CController::renderPartial or CWidget::render to render each data item. In the corresponding view template, the following variables can be used in addition to those declared in viewData:
-
$this
: refers to the owner of this list view widget. For example, if the widget is in the view of a controller, then$this
refers to the controller. -
$data
: refers to the data item currently being rendered. -
$index
: refers to the zero-based index of the data item currently being rendered. -
$widget
: refers to this list view widget instance.
the HTML tag name for the container of all data item display. Defaults to 'div'.
the CSS class name that will be assigned to the widget container element when the widget is updating its content via AJAX. Defaults to 'list-view-loading'.
the HTML code to be displayed between any two consecutive items.
list of sortable attribute names. In order for an attribute to be sortable, it must also appear as a sortable attribute in the IDataProvider::sort property of dataProvider.
the CSS class name for the sorter container. Defaults to 'sorter'.
the text shown after sort links. Defaults to empty.
the text shown before sort links. Defaults to 'Sort by: '.
the template to be used to control the layout of various components in the list view. These tokens are recognized: {summary}, {sorter}, {items} and {pager}. They will be replaced with the summary text, the sort links, the data item list, and the pager.
the jQuery selector of the HTML elements that may trigger AJAX updates when they are clicked. If not set, the pagination links and the sorting links will trigger AJAX updates.
additional data to be passed to itemView when rendering each data item. This array will be extracted into local PHP variables that can be accessed in the itemView.
方法详细
public void init()
|
public function init()
{
if($this->itemView===null)
throw new CException(Yii::t('zii','The property "itemView" cannot be empty.'));
parent::init();
if(!isset($this->htmlOptions['class']))
$this->htmlOptions['class']='list-view';
if($this->baseScriptUrl===null)
$this->baseScriptUrl=Yii::app()->getAssetManager()->publish(Yii::getPathOfAlias('zii.widgets.assets')).'/listview';
if($this->cssFile!==false)
{
if($this->cssFile===null)
$this->cssFile=$this->baseScriptUrl.'/styles.css';
Yii::app()->getClientScript()->registerCssFile($this->cssFile);
}
}
初始化list view。 这个方法会初始化请求值并实例化列columns对象。
public void registerClientScript()
|
public function registerClientScript()
{
$id=$this->getId();
if($this->ajaxUpdate===false)
$ajaxUpdate=array();
else
$ajaxUpdate=array_unique(preg_split('/\s*,\s*/',$this->ajaxUpdate.','.$id,-1,PREG_SPLIT_NO_EMPTY));
$options=array(
'ajaxUpdate'=>$ajaxUpdate,
'ajaxVar'=>$this->ajaxVar,
'pagerClass'=>$this->pagerCssClass,
'loadingClass'=>$this->loadingCssClass,
'sorterClass'=>$this->sorterCssClass,
);
if($this->ajaxUrl!==null)
$options['url']=CHtml::normalizeUrl($this->ajaxUrl);
if($this->updateSelector!==null)
$options['updateSelector']=$this->updateSelector;
if($this->beforeAjaxUpdate!==null)
$options['beforeAjaxUpdate']=(strpos($this->beforeAjaxUpdate,'js:')!==0 ? 'js:' : '').$this->beforeAjaxUpdate;
if($this->afterAjaxUpdate!==null)
$options['afterAjaxUpdate']=(strpos($this->afterAjaxUpdate,'js:')!==0 ? 'js:' : '').$this->afterAjaxUpdate;
$options=CJavaScript::encode($options);
$cs=Yii::app()->getClientScript();
$cs->registerCoreScript('jquery');
$cs->registerCoreScript('bbq');
$cs->registerScriptFile($this->baseScriptUrl.'/jquery.yiilistview.js',CClientScript::POS_END);
$cs->registerScript(__CLASS__.'#'.$id,"jQuery('#$id').yiiListView($options);");
}
注册必要的客户端脚本。
public void renderItems()
|
public function renderItems()
{
echo CHtml::openTag($this->itemsTagName,array('class'=>$this->itemsCssClass))."\n";
$data=$this->dataProvider->getData();
if(($n=count($data))>0)
{
$owner=$this->getOwner();
$render=$owner instanceof CController ? 'renderPartial' : 'render';
$j=0;
foreach($data as $i=>$item)
{
$data=$this->viewData;
$data['index']=$i;
$data['data']=$item;
$data['widget']=$this;
$owner->$render($this->itemView,$data);
if($j++ < $n-1)
echo $this->separator;
}
}
else
$this->renderEmptyText();
echo CHtml::closeTag($this->itemsTagName);
}
显示每一个数据项。
public void renderSorter()
|
public function renderSorter()
{
if($this->dataProvider->getItemCount()<=0 || !$this->enableSorting || empty($this->sortableAttributes))
return;
echo CHtml::openTag('div',array('class'=>$this->sorterCssClass))."\n";
echo $this->sorterHeader===null ? Yii::t('zii','Sort by: ') : $this->sorterHeader;
echo "<ul>\n";
$sort=$this->dataProvider->getSort();
foreach($this->sortableAttributes as $name=>$label)
{
echo "<li>";
if(is_integer($name))
echo $sort->link($label);
else
echo $sort->link($name,$label);
echo "</li>\n";
}
echo "</ul>";
echo $this->sorterFooter;
echo CHtml::closeTag('div');
}
显示排序了的数据。