首頁  >  文章  >  後端開發  >  Yii2實現增刪改查後留在當頁的方法詳解

Yii2實現增刪改查後留在當頁的方法詳解

韦小宝
韦小宝原創
2017-11-28 09:20:371755瀏覽

實現增刪改查操作成功後仍留在目前頁,能給使用者一個好的體驗。但是 Yii2 框架本身是沒有在增刪改查操作成功後仍留在當前頁的效果的,要實現這樣的一個效果得自己寫。我的原則是不動核心程式碼,始終堅持自己的原則,現實現了我把它分享出來。殊途同歸,如有更好的實現增刪改查的方法,歡迎交流。

封裝程式碼

有兩個檔案ActionColumn.php和Helper.php

1 、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 = &#39;&#39;;

 public $appendReturnUrl = true; //默认为true,返回当前链接

 public function init()
 {
 parent::init();
 
 $this->defaultButtons = [
  [
  &#39;url&#39; => &#39;view&#39;,
  &#39;icon&#39; => &#39;eye&#39;,
  &#39;class&#39; => &#39;btn btn-success btn-xs&#39;,
  &#39;label&#39; => Yii::t(&#39;yii&#39;, &#39;View&#39;),
  &#39;appendReturnUrl&#39; => false,
  &#39;url_append&#39; => &#39;&#39;,
  &#39;keyParam&#39; => &#39;id&#39;,//是否传id,不传设置null
  ],
  [
  &#39;url&#39; => &#39;update&#39;,
  &#39;icon&#39; => &#39;pencil&#39;,
  &#39;class&#39; => &#39;btn btn-primary btn-xs&#39;,
  &#39;label&#39; => Yii::t(&#39;yii&#39;, &#39;Update&#39;),
  ],
  [
  &#39;url&#39; => &#39;delete&#39;,
  &#39;icon&#39; => &#39;trash-o&#39;,
  &#39;class&#39; => &#39;btn btn-danger btn-xs&#39;,
  &#39;label&#39; => Yii::t(&#39;yii&#39;, &#39;Delete&#39;),
  &#39;options&#39; => [
   &#39;data-action&#39; => &#39;delete&#39;,
  ],
  ]
 ];


 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 = &#39;id&#39;,
 $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 . &#39;/&#39; . $action : $action;
  foreach ($attrs as $attrName) {
  if ($attrName === &#39;model&#39;) {
   $params[&#39;model&#39;] = $model;
  } elseif ($attrName === &#39;mainCategory.category_group_id&#39; && $model->getMainCategory()) {
   $params[&#39;category_group_id&#39;] = $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[&#39;returnUrl&#39;] = 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(&#39;div&#39;, [&#39;class&#39; => &#39;btn-group&#39;, &#39;style&#39; => &#39;min-width: &#39; . $min_width . &#39;px&#39;]);
 foreach ($this->buttons as $button) {
  $appendReturnUrl = ArrayHelper::getValue($button, &#39;appendReturnUrl&#39;, $this->appendReturnUrl);
  $url_append = ArrayHelper::getValue($button, &#39;url_append&#39;, $this->url_append);
  $keyParam = ArrayHelper::getValue($button, &#39;keyParam&#39;, &#39;id&#39;);
  $attrs = ArrayHelper::getValue($button, &#39;attrs&#39;, []);
  Html::addCssClass($button, &#39;btn&#39;);
  Html::addCssClass($button, &#39;btn-sm&#39;);
  $buttonText = isset($button[&#39;text&#39;]) ? &#39; &#39; . $button[&#39;text&#39;] : &#39;&#39;; 
  $data .= Html::a(
   $button[&#39;label&#39;] . $buttonText,
   $url = $this->createUrl(
   $button[&#39;url&#39;],
   $model,
   $key,
   $index,
   $appendReturnUrl,
   $url_append,
   $keyParam,
   $attrs
   ),
   ArrayHelper::merge(
   isset($button[&#39;options&#39;]) ? $button[&#39;options&#39;] : [],
   [
    //&#39;data-pjax&#39; => 0,
    // &#39;data-action&#39; => $button[&#39;url&#39;],
    &#39;class&#39; => $button[&#39;class&#39;],
    &#39;title&#39; => $button[&#39;label&#39;],
   ]
   )
  ) . &#39; &#39;;
 }
 $data .= &#39;</div>&#39;; 
 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[&#39;query&#39;])) {
  $parts = explode(&#39;&&#39;, $url[&#39;query&#39;]);
  foreach ($parts as $part) {
   $pieces = explode(&#39;=&#39;, $part);
   if (static::$returnUrlWithoutHistory && count($pieces) == 2 && $pieces[0] === &#39;returnUrl&#39;) {
   continue;
   }
   if (count($pieces) == 2 && strlen($pieces[1]) > 0) {
   $returnUrlParams[] = $part;
   }
  }
  }
  if (count($returnUrlParams) > 0) {
  self::$returnUrl = $url[&#39;path&#39;] . &#39;?&#39; . implode(&#39;&&#39;, $returnUrlParams);
  } else {
  self::$returnUrl = $url[&#39;path&#39;];
  }
 }
 return self::$returnUrl;
 }
}

檢視呼叫






1、直接調用,Yii2自帶的['class' => 'yiigridActionColumn']換成我們新寫的['class' => 'common\components\ActionColumn'] 。

2、如直接調用不能滿足你的要求可以自​​訂鏈接,自訂鏈接的寫法如下:

[
 &#39;class&#39; => &#39;common\components\ActionColumn&#39;,
 &#39;urlCreator&#39; => function($action, $model, $key, $index) use ($id) {
 //自定义链接传的参数
 $params = [
  $action,
  &#39;option_id&#39; => $model->option_id, 
  &#39;id&#39; => $id,
 ];
 $params[&#39;returnUrl&#39;] = common\components\Helper::getReturnUrl();
 return yii\helpers\Url::toRoute($params);
 },
 &#39;buttons&#39; => [
   [
   &#39;url&#39; =>&#39;view&#39;,
   &#39;class&#39; => &#39;btn btn-success btn-xs&#39;,
   &#39;label&#39; => Yii::t(&#39;yii&#39;, &#39;View&#39;),
   &#39;appendReturnUrl&#39; => false,//是否保留当前URL,默认为true
   &#39;url_append&#39; => &#39;&#39;,
   &#39;keyParam&#39; => &#39;id&#39;, //是否传id,不传设置null
   ],
   [
   &#39;url&#39; => &#39;update&#39;,
   &#39;class&#39; => &#39;btn btn-primary btn-xs btn-sm&#39;,
   &#39;label&#39; => Yii::t(&#39;yii&#39;, &#39;Update&#39;),
   &#39;appendReturnUrl&#39; => true,//是否保留当前URL,默认为true
   &#39;url_append&#39; => &#39;&#39;,
   &#39;keyParam&#39; => &#39;id&#39;, //是否传id,不传设置null
   ],
   [
   &#39;url&#39; => &#39;delete&#39;,
   &#39;class&#39; => &#39;btn btn-danger btn-xs btn-sm&#39;,
   &#39;label&#39; => Yii::t(&#39;yii&#39;, &#39;Delete&#39;),
   &#39;options&#39; => [
   &#39;data-action&#39; => &#39;delete&#39;,
   ],
   &#39;appendReturnUrl&#39; => true,//是否保留当前URL,默认为true
   &#39;url_append&#39; => &#39;&#39;,
   &#39;keyParam&#39; => &#39;id&#39;, //是否传id,不传设置null
   ],
 ],

],

3、新增的話,這麼引用:

<?= Html::a(Yii::t(&#39;yii&#39;, &#39;Create&#39;), [&#39;create&#39;,&#39;returnUrl&#39; => Helper::getReturnUrl()], [&#39;class&#39; => &#39;btn btn-success&#39;]) ?> 。

控制器邏輯

#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實現增刪改查後留在當前頁的方法詳解所有的內容,歡迎在PHP中文網社區

討論和交流問題! ############相關推薦:###################Yii2中關於元件的註冊以及建立的方法詳解###### #########Yii2如何使用駝峰命名的形式來存取控制器的實例#############Yii2.0框架產生二維碼函數的實作代碼#### ########Yii2框架自動登入以及登入登出功能的實作方法######

以上是Yii2實現增刪改查後留在當頁的方法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn