我正在尝试从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:未设置
请帮我解决这个问题。
提前致谢!
答案 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中呈现它。
感谢您的支持!