更改yii crud生成的页面

时间:2013-07-14 15:21:23

标签: php yii

我有两种型号:出租车司机和出租车订单。在taxiOrders我有一个字段driver_id,但我不想只是一个id,我想输出驱动程序的名称(位于taxiDrivers)。两个模型都是通过gii生成的,并且还生成了crud工具。需要更改的页面是taxiOrders / admin(查看:admin.php,型号:TaxiOrders.php,TaxiDrivers.php和各自的控制器)

2 DCoder :谢谢老兄!但我还有一个问题,希望你能澄清一下:我有一个标准生成的admin.php视图页面,其中包含以下代码:

 <?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'taxi-orders-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'id',
        'uid',
        'did',
        'type',
        'notes',
        //'or_lat',

        //'or_lng',
        //'des_lat',
        //'des_lng',
        'cost',
        'rating',
        'date',
        'time',
        'status',

        array(
            'class'=>'CButtonColumn',
        ),
    ),
)); ?>
and below code is for controller:public function actionAdmin()
    {
        $model=new TaxiOrders('search');
        $model->unsetAttributes();  // clear any default values
        if(isset($_GET['TaxiOrders']))
            $model->attributes=$_GET['TaxiOrders'];

        $this->render('admin',array(
            'model'=>$model,
        ));
    }

那么请你告诉我我可以把你的操作放在哪里。

3 个答案:

答案 0 :(得分:4)

Yii方式是定义两个模型类之间的关系(并使用外键强制执行)。然后Yii会知道这两个类是如何相关的,你可以更轻松地加载相关数据。

TaxiOrders模型类中,关系看起来像这样:

/**
 *  @property TaxiDrivers $Driver
 */
class TaxiOrders extends CActiveRecord {

  // ...

  public function relations() {
    return array(
      'Driver' => array(self::BELONGS_TO, 'TaxiDrivers', 'driver_id'),
    );
  }

  // ...
}

在控制器中,当您加载订单数据时,您可以预取相关的驱动程序数据,如下所示:

public function actionOrderInfo($orderID) {
  $order = TaxiOrders::model()->with('Driver')->findByPk($orderID);
  // render it
}

with('Driver')将确保每个返回的订单都已加载其驱动程序信息,无论您是否需要查找一条记录或大量记录。它比尝试自己加载相关数据要高效得多。

在视图中,您可以输出以下驱动程序信息:

echo CHtml::encode($order->Driver->Name);

除非您有外键来确保数据完整性,否则可能已删除驱动程序而未清除其现有订单......在这种情况下,$order->Driver将为NULL并且上面一行会导致错误。弄清楚如何避免它应该是显而易见的。

答案 1 :(得分:1)

在TaxiOrders管理员中使用此功能显示驱动程序名称

   TaxiDrivers::getName($data->driver_id);

现在在TaxiDrivers模型中编写一个带有sql查询的函数来获取这样的驱动程序名称......

    public function getName($getid) {
    $sql = "SELECT name  from `taxi_drivers` where `driver_id`='$getid'";
    $command=yii::app()->db->createCommand($sql);
    $rs = $command->queryScalar();
    return $rs;
    }

我希望它会对你有帮助..

答案 2 :(得分:1)

在连接方案中,我总是更喜欢使用Query Builder方法而不是Active记录方法。像那样

首先通过查询生成器获取数据

public function getTaxtOrder($id)    {
    $select = Yii::app()->db->createCommand()
          ->select('to.*, td.name as driver_name')
          ->from('TaxiOrders to')
          ->join('TaxiDriver td', 'td.id = to.driver_id')
          ->where('to.id = :id', array(':id' => $id));
    return $select->queryRow();        
}

然后通过控制器

$data = TaxiOrders::model()->getTaxtOrder($id);
$this->render('view',array(
    'data' => $data
));

最后将此用于视图

$this->widget('zii.widgets.CDetailView', array(
    'data'=>$data,
    'attributes'=>array(
       array('label' => 'Order No', 'value' =>$model['order_no']),
       array('label' => 'Driver Name', 'value' =>$model['driver_name']),
       array('label' => 'Date', 'value' =>$model['order_date']),
    ),
)); 

与Active Record Approach相比,这种方法可以轻松灵活地使用多个连接表。