Yii2实现增删改查后留在当前页的方法详解

前言

实现增删改查操作成功后仍留在当前页,能给用户一个良好的体验。但是 Yii2 框架本身是没有在增删改查操作成功后仍留在当前页的效果的,要实现这样的一个效果得自己写。我的原则是不动核心代码,始终坚持自己的原则,现实现了我把它分享出来。殊途同归,如有更好的实现方法,欢迎交流。

需求分析

一、实现增删改查后操作成功后仍然留在当前页面

1、链接效果

封装代码

共有两个文件ActionColumn.PHP和Helper.PHP1、ActionColumn.PHP文件

rush: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','Update'),],[
'url' => 'delete','icon' => 'trash-o','class' => 'btn btn-danger btn-xs','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,$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,$index)
{
if ($this->callbackButtons instanceof Closure) {
$btns = call_user_func($this->callbackButtons,$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'],$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 .= '

';
return $data;
}

}

2、Helper.PHP文件

rush: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、如直接调用不能满足你的要求可以自定义链接自定义链接的写法如下:

'common\components\ActionColumn','urlCreator' => function($action,$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',//是否保留当前URL,认为true 'url_append' => '',不传设置null ],[ 'url' => 'update','class' => 'btn btn-primary btn-xs btn-sm','appendReturnUrl' => true,[ 'url' => 'delete','class' => 'btn btn-danger btn-xs btn-sm',

3、新增的话,这么引用 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}'简单且看着舒服能根据需求去写了。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用
将字符重新排列以形成回文(如果可能)在C++中
掌握PHP8底层开发原理和新特性:创建高效可扩展的应用程序
服务器性能优化必学:掌握PHP8底层开发原理
PHP8新特性和底层开发原理详解:优化应用性能的终极指南
将 C/C++ 代码转换为汇编语言
深入研究PHP8底层开发原理:创建高效可扩展的应用程序
C++程序查找法向量和迹
PHP8底层开发原理实战指南:提升服务器效能
重排数组,使得当 i 为偶数时,arr[i] >= arr[j],当 i 为奇数时,arr[i] <= arr[j],其中 j < i,使用 C++ 语言实现
Golang的垃圾回收:为什么它可以减少开发人员的负担?
C++程序:将一个数组的所有元素复制到另一个数组中
Golang:构建智能系统的基石
为什么AI开发者应该关注Golang?
在C和C++中,逗号(comma)的用法是用来分隔表达式或语句
PHP8底层开发原理解析及新特性应用实例
利用PHP8底层开发原理解析新特性:如何构建出色的Web应用