前言

实现增删改查操作成功后仍留在当前页,能给用户一个良好的体验。但是 Yii2 框架本身是没有在增删改查操作成功后仍留在当前页的效果的,要实现这样的一个效果得自己写。我的原则是不动核心代码,始终坚持自己的原则,现实现了我把它分享出来。殊途同归,如有更好的实现方法,欢迎交流。
需求分析
一、实现增删改查后操作成功后仍然留在当前页面。
1、链接的效果图
封装代码
共有两个文件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; //默认为true,返回当前链接
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,不传设置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;
}
}
视图调用
1、直接调用,把Yii2自带的['class' => 'yiigridActionColumn']换成我们新写的['class' => 'common\components\ActionColumn'] 。
2、如直接调用不能满足你的要求可以自定义链接,自定义链接的写法如下:
[
'class' => 'common\components\ActionColumn',
'urlCreator' => function($action, $model, $key, $index) use ($id) {
//自定义链接传的参数
$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,//是否保留当前URL,默认为true
'url_append' => '',
'keyParam' => 'id', //是否传id,不传设置null
],
[
'url' => 'update',
'class' => 'btn btn-primary btn-xs btn-sm',
'label' => Yii::t('yii', 'Update'),
'appendReturnUrl' => true,//是否保留当前URL,默认为true
'url_append' => '',
'keyParam' => 'id', //是否传id,不传设置null
],
[
'url' => 'delete',
'class' => 'btn btn-danger btn-xs btn-sm',
'label' => Yii::t('yii', 'Delete'),
'options' => [
'data-action' => 'delete',
],
'appendReturnUrl' => true,//是否保留当前URL,默认为true
'url_append' => '',
'keyParam' => 'id', //是否传id,不传设置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、跳转到的URL:return $this->redirect($returnUrl); 。
分析总结
1、此方法的好处是不动核心代码,调用方式保留了Yii2自带的方式。
2、不足之处是在自定义链接的时候需要把每一个操作update、view、delete都写出来,不能用这种'template' => '{view}{update}{delete}'简单且看着舒服能根据需求去写了。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
# yii2增删改查
# yii2的增删改查
# yii的增删改查
# Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
# Yii使用smsto短信接口的函数demo示例
# yii2高级应用之自定义组件实现全局使用图片上传功能的方法
# Yii2-GridView 中让关联字段带搜索和排序功能示例
# Yii CDBCriteria常用方法实例小结
# yii使用bootstrap分页样式的实例
# YII2 实现多语言配置的方法分享
# Yii入门教程之目录结构、入口文件及路由设置
# yii的CURD操作实例详解
# 解析yii数据库的增删查改
# Yii操作数据库的3种方法
# Yii全局函数用法示例
# 默认为
# 不传
# 自定义链接
# 不动
# 自带
# 自己的
# 后仍
# 看着
# 直接调用
# 是在
# 好了
# 如有
# 则是
# 当前页
# 殊途同归
# 把它
# 写了
# 重写
# 这篇文章
# 能给
相关文章:
网站制作公司排行榜,四大门户网站排名?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何通过网站建站时间优化SEO与用户体验?
南京网站制作费用,南京远驱官方网站?
建站主机类型有哪些?如何正确选型
如何快速生成橙子建站落地页链接?
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何通过FTP服务器快速搭建网站?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
如何配置FTP站点权限与安全设置?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
宿州网站制作公司兴策,安徽省低保查询网站?
如何用免费手机建站系统零基础打造专业网站?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
如何通过虚拟主机快速完成网站搭建?
c# await 一个已经完成的Task会发生什么
宁波免费建站如何选择可靠模板与平台?
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
建站之星各版本价格是多少?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
如何快速重置建站主机并恢复默认配置?
C++时间戳转换成日期时间的步骤和示例代码
如何在香港免费服务器上快速搭建网站?
如何在云主机快速搭建网站站点?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
建站之星后台密码遗忘?如何快速找回?
如何设计高效校园网站?
如何在阿里云部署织梦网站?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
大同网页,大同瑞慈医院官网?
三星网站视频制作教程下载,三星w23网页如何全屏?
简历在线制作网站免费,免费下载个人简历的网站是哪些?
成都网站制作报价公司,成都工业用气开户费用?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
个人摄影网站制作流程,摄影爱好者都去什么网站?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
如何确保FTP站点访问权限与数据传输安全?
制作旅游网站html,怎样注册旅游网站?
建站之星备案流程有哪些注意事项?
常州企业建站如何选择最佳模板?
如何在阿里云服务器自主搭建网站?
建站之星云端配置指南:模板选择与SEO优化一键生成
已有域名如何免费搭建网站?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
北京制作网站的公司,北京铁路集团官方网站?
微信小程序 五星评分(包括半颗星评分)实例代码
建站主机助手选型指南:2025年热门推荐与高效部署技巧
*请认真填写需求信息,我们会在24小时内与您取得联系。