실현 추가, 삭제, 수정 및 확인은 작업이 성공한 후에도 현재 페이지에 남아 있어 사용자에게 좋은 경험을 제공할 수 있습니다. 그러나 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 = ''; 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; } }
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; } }
보기 전화
1. 직접 호출하고 Yii2와 함께 제공되는 ['class' => 'yiigridActionColumn']을 새로 작성된 ['class' => 'commoncomComponentsActionColumn']으로 바꿉니다.
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 새 링크를 추가하는 경우 다음과 같이 인용하세요.
<?= Html::a(Yii::t('yii', 'Create'), ['create','returnUrl' => Helper::getReturnUrl()], ['class' => 'btn btn-success']) ?> 。
ControllerLogic
1. returnUrl을 얻으려면 get을 사용하세요. 코드: $returnUrl = Yii::$app->request->get('returnUrl');
2. URL로 이동: return $this->redirect($returnUrl);
분석 요약
1. 이 방법의 장점은 핵심 코드가 이동되지 않고 호출 메서드가 Yii2 내장 메서드를 유지한다는 것입니다.
2. 링크를 커스터마이징할 때 각 작업 업데이트, 보기, 삭제를 작성해야 한다는 단점이 있습니다. 이 '템플릿' => '{view}{update}{delete}'을 사용할 수 없습니다. 간단합니다. 보기에도 편해서 필요에 따라 쓸 수 있어요.
그렇습니다. 이 글의 내용이 모든 사람의 공부나 업무에 도움이 되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨주세요.
Yii2에서 추가, 삭제, 수정, 확인 후 현재 페이지에 머무르는 방법에 대한 자세한 설명은 PHP 중국어 커뮤니티에서 토론하고 질문을 교환하는 것을 환영합니다!
관련 권장 사항:
Yii2의 구성 요소 등록 및 생성 방법에 대한 자세한 설명
Yii2가 컨트롤러 인스턴스에 액세스하기 위해 낙타 표기법을 사용하는 방법
Yii2.0 프레임워크 구현 코드 QR 코드 기능 생성을 위한
Yii2 프레임워크의 자동 로그인 및 로그인 및 종료 기능 구현 방법
위 내용은 Yii2에서 추가, 삭제, 수정, 확인 후 현재 페이지에 머무르는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!