Yii2 增删改查后仍留在当前页的方法

序言

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

需求分析

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

效果图

1、链接的效果图

封装代码

共有两个文件ActionColumn.php和Helper.php
1、ActionColumn.php文件

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 .= '';          return $data;    }}

2、Helper.php文件

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' => 'yii\grid\ActionColumn']换成我们新写的['class' => 'common\components\ActionColumn']。
2、如直接调用不能满足你的要求可以自定义链接,自定义链接的写法如下:

 'buttons' => [        [         'url' => 'update',         'icon' => 'eye',         'class' => 'btn btn-primary btn-xs',         'label' => Yii::t('app', 'Preview'),          'appendReturnUrl' => false,//是否保留当前URL,默认为true         'url_append' => '',         'keyParam' => 'id', //是否传id,不传设置null       ] ],

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}'简单且看着舒服能根据需求去写了。
~本文完。

关键字:php, node.js, #c++# css

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部