找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2072|回复: 0
打印 上一主题 下一主题

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

[复制链接]

2588

主题

2588

帖子

7694

积分

论坛元老

Rank: 8Rank: 8

积分
7694
跳转到指定楼层
楼主
发表于 2018-2-14 05:28:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

封装代码
共有两个文件ActionColumn.php和Helper.php1、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' => '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、新增的话,这么引用 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}'简单且看着舒服能根据需求去写了。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
            
            
您可能感兴趣的文章:
  • 解析yii数据库的增删查改
  • Yii操作数据库的3种方法
  • Yii入门教程之目录结构、入口文件及路由设置
  • yii的CURD操作实例详解
  • Yii使用smsto短信接口的函数demo示例
  • Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
  • yii2高级应用之自定义组件实现全局使用图片上传功能的方法
  • YII2 实现多语言配置的方法分享
  • yii使用bootstrap分页样式的实例
  • Yii CDBCriteria常用方法实例小结
  • Yii2-GridView 中让关联字段带搜索和排序功能示例
  • Yii全局函数用法示例
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端