Php 在使用clistview小部件时,$数据是如何从dataprovider中提取的?
在yii框架演示中,有一个博客演示。在这个博客演示中,Post控制器有两个不同的操作:索引和查看Php 在使用clistview小部件时,$数据是如何从dataprovider中提取的?,php,yii,Php,Yii,在yii框架演示中,有一个博客演示。在这个博客演示中,Post控制器有两个不同的操作:索引和查看 /** * Lists all models. */ public function actionIndex() { $criteria=new CDbCriteria(array( 'condition'=>'status='.Post::STATUS_PUBLISHED, 'order'=>'update_time DESC',
/**
* Lists all models.
*/
public function actionIndex()
{
$criteria=new CDbCriteria(array(
'condition'=>'status='.Post::STATUS_PUBLISHED,
'order'=>'update_time DESC',
'with'=>'commentCount',
));
if(isset($_GET['tag']))
$criteria->addSearchCondition('tags',$_GET['tag']);
$dataProvider=new CActiveDataProvider('Post', array(
'pagination'=>array(
'pageSize'=>Yii::app()->params['postsPerPage'],
),
'criteria'=>$criteria,
));
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
/**
* Displays a particular model.
*/
public function actionView()
{
$post=$this->loadModel();
$comment=$this->newComment($post);
$this->render('view',array(
'model'=>$post,
'comment'=>$comment,
));
}
索引视图是:
<?php $this->widget('zii.widgets.CListView', array(
'dataProvider'=>$dataProvider,
'itemView'=>'_view',
'template'=>"{items}\n{pager}",
)); ?>
视图为:
<?php $this->renderPartial('_view', array(
'data'=>$model,
)); ?>
但索引和视图都使用_-view:
<div class="author">
posted by <?php echo $data->author->username . ' on ' . date('F j, Y',$data->create_time); ?>
</div>
<div class="content">
<?php
$this->beginWidget('CMarkdown', array('purifyOutput'=>true));
echo $data->content;
$this->endWidget();
?>
</div>
邮寄人
这里是我的问题:我可以理解视图分配'data'=>$model,因此在_view中,$data是有效的。在索引操作中,应用了小部件clistview,但我无法理解$data变量设置在哪里?我知道$data表示当前帖子(来自dataprovider)。我只是不知道yii是怎么做的,在哪里做的?
感谢您的帮助。以上代码首先为Post ActiveRecord类创建一个数据提供程序。然后,它使用CListView显示数据提供程序返回的每个数据项。通过名为“\u post”的局部视图进行显示。此局部视图将为每个数据项呈现一次。在视图中,可以通过变量$data访问当前数据项 通过使用用于呈现每个数据项的CListView的itemView属性。此属性值将作为第一个参数传递给CController属性renderpartial,以呈现每个数据项
public string renderPartial(string $view, array $data=NULL, boolean $return=false, boolean $processOutput=false)
public function renderPartial($view,$data=null,$return=false,$processOutput=false)
{
if(($viewFile=$this->getViewFile($view))!==false)
{
$output=$this->renderFile($viewFile,$data,true);
if($processOutput)
$output=$this->processOutput($output);
if($return)
return $output;
else
echo $output;
}
else
throw new CException(Yii::t('yii','{controller} cannot find the requested view "{view}".',
array('{controller}'=>get_class($this), '{view}'=>$view)));
}
渲染视图
如果$data是一个关联数组,它将被提取为PHP变量并提供给脚本。命名视图引用一个PHP脚本。该脚本通过renderPartial方法中使用的getViewFile解析getViewFile脚本,如下所示
public function getViewFile($viewName)
{
if(($theme=Yii::app()->getTheme())!==null && ($viewFile=$theme->getViewFile($this,$viewName))!==false)
return $viewFile;
$moduleViewPath=$basePath=Yii::app()->getViewPath();
if(($module=$this->getModule())!==null)
$moduleViewPath=$module->getViewPath();
return $this->resolveViewFile($viewName,$this->getViewPath(),$basePath,$moduleViewPath);
}
根据给定的视图名称查找视图文件
renderItems是CBaseListView类文件中定义的抽象方法
/**
* Renders the data items for the view.
* Each item is corresponding to a single data model instance.
* Child classes should override this method to provide the actual item rendering logic.
*/
abstract public function renderItems();
此方法由ClistView类重写,ClistView通过
$dataProvider
小部件循环,对于每个项目,它执行如下操作:
$this->renderPartial($itemView, array(
'data'=>$model,
));
其中,$itemView
是在CListView
config中设置的视图文件
就这样
编辑:为了澄清如何使用CListView
:它是在CListView::renderItems
中定义的,简而言之,最重要的部分是:
// Get dataprovider data as array
$data=$this->dataProvider->getData();
...
// Get viewfile
$viewFile=$owner->getViewFile($this->itemView);
...
// Loop thru $data items
foreach($data as $i=>$item)
{
...
// Here data is assigned from dataprovider item
$data['data']=$item;
...
// Render view file
$owner->renderFile($viewFile,$data);
}
谢谢你的回答。现在我知道了,yii将提取作为第二个参数传递给当前脚本的变量数组,并且CListView小部件通过$dataProvider循环。我查看了CListView src,但仍然不知道哪种方法将执行循环$dataProvider工作,请给我一个提示好吗?是的,就是这样。谢谢你的回答。这个renderItems方法似乎完成了循环工作。我最后的困惑是:这个renderItems在哪里被调用?我浏览了yii src文件,没有找到任何来电者。提示:临时编辑
renderItems
并抛出一些异常
,您将看到感谢您的回答。所以我可以看到我将提取关联数组到当前脚本。我看到了一个名为renderItems的CListView方法,这个方法在做循环渲染工作吗?如果是这样的话,renderItems在哪里被调用呢?我只是不知道哪种方法将实际执行循环工作。我在frameworkdir及其所有子dir中找不到任何称为此renderItems函数的方法。(如果此renderItems函数通过$dataprovider循环)