Yii 2 추가 삭제 및 검 사 를 실현 한 후 현재 페이지 에 남 는 방법 에 대한 상세 한 설명
첨삭 과 수정 작업 이 성공 한 후에 도 현재 페이지 에 남아 사용자 에 게 좋 은 체험 을 할 수 있 습 니 다.그러나 Yii 2 프레임 워 크 자 체 는 추가 삭제 및 검사 작업 이 성공 한 후에 도 현재 페이지 에 남아 있 는 효과 가 없습니다.이러한 효 과 를 실현 하려 면 스스로 써 야 합 니 다.나의 원칙 은 핵심 코드 를 움 직 이지 않 고 자신의 원칙 을 지 키 는 것 이다.지금 은 내 가 그것 을 공유 하 는 것 을 실현 했다.다른 길 로 돌아 가 더 좋 은 실현 방법 이 있다 면 교 류 를 환영 합 니 다.
수요 분석
1.첨삭 검 사 를 실현 한 후에 작업 이 성공 한 후에 도 현재 페이지 에 남아 있 습 니 다.
1.링크 의 효과 그림
패키지 코드
모두 두 개의 파일 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.직접 호출 하여 Yii 2 가 가지 고 있 는
['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.새로 추 가 된 말 은 이렇게 인용 합 니 다<?= Html::a(Yii::t('yii', 'Create'), ['create','returnUrl' => Helper::getReturnUrl()], ['class' => 'btn btn-success']) ?>
.컨트롤 러 논리
1.get 으로 returnUrl,코드:
$returnUrl = Yii::$app->request->get('returnUrl');
를 가 져 옵 니 다.2.이동 한 URL 입 니 다.:
return $this->redirect($returnUrl);
분석 총화1.이 방법의 장점 은 핵심 코드 를 움 직 이지 않 고 호출 방식 은 Yii 2 자체 의 방식 을 보류 하 는 것 이다.
2.부족 한 점 은 링크 를 사용자 정의 할 때 모든 조작 update,view,delete 를 적어 야 한 다 는 것 입 니 다.이런
'template' => '{view}{update}{delete}
'간단 하고 보기 편 하 며 수요 에 따라 쓸 수 없습니다.자,이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Yii2 페이지에 Schema.org 마크업을 추가하는 방법.은 검색 엔진 및 기타 애플리케이션에서 사용하기 위해 웹 페이지에 구조화된 데이터를 포함할 수 있는 마크업 시스템입니다. JSON-LD를 사용하여 Yii2 기반 웹사이트의 페이지에 Schema.org를 추가하는 방법...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.