0

我正在尝试从 SQL Server 存储过程中获取数据,所以我在 YII 框架中使用 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',
    ),
)); ?>

我在浏览器上得到的输出是这样的:

酒店 ID : 未设置

名称:未设置

.

.

.

.

.

.

.

.

用户 ID:未设置

请帮我解决这个问题。

提前致谢!

4

3 回答 3

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'=>'Отдел заказчик')
        ),
    ));
于 2013-09-20T12:47:51.167 回答
0

对于 aCDetailView你不应该使用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

于 2013-09-20T12:59:59.507 回答
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->queryAll(); 返回一个多维数组,因此我将其转换为具有索引及其值的简单数组,然后将其返回给控制器以在 CDetailView 中呈现它。

谢谢你的支持!

于 2013-09-21T05:48:47.463 回答