追加、削除、変更、確認は操作が成功した後も現在のページに残るため、ユーザーに優れたエクスペリエンスを提供できます。ただし、Yii2 フレームワーク自体には、add、delete、modify、check 操作が成功した後に現在のページに残る効果はありません。そのような効果を実現するには、自分で記述する必要があります。私の原則は、コアコードを放置せず、常に自分自身の原則に固執することです。それを達成したので、共有します。異なるパスでも同じ目標に到達できます。追加、削除、変更、確認を実装するためのより良い方法がある場合は、お気軽にご連絡ください。コードのパッキング
actioncolumn.phpとhelper.php
1、actioncolumn.phpfile
rreee
2、helper.phpfilerreee
viewコールが2つあります。1. これを直接呼び出して、Yii2 に付属の ['class' => 'yiigridActionColumn'] を新しく作成した ['class' => 'commoncomponentsActionColumn'] に置き換えます。
2. 直接呼び出しが要件を満たさない場合は、カスタム リンクを次のように記述できます: <?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;
}
}
Logic
1. get を使用して returnUrl を取得します (コード: $returnUrl = Yii::$app->request->get('returnUrl'); )。
2. URL にジャンプします: return $this->redirect($returnUrl);分析の概要1. このメソッドの利点は、コアコードが移動されず、呼び出しメソッドが Yii2 組み込みメソッドを保持することです。
2. 欠点は、リンクをカスタマイズするときに、更新、表示、削除の各操作を書き出す必要があることです。この「テンプレート」 => '{view}{update}{delete}' は使用できません。見やすくて快適なので、ニーズに合わせて書くことができます。
それでは、この記事の内容が皆さんの学習や仕事に少しでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。
PHP 中国語コミュニティ
で問題について議論したり交換したりすることを歓迎します。関連する推奨事項:yii2のコンポーネントの登録と作成方法の説明extailed yii2がキャメルケースネーミングを使用してコントローラーインスタンスにアクセスする方法yii2.0フレームワーク実装コードQRコード生成機能
以上がYii2で追加・削除・修正・確認後に現在のページに留まる方法を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。