【问题标题】:Change yii crud generated page更改 yii crud 生成的页面
【发布时间】:2013-07-14 15:21:22
【问题描述】:

我有 2 个模型:taxiDrivers 和 taxOrders。在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,
        ));
    }

那么你能告诉我我可以把你的操作放在哪里吗?

【问题讨论】:

  • 哇伙计们这么难吗?如果您不理解我的解释,请询问。换句话说,我想修改taxiOrders管理视图页面中的输出。

标签: php yii


【解决方案1】:

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-&gt;Driver 将是NULL 并且上面的行会导致错误.弄清楚如何避免它应该是显而易见的。

【讨论】:

  • 谢谢老兄!但我还有一个查询,希望您能澄清:我有一个标准生成的 admin.php 视图页面,其中包含以下代码: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', ), ), )); ?> 以下代码用于控制器:
【解决方案2】:

在 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;
    }

希望对你有帮助..

【讨论】:

  • 不是一个好方法。 1) 如果每页多次使用,每个驱动程序的单独查询将破坏页面性能。 2) 手动构建命令而不是使用 ActiveRecord 更多的工作没有收获。 3) 不使用绑定变量进行动态输入是不安全的。
  • 感谢您的解释,如果您能详细解释您评论的答案,那么它将非常有用。
  • @DCoder 实际上至少在视图页面上不会影响性能。
  • 但是我更喜欢查询中的联接而不是单独的查询,并且更喜欢使用查询生成器方法来创建联接语句。
  • @kuldeep.kamboj: 1) 是的,它不会影响单个订单视图页面的性能。但是,它的效率会降低。 2)加入查询正是我的答案所推荐的,无需手动编写连接代码。
【解决方案3】:

在联合场景中,我总是更喜欢 Query Builder 方法而不是 Active Record 方法。就这样

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

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 方法相比,这种方法可以轻松灵活地处理多个连接表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多