《PHP編程:Yii2實現增刪改查后留在當前頁的方法詳解》要點:
本文介紹了PHP編程:Yii2實現增刪改查后留在當前頁的方法詳解,希望對您有用。如果有疑問,可以聯系我們。
相關主題:YII框架
PHP編程前言
PHP編程實現增刪改查操作成功后仍留在當前頁,能給用戶一個良好的體驗.但是 Yii2 框架本身是沒有在增刪改查操作成功后仍留在當前頁的效果的,要實現這樣的一個效果得自己寫.我的原則是不動核心代碼,始終堅持自己的原則,現實現了我把它分享出來.殊途同歸,如有更好的實現方法,歡迎交流.
PHP編程需求分析
PHP編程一、實現增刪改查后操作成功后仍然留在當前頁面.
PHP編程1、鏈接的效果圖
PHP編程
PHP編程封裝代碼
PHP編程共有兩個文件ActionColumn.php和Helper.php1、ActionColumn.php文件
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; //默認為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',
'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;
}
}
PHP編程2、Helper.php文件
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;
}
}
PHP編程視圖調用
PHP編程1、直接調用,把Yii2自帶的['class' => 'yiigridActionColumn']
換成我們新寫的['class' => 'common\components\ActionColumn']
.
PHP編程2、如直接調用不能滿足你的要求可以自定義鏈接,自定義鏈接的寫法如下:
PHP編程
[
'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
],
],
],
PHP編程3、新增的話,這么引用<?= Html::a(Yii::t('yii', 'Create'), ['create','returnUrl' => Helper::getReturnUrl()], ['class' => 'btn btn-success']) ?>
.
PHP編程控制器邏輯
PHP編程1、用get獲取returnUrl,代碼:$returnUrl = Yii::$app->request->get('returnUrl');
.
PHP編程2、跳轉到的URL:return $this->redirect($returnUrl);
.
PHP編程分析總結
PHP編程1、此方法的好處是不動核心代碼,調用方式保留了Yii2自帶的方式.
PHP編程2、不足之處是在自定義鏈接的時候需要把每一個操作update、view、delete都寫出來,不能用這種'template' => '{view}{update}{delete}
'簡單且看著舒服能根據需求去寫了.
PHP編程好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流.
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/1996.html