2>/dev/null

CButtonColumn extension for Yii Framework

Summary:

Useful for CGridView tables for data with a composite primary key, and/or data whose type doesn’t match the current controller

One of the built-in widgets in Yii Framework is CGridView, used in index and admin views in the code generated by the yiic tool. This in turn makes use of CButtonColumn to add standard View/Edit/Delete buttons to the CGridView table. Very handy.

The default URLs for the buttons are based two rather limiting assumptions: that the data model for the table uses a single-column primary key, and that the model belongs to the current controller. While you can override these URLs on an individual basis, for my current project it made sense to extend CButtonColumn instead:

<?php
/**
 * ButtonColumn class file.
 * ButtonColumn is a simple extension of CButtonColumn.
 * It correctly sets button URLs in the following cases:
 * * data has composite primary keys;
 * * data model does not belong to current controller.
 *
 * @author Jeff Soo
 */

class ButtonColumn extends CButtonColumn
{
	protected function initDefaultButtons()
	{	
		$modelClass=$this->grid->dataProvider->modelClass;
		$controller=strtolower($modelClass);

		if(is_array($modelClass::model()->primaryKey))
			$paramExpression='",$data->primaryKey)';
		else
			$paramExpression='",array("id"=>$data->primaryKey))';

		foreach(array('view','update','delete') as $id)
			$this->{$id.'ButtonUrl'}= 
			    'Yii::app()->urlManager->createUrl("'."$controller/$id$paramExpression";
		parent::initDefaultButtons();
	}
}

Posted 2010-03-16 (last modified 2017-02-18) under Yii Framework, PHP