Yii2實(shí)現(xiàn)增刪改查后留在當(dāng)前頁(yè)的方法詳解
前言
實(shí)現(xiàn)增刪改查操作成功后仍留在當(dāng)前頁(yè),能給用戶一個(gè)良好的體驗(yàn)。但是 Yii2 框架本身是沒(méi)有在增刪改查操作成功后仍留在當(dāng)前頁(yè)的效果的,要實(shí)現(xiàn)這樣的一個(gè)效果得自己寫。我的原則是不動(dòng)核心代碼,始終堅(jiān)持自己的原則,現(xiàn)實(shí)現(xiàn)了我把它分享出來(lái)。殊途同歸,如有更好的實(shí)現(xiàn)方法,歡迎交流。
需求分析
一、實(shí)現(xiàn)增刪改查后操作成功后仍然留在當(dāng)前頁(yè)面。
1、鏈接的效果圖
封裝代碼
共有兩個(gè)文件ActionColumn.php和Helper.php1、ActionColumn.php文件
<?php use Closure; use kartik\icons\Icon; use Yii; use yii\grid\Column; use yii\helpers\ArrayHelper; use yii\helpers\Html; use yii\helpers\Url; use common\components\Helper; /* *重寫ActionColumn */ class ActionColumn extends Column { public $buttons; private $defaultButtons = []; private $callbackButtons; public $controller; public $urlCreator; public $url_append = ''; public $appendReturnUrl = true; //默認(rèn)為true,返回當(dāng)前鏈接 public function init() { parent::init(); $this->defaultButtons = [ [ 'url' => 'view', 'icon' => 'eye', 'class' => 'btn btn-success btn-xs', 'label' => Yii::t('yii', 'View'), 'appendReturnUrl' => false, 'url_append' => '', 'keyParam' => 'id',//是否傳id,不傳設(shè)置null ], [ 'url' => 'update', 'icon' => 'pencil', 'class' => 'btn btn-primary btn-xs', 'label' => Yii::t('yii', 'Update'), ], [ 'url' => 'delete', 'icon' => 'trash-o', 'class' => 'btn btn-danger btn-xs', 'label' => Yii::t('yii', 'Delete'), 'options' => [ 'data-action' => 'delete', ], ] ]; if (null === $this->buttons) { $this->buttons = $this->defaultButtons; } elseif ($this->buttons instanceof Closure) { $this->callbackButtons = $this->buttons; } } public function createUrl( $action, $model, $key, $index, $appendReturnUrl = null, $url_append = null, $keyParam = 'id', $attrs = [] ) { if ($this->urlCreator instanceof Closure) { return call_user_func($this->urlCreator, $action, $model, $key, $index); } else { $params = []; if (is_array($key)) { $params = $key; } else { if (is_null($keyParam) === false) { $params = [$keyParam => (string)$key]; } } $params[0] = $this->controller ? $this->controller . '/' . $action : $action; foreach ($attrs as $attrName) { if ($attrName === 'model') { $params['model'] = $model; } elseif ($attrName === 'mainCategory.category_group_id' && $model->getMainCategory()) { $params['category_group_id'] = $model->getMainCategory()->category_group_id; } else { $params[$attrName] = $model->getAttribute($attrName); } } if (is_null($appendReturnUrl) === true) { $appendReturnUrl = $this->appendReturnUrl; } if (is_null($url_append) === true) { $url_append = $this->url_append; } if ($appendReturnUrl) { $params['returnUrl'] = Helper::getReturnUrl(); } return Url::toRoute($params) . $url_append; } } protected function renderDataCellContent($model, $key, $index) { if ($this->callbackButtons instanceof Closure) { $btns = call_user_func($this->callbackButtons, $model, $key, $index, $this); if (null === $btns) { $this->buttons = $this->defaultButtons; } else { $this->buttons = $btns; } } $min_width = count($this->buttons) * 34; //34 is button-width $data = Html::beginTag('div', ['class' => 'btn-group', 'style' => 'min-width: ' . $min_width . 'px']); foreach ($this->buttons as $button) { $appendReturnUrl = ArrayHelper::getValue($button, 'appendReturnUrl', $this->appendReturnUrl); $url_append = ArrayHelper::getValue($button, 'url_append', $this->url_append); $keyParam = ArrayHelper::getValue($button, 'keyParam', 'id'); $attrs = ArrayHelper::getValue($button, 'attrs', []); Html::addCssClass($button, 'btn'); Html::addCssClass($button, 'btn-sm'); $buttonText = isset($button['text']) ? ' ' . $button['text'] : ''; $data .= Html::a( $button['label'] . $buttonText, $url = $this->createUrl( $button['url'], $model, $key, $index, $appendReturnUrl, $url_append, $keyParam, $attrs ), ArrayHelper::merge( isset($button['options']) ? $button['options'] : [], [ //'data-pjax' => 0, // 'data-action' => $button['url'], 'class' => $button['class'], 'title' => $button['label'], ] ) ) . ' '; } $data .= '</div>'; return $data; } }
2、Helper.php文件
<?php use Yii; class Helper { private static $returnUrl; public static $returnUrlWithoutHistory = false; /** * @param int $depth * @return string */ public static function getReturnUrl() { if (is_null(self::$returnUrl)) { $url = parse_url(Yii::$app->request->url); $returnUrlParams = []; if (isset($url['query'])) { $parts = explode('&', $url['query']); foreach ($parts as $part) { $pieces = explode('=', $part); if (static::$returnUrlWithoutHistory && count($pieces) == 2 && $pieces[0] === 'returnUrl') { continue; } if (count($pieces) == 2 && strlen($pieces[1]) > 0) { $returnUrlParams[] = $part; } } } if (count($returnUrlParams) > 0) { self::$returnUrl = $url['path'] . '?' . implode('&', $returnUrlParams); } else { self::$returnUrl = $url['path']; } } return self::$returnUrl; } }
視圖調(diào)用
1、直接調(diào)用,把Yii2自帶的['class' => 'yiigridActionColumn']
換成我們新寫的['class' => 'common\components\ActionColumn']
。
2、如直接調(diào)用不能滿足你的要求可以自定義鏈接,自定義鏈接的寫法如下:
[ 'class' => 'common\components\ActionColumn', 'urlCreator' => function($action, $model, $key, $index) use ($id) { //自定義鏈接傳的參數(shù) $params = [ $action, 'option_id' => $model->option_id, 'id' => $id, ]; $params['returnUrl'] = common\components\Helper::getReturnUrl(); return yii\helpers\Url::toRoute($params); }, 'buttons' => [ [ 'url' =>'view', 'class' => 'btn btn-success btn-xs', 'label' => Yii::t('yii', 'View'), 'appendReturnUrl' => false,//是否保留當(dāng)前URL,默認(rèn)為true 'url_append' => '', 'keyParam' => 'id', //是否傳id,不傳設(shè)置null ], [ 'url' => 'update', 'class' => 'btn btn-primary btn-xs btn-sm', 'label' => Yii::t('yii', 'Update'), 'appendReturnUrl' => true,//是否保留當(dāng)前URL,默認(rèn)為true 'url_append' => '', 'keyParam' => 'id', //是否傳id,不傳設(shè)置null ], [ 'url' => 'delete', 'class' => 'btn btn-danger btn-xs btn-sm', 'label' => Yii::t('yii', 'Delete'), 'options' => [ 'data-action' => 'delete', ], 'appendReturnUrl' => true,//是否保留當(dāng)前URL,默認(rèn)為true 'url_append' => '', 'keyParam' => 'id', //是否傳id,不傳設(shè)置null ], ], ],
3、新增的話,這么引用<?= Html::a(Yii::t('yii', 'Create'), ['create','returnUrl' => Helper::getReturnUrl()], ['class' => 'btn btn-success']) ?>
。
控制器邏輯
1、用get獲取returnUrl,代碼:$returnUrl = Yii::$app->request->get('returnUrl');
。
2、跳轉(zhuǎn)到的URL:return $this->redirect($returnUrl);
。
分析總結(jié)
1、此方法的好處是不動(dòng)核心代碼,調(diào)用方式保留了Yii2自帶的方式。
2、不足之處是在自定義鏈接的時(shí)候需要把每一個(gè)操作update、view、delete都寫出來(lái),不能用這種'template' => '{view}{update}{delete}
'簡(jiǎn)單且看著舒服能根據(jù)需求去寫了。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
- Yii2中設(shè)置與獲取別名的函數(shù)(setAlias和getAlias)用法分析
- Yii使用smsto短信接口的函數(shù)demo示例
- yii2高級(jí)應(yīng)用之自定義組件實(shí)現(xiàn)全局使用圖片上傳功能的方法
- Yii2-GridView 中讓關(guān)聯(lián)字段帶搜索和排序功能示例
- Yii CDBCriteria常用方法實(shí)例小結(jié)
- yii使用bootstrap分頁(yè)樣式的實(shí)例
- YII2 實(shí)現(xiàn)多語(yǔ)言配置的方法分享
- Yii入門教程之目錄結(jié)構(gòu)、入口文件及路由設(shè)置
- yii的CURD操作實(shí)例詳解
- 解析yii數(shù)據(jù)庫(kù)的增刪查改
- Yii操作數(shù)據(jù)庫(kù)的3種方法
- Yii全局函數(shù)用法示例
相關(guān)文章
PHP在彈框中獲取foreach中遍歷的id值并傳遞給地址欄
這篇文章主要介紹了PHP在彈框中獲取foreach中遍歷的id值并傳遞給地址欄的相關(guān)資料,需要的朋友可以參考下2017-06-06為PHP模塊添加SQL SERVER2012數(shù)據(jù)庫(kù)的步驟詳解
這篇文章主要介紹了為PHP模塊添加SQL SERVER2012數(shù)據(jù)庫(kù),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04PHP代碼實(shí)現(xiàn)表單數(shù)據(jù)驗(yàn)證類
這篇文章主要介紹了PHP代碼實(shí)現(xiàn)表單數(shù)據(jù)驗(yàn)證類,需要的朋友可以參考下2015-07-07PHP在網(wǎng)頁(yè)中動(dòng)態(tài)生成PDF文件詳細(xì)教程
這篇文章主要介紹了PHP在網(wǎng)頁(yè)中動(dòng)態(tài)生成PDF文件詳細(xì)教程,本文用一個(gè)需求為引,詳細(xì)介紹每一步驟的做法,并配有大量圖片說(shuō)明,需要的朋友可以參考下2014-07-07PHP中將網(wǎng)頁(yè)導(dǎo)出為Word文檔的代碼
今天要探討的是PHP網(wǎng)頁(yè)導(dǎo)出Word文檔的方法,使用其他語(yǔ)言的朋友也可以參考,因?yàn)樵硎遣畈欢嗟?/div> 2012-05-05最新評(píng)論