如何将CDetailView与CArrayDataProvider一起使用?

时间:2013-09-20 12:09:26

标签: php yii

我正在尝试从SQL Server存储过程中获取数据,因此我在YII Framework中使用了createCommand方法。

我已经创建了gridView,但是在CDetailView中没有任何显示使用相同的东西。

我用过:

public function getHotel($id = 0){

        /**
         * Building Query for Getting Hotel List Stored Procedure with
         * or Without Parameter defined
         */
        $sql = "EXECUTE procName '".$id."'";

        /**
         * Set Database Connection and instruct Yii Query Builder to Execute SQL
         */
        $connection = Yii::app()->db;
        $command = $connection->createCommand($sql);

        /**
         * Execute the stored procedure.
         */

        $results = $command->queryAll();

        /**
         * Set the DataProvider that will be used in Grid
         */

        $sqlDataProvider = new CArrayDataProvider($results,array(
            'keyField'      => 'hotel_id',
        ));

        /**
         * Return DataProvider
         */

        return $sqlDataProvider;

    }

它正确地为我提供了所需的id数据,但是当我在view.php中使用CDetailView时,没有任何东西显示给我。

这是我的控制器代码:

public function actionView($id)
{

        /**
         * Call the method to generate the CArrayDataProvider by executing the stored procedure.
         */

        $dataProvider = Hotel::model()->getHotel($id);
        $model = new Hotel('getHotel('.$id.')');

        /**
         * Return with the webpage that contains the data grid using the $dataProvider
         * generated earlier
         */

        $this->render('view',array(
            'dataProvider'  => $dataProvider,
            'model'         => $model,
        ));

}

这是view.php代码:

<h1>View Hotel #<?php echo $model->hotel_id; ?></h1>

<?php $this->widget('zii.widgets.CDetailView', array(
    'data'=>$dataProvider,
    'attributes'=>array(
        'hotel_id',
        'name',
        'category_id',
        'currency_id',
        'facility',
        'rel_days',
        'city_id',
        'country_id',
        'telephone',
        'location',
        'email',
        'fax',
        'contact_person',
        'website',
        'address',
        'gl_id',
        'policy',
        'status',
        'date_added',
        'date_modified',
        'user_id',
    ),
)); ?>

输出我正在研究broswer就像:

  

酒店ID:未设置

     

名称:未设置

     

     

     

     

     

     

     

     

     

用户ID:未设置

请帮我解决这个问题。

提前致谢!

3 个答案:

答案 0 :(得分:0)

也许我错了,但CdetailView使用了一个模型元素,你得到一个数组

$model = KPI::model()->findByPk($id); - It is one element
$this->widget('bootstrap.widgets.TbDetailView', array(
        'data'=>$model,
        'itemCssClass'=>array('detailViewTr'),
        'attributes'=>array(                                    
            'description',
            'field',
            'dt_from',
            'dt_to',
            array('name'=>'period','value'=>$period[$model->period]),
            array('value'=>$model->user->fio,'name'=>'KPI создал'),             
            array('value'=>$model->direction->caption,'name'=>'Отдел заказчик')
        ),
    ));

答案 1 :(得分:0)

对于CDetailView,你应该使用CArrayDataProvider。您应该使用模型,CActiveRecord通常用于SQL数据库。

鉴于$model = new Hotel('getHotel('.$id.')');返回CModel个对象,这应该适合您。

将view.php更改为:

<?php $this->widget('zii.widgets.CDetailView', array(
    'data'=>$model,
    'attributes'=>array(
        'hotel_id',
        'name',
        ...
        'user_id',
    ),
)); ?>

查看本教程http://www.yiiframework.com/doc/guide/1.1/en/database.ar

答案 2 :(得分:0)

我已经解决了这个问题。

我用以下函数替换了函数getHotel($ id = 0):

public function getHotel($id = 0){

        /**
         * Building Query for Getting Hotel List Stored Procedure with
         * or Without Parameter defined
         */
        $sql = "EXECUTE viewHotel '".$id."'";

        /**
         * Set Database Connection and instruct Yii Query Builder to Execute SQL
         */
        $connection = Yii::app()->db;
        $command = $connection->createCommand($sql);

        /**
         * Execute the stored procedure.
         */

        $results = $command->queryAll();
        foreach($results as $result){

            foreach($result as $key=>$val){
                $hotels[$key] = $val;
            }

        }

        return $hotels;

    }

实际上,$ results = $ command-&gt; queryAll();返回一个多维数组,所以我转换成带索引的简单数组及其值,然后将其返回给控制器,以便在CDetailView中呈现它。

感谢您的支持!