最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Yii2實現(xiàn)增刪改查后留在當(dāng)前頁的方法詳解

 更新時間:2017年01月13日 09:37:13   作者:zacklee  
yii2.0框架是PHP開發(fā)的一個比較高效率的框架,集合了作者的大量心血,下面這篇文章主要介紹了Yii2如何實現(xiàn)增刪改查后仍留在當(dāng)前頁的方法,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

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

需求分析

一、實現(xiàn)增刪改查后操作成功后仍然留在當(dāng)前頁面。

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; //默認(rèn)為true,返回當(dāng)前鏈接

 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,不傳設(shè)置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;
 }
}

視圖調(diào)用

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

2、如直接調(diào)用不能滿足你的要求可以自定義鏈接,自定義鏈接的寫法如下:

[
 'class' => 'common\components\ActionColumn',
 'urlCreator' => function($action, $model, $key, $index) use ($id) {
 //自定義鏈接傳的參數(shù)
 $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,//是否保留當(dāng)前URL,默認(rèn)為true
   'url_append' => '',
   'keyParam' => 'id', //是否傳id,不傳設(shè)置null
   ],
   [
   'url' => 'update',
   'class' => 'btn btn-primary btn-xs btn-sm',
   'label' => Yii::t('yii', 'Update'),
   'appendReturnUrl' => true,//是否保留當(dāng)前URL,默認(rèn)為true
   'url_append' => '',
   'keyParam' => 'id', //是否傳id,不傳設(shè)置null
   ],
   [
   'url' => 'delete',
   'class' => 'btn btn-danger btn-xs btn-sm',
   'label' => Yii::t('yii', 'Delete'),
   'options' => [
   'data-action' => 'delete',
   ],
   'appendReturnUrl' => true,//是否保留當(dāng)前URL,默認(rèn)為true
   'url_append' => '',
   'keyParam' => 'id', //是否傳id,不傳設(shè)置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、跳轉(zhuǎn)到的URL:return $this->redirect($returnUrl); 。

分析總結(jié)

1、此方法的好處是不動核心代碼,調(diào)用方式保留了Yii2自帶的方式。

2、不足之處是在自定義鏈接的時候需要把每一個操作update、view、delete都寫出來,不能用這種'template' => '{view}{update}{delete}'簡單且看著舒服能根據(jù)需求去寫了。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • PHP 年月日的三級聯(lián)動實例代碼

    PHP 年月日的三級聯(lián)動實例代碼

    這篇文章主要介紹了PHP 年月日的三級聯(lián)動實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • yii通過小物件生成view的方法

    yii通過小物件生成view的方法

    這篇文章主要介紹了yii通過小物件生成view的方法,簡單列舉分析了Yii小物件的使用技巧,需要的朋友可以參考下
    2016-10-10
  • CentOS下與Apache連接的PHP多版本共存方案實現(xiàn)詳解

    CentOS下與Apache連接的PHP多版本共存方案實現(xiàn)詳解

    這篇文章主要介紹了CentOS下與Apache連接的PHP多版本共存方案實現(xiàn),針對mod_fcgi模塊的配置作了一些說明,需要的朋友可以參考下
    2015-12-12
  • CodeIgniter中使用cookie的三種方式詳解

    CodeIgniter中使用cookie的三種方式詳解

    這篇文章主要介紹了CodeIgniter中使用cookie的三種方式,非常簡潔實用,需要的朋友可以參考下
    2014-07-07
  • 一漂亮的PHP圖片驗證碼實例

    一漂亮的PHP圖片驗證碼實例

    在網(wǎng)上看到一個圖片驗證碼,挻漂亮的,但是取回來發(fā)現(xiàn),好像有點(diǎn)小問題,還是改為自己的口味吧,很多時候,如果無法使用,應(yīng)該是字體的問題。程序所用的字體win7 自帶的,需要上傳到web目錄
    2014-03-03
  • php框架CI(codeigniter)自動加載與自主創(chuàng)建對象操作實例分析

    php框架CI(codeigniter)自動加載與自主創(chuàng)建對象操作實例分析

    這篇文章主要介紹了php框架CI(codeigniter)自動加載與自主創(chuàng)建對象操作,結(jié)合實例形式分析了codeigniter框架自動加載與自主創(chuàng)建對象相關(guān)原理、實現(xiàn)方法與相關(guān)注意事項,需要的朋友可以參考下
    2020-06-06
  • laravel csrf排除路由,禁止,關(guān)閉指定路由的例子

    laravel csrf排除路由,禁止,關(guān)閉指定路由的例子

    今天小編就為大家分享一篇laravel csrf排除路由,禁止,關(guān)閉指定路由的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • laravel中短信發(fā)送驗證碼的實現(xiàn)方法

    laravel中短信發(fā)送驗證碼的實現(xiàn)方法

    在做用戶注冊和個人中心的安全管理時常常需要用到短信發(fā)送驗證碼,下面這篇文章主要給大家介紹了關(guān)于laravel中短信發(fā)送驗證碼的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • laravel 關(guān)聯(lián)關(guān)系遍歷數(shù)組的例子

    laravel 關(guān)聯(lián)關(guān)系遍歷數(shù)組的例子

    今天小編就為大家分享一篇laravel 關(guān)聯(lián)關(guān)系遍歷數(shù)組的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • php中引用符號(&)的使用詳細(xì)介紹

    php中引用符號(&)的使用詳細(xì)介紹

    php的引用就是在變量或者函數(shù)、對象等前面加上&符號,在PHP 中引用的意思是:不同的名字訪問同一個變量內(nèi)容,下面介紹如何使用PHP的引用,需要的朋友可以參考下
    2016-12-12

最新評論

来安县| 太和县| 治多县| 庄河市| 南汇区| 监利县| 汉寿县| 兴城市| 罗源县| 茌平县| 平利县| 藁城市| 灵宝市| 吉安县| 上杭县| 惠州市| 宁安市| 南宁市| 兴隆县| 专栏| 平原县| 集安市| 襄城县| 牙克石市| 姚安县| 古浪县| 鹤庆县| 庆安县| 北海市| 庄浪县| 双城市| 平武县| 莒南县| 张掖市| 崇礼县| 沈阳市| 拉萨市| 旬阳县| 榕江县| 湟源县| 临夏县|