Zheka
Zheka

Reputation: 129

Change yii crud generated page

I have 2 models: taxiDrivers and taxiOrders. In taxiOrders I have a field driver_id, but instead of just an id, I want to output driver's name (which is located in taxiDrivers). Both models are generated via gii, and crud tools are also generated. The page which is needed to be changed is taxiOrders/admin (view: admin.php, models: TaxiOrders.php, TaxiDrivers.php and respective controllers)

2 DCoder: Thanks dude! but one more query I have and hope you can clearify: I have a standart generated admin.php view page with following code:

 <?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,
        ));
    }

So can u please show me where I could put your manipulations.

Upvotes: 1

Views: 1259

Answers (3)

kuldeep.kamboj
kuldeep.kamboj

Reputation: 2606

I always prefer Query Builder approach instead of Active record approach in joined scenarios. Like that

First Get Data through Query Builder

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();        
}

Then Pass through controller

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

Last use this into views

$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']),
    ),
)); 

This approach easily and flexibly work with multiple joined tables than Active Record Approach.

Upvotes: 1

user1233508
user1233508

Reputation:

The Yii way would be to define a Relation between the two model classes (and enforce it with a Foreign Key). Then Yii would know how the two classes are related and you would have an easier time loading the related data.

In the TaxiOrders model class, a relation would look like this:

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

  // ...

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

  // ...
}

In the controller, when you load the order data, you can prefetch the associated driver data like this:

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

with('Driver') will make sure that each returned order has its driver info already loaded, no matter if you need to find one record or a lot of records. It is a lot more efficient than trying to load that related data yourself.

In the view, you can output the driver info like this:

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

Unless you have a foreign key to ensure data integrity, it is possible that the Driver has been deleted without clearing his existing orders... In that case $order->Driver will be NULL and the line above will cause an error. Figuring out how to avoid it should be obvious.

Upvotes: 4

Bharu
Bharu

Reputation: 191

In TaxiOrders admin use this to display driver name

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

Now in the TaxiDrivers Model write a function with sql query to get the driver name like this...

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

I Hope it will help you..

Upvotes: 1

Related Questions