Yii 2 추가 삭제 및 검 사 를 실현 한 후 현재 페이지 에 남 는 방법 에 대한 상세 한 설명

10035 단어 yii2첨삭 하 다.
머리말
첨삭 과 수정 작업 이 성공 한 후에 도 현재 페이지 에 남아 사용자 에 게 좋 은 체험 을 할 수 있 습 니 다.그러나 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}'간단 하고 보기 편 하 며 수요 에 따라 쓸 수 없습니다.
자,이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기