Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在使用clistview小部件时,$数据是如何从dataprovider中提取的?_Php_Yii - Fatal编程技术网

Php 在使用clistview小部件时,$数据是如何从dataprovider中提取的?

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',

在yii框架演示中,有一个博客演示。在这个博客演示中,Post控制器有两个不同的操作:索引和查看

/**
 * 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循环)