From 1689a9ef9ab3f8008bae59676a435fee86b5e84a Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Thu, 26 Dec 2013 00:24:11 -0500 Subject: [PATCH] Changed the signature of `urlCreator` and button creators for `yii\gridview\ActionColumn` --- framework/CHANGELOG.md | 2 +- framework/yii/grid/ActionColumn.php | 59 ++++++++++++++++++++++++++++--------- 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 32e5fd4..e2a18ff 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -38,7 +38,7 @@ Yii Framework 2 Change Log - Chg: Renamed `ActiveRecord::getPopulatedRelations()` to `getRelatedRecords()` (qiangxue) - Chg: Renamed `attributeName` and `className` to `targetAttribute` and `targetClass` for `UniqueValidator` and `ExistValidator` (qiangxue) - Chg: Added `yii\widgets\InputWidget::options` (qiangxue) -- Chg: The signature for `yii\gridview\ActionColumn::urlCreator` is changed - the `$action` parameter is moved to the first (qiangxue) +- Chg: Changed the signature of `urlCreator` and button creators for `yii\gridview\ActionColumn` (qiangxue) - New #1438: [MongoDB integration](https://github.com/yiisoft/yii2-mongodb) ActiveRecord and Query (klimov-paul) - New #1393: [Codeception testing framework integration](https://github.com/yiisoft/yii2-codeception) (Ragazzo) diff --git a/framework/yii/grid/ActionColumn.php b/framework/yii/grid/ActionColumn.php index 9328439..e97f535 100644 --- a/framework/yii/grid/ActionColumn.php +++ b/framework/yii/grid/ActionColumn.php @@ -26,40 +26,68 @@ class ActionColumn extends Column * to each action name to form the route of the action. */ public $controller; + /** + * @var string the template used for composing each cell in the action column. + * Tokens enclosed within curly brackets are treated as controller action IDs (also called *button names* + * in the context of action column). They will be replaced by the corresponding button rendering callbacks + * specified in [[buttons]]. For example, the token `{view}` will be replaced by the result of + * the callback `buttons['view']`. If a callback cannot be found, the token will be replaced with an empty string. + * @see buttons + */ public $template = '{view} {update} {delete}'; + /** + * @var array button rendering callbacks. The array keys are the button names (without curly brackets), + * and the values are the corresponding button rendering callbacks. The callbacks should use the following + * signature: + * + * ```php + * function ($url, $model) { + * // return the button HTML code + * } + * ``` + * + * where `$url` is the URL that the column creates for the button, and `$model` is the model object + * being rendered for the current row. + */ public $buttons = []; + /** + * @var callback a callback that creates a button URL using the specified model information. + * The signature of the callback should be the same as that of [[createUrl()]]. + * If this property is not set, button URLs will be created using [[createUrl()]]. + */ public $urlCreator; + + /** + * @inheritdoc + */ public function init() { parent::init(); $this->initDefaultButtons(); } + /** + * Initializes the default button rendering callbacks + */ protected function initDefaultButtons() { if (!isset($this->buttons['view'])) { - $this->buttons['view'] = function ($model, $key, $index, $column) { - /** @var ActionColumn $column */ - $url = $column->createUrl('view', $model, $key, $index); + $this->buttons['view'] = function ($url, $model) { return Html::a('', $url, [ 'title' => Yii::t('yii', 'View'), ]); }; } if (!isset($this->buttons['update'])) { - $this->buttons['update'] = function ($model, $key, $index, $column) { - /** @var ActionColumn $column */ - $url = $column->createUrl('update', $model, $key, $index); + $this->buttons['update'] = function ($url, $model) { return Html::a('', $url, [ 'title' => Yii::t('yii', 'Update'), ]); }; } if (!isset($this->buttons['delete'])) { - $this->buttons['delete'] = function ($model, $key, $index, $column) { - /** @var ActionColumn $column */ - $url = $column->createUrl('delete', $model, $key, $index); + $this->buttons['delete'] = function ($url, $model) { return Html::a('', $url, [ 'title' => Yii::t('yii', 'Delete'), 'data-confirm' => Yii::t('yii', 'Are you sure to delete this item?'), @@ -70,11 +98,13 @@ class ActionColumn extends Column } /** - * @param string $action - * @param \yii\db\ActiveRecord $model + * Creates a URL for the given action and model. + * This method is called for each button and each row. + * @param string $action the button name (or action ID) + * @param \yii\db\ActiveRecord $model the data model * @param mixed $key the key associated with the data model - * @param integer $index - * @return string + * @param integer $index the current row index + * @return string the created URL */ public function createUrl($action, $model, $key, $index) { @@ -95,7 +125,8 @@ class ActionColumn extends Column return preg_replace_callback('/\\{(\w+)\\}/', function ($matches) use ($model, $key, $index) { $name = $matches[1]; if (isset($this->buttons[$name])) { - return call_user_func($this->buttons[$name], $model, $key, $index, $this); + $url = $this->createUrl($name, $model, $key, $index); + return call_user_func($this->buttons[$name], $url, $model); } else { return ''; }