Как скрыть {delete} в gridview для пользователя с id==1

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Как скрыть {delete} в gridview для пользователя с id==1

Сообщение svil »

Не могу настроить template - как скрыть возможность удаления пользователя с id=1 username='admin', остальных можно удалить

Код: Выделить всё

       <?= GridView::widget([
                    'dataProvider' => $dataProvider,
                    'columns' => [

                        'id',
                        'username',
                        'password',
                        'auth_key',

                        ['class' => 'yii\grid\ActionColumn','template' => '{view} {update} {delete}'],
                    ],
                ]); ?>
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Как скрыть {delete} в gridview для пользователя с id==1

Сообщение someweb »

https://www.yiiframework.com/doc/api/2. ... ons-detail

Код: Выделить всё

[
    'delete' => function ($url, $model, $key) {
        return $model->id !== 1 ? Html::a('Delete', $url) : '';
    },
],
Не забудьте в actionDelete проверить.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Аватара пользователя
Diplodok
Сообщения: 76
Зарегистрирован: 2012.07.09, 15:55
Контактная информация:

Re: Как скрыть {delete} в gridview для пользователя с id==1

Сообщение Diplodok »

А я так делал

Код: Выделить всё

'visibleButtons' => [
                    'delete' => function($data) { return $data->id !== 1; }
                ]
                
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: Как скрыть {delete} в gridview для пользователя с id==1

Сообщение svil »

Diplodok писал(а): 2018.08.14, 14:14 А я так делал

Код: Выделить всё

'visibleButtons' => [
                    'delete' => function($data) { return $data->id !== 1; }
                ]
                
Как исправить ошибку

Код: Выделить всё

Setting unknown property: yii\grid\DataColumn::delete
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: Как скрыть {delete} в gridview для пользователя с id==1

Сообщение svil »

вид index

Код: Выделить всё

<?php

use yii\helpers\Html;
use yii\grid\GridView;
//use app\modules\admin\models\User;

/* @var $this yii\web\View */
/* @var $dataProvider yii\data\ActiveDataProvider */

$this->title = 'Users';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="user-index">

    <h1><?= Html::encode($this->title) ?></h1>



                <?= GridView::widget([
                    'dataProvider' => $dataProvider,
                    'columns' => [

                        'id',
                        'username',
                        'password',
                        'auth_key',

                        ['class' => 'yii\grid\ActionColumn','template' => '{view} {update} {delete}'],
                        'visibleButtons' => [
                            'delete' => function($data) { return $data->id !== 1; }
                        ]

                    ],
                ]); ?>




    </div>






</div>
контроллер

Код: Выделить всё

<?php

namespace app\modules\admin\controllers;

use Yii;
use app\modules\admin\models\User;
use yii\data\ActiveDataProvider;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use app\modules\admin\models\SignupForm;

/**
 * UserController implements the CRUD actions for User model.
 */
class UserController extends Controller
{
    /**
     * {@inheritdoc}
     */
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['POST'],
                ],
            ],
        ];
    }

    /**
     * Lists all User models.
     * @return mixed
     */
    public function actionIndex()
    {
        $mod = User::find()->all();
       // debug($model);
        foreach ($mod as $mode)
        {
            echo $mode->id;
            echo "<br/>";
            $model[]=$mode->id;
        }

        $dataProvider = new ActiveDataProvider([
            'query' => User::find(),
        ]);

        return $this->render('index', [
            'dataProvider' => $dataProvider,
            'model' => $model,
        ]);
    }

    public function actionSignup()
    {
        $model = new SignupForm();

        if ($model->load(Yii::$app->request->post())) {
            if ($user = $model->signup()) {
                if (Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }
            }
        }

        return $this->render('signup', [
            'model' => $model,
        ]);
    }
    /**
     * Displays a single User model.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionView($id)
    {

        return $this->render('view', [
            'model' => $this->findModel($id),
        ]);
    }

    /**
     * Creates a new User model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate()
    {
        $model = new User();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        }

        return $this->render('create', [
            'model' => $model,
        ]);
    }

    /**
     * Updates an existing User model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionUpdate($id)
    {
        $model = $this->findModel($id);

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        }

        return $this->render('update', [
            'model' => $model,
        ]);
    }

    /**
     * Deletes an existing User model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionDelete($id)
    {
        $this->findModel($id)->delete();

        return $this->redirect(['index']);
    }

    /**
     * Finds the User model based on its primary key value.
     * If the model is not found, a 404 HTTP exception will be thrown.
     * @param integer $id
     * @return User the loaded model
     * @throws NotFoundHttpException if the model cannot be found
     */
    protected function findModel($id)
    {
        if (($model = User::findOne($id)) !== null) {
            return $model;
        }

        throw new NotFoundHttpException('The requested page does not exist.');
    }
}
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: Как скрыть {delete} в gridview для пользователя с id==1

Сообщение svil »

Так пыталась - пока не работает:

Код: Выделить всё

  <?= GridView::widget([
                    'dataProvider' => $dataProvider,
                    'columns' => [

                        'id',
                        'username',
                        'password',
                        'auth_key',

                        ['class' => 'yii\grid\ActionColumn','template' => '{view} {update} {delete}'],

'visibleButtons' => [
                    'view' => Yii::$app->user->can('/user/view'),
                    'update' => Yii::$app->user->can('/user/update'),
                    'delete' => Yii::$app->user->can('/user/delete')
                ],
                        'visibleButtons' => [
                            'delete' => function($data) { return $data->id !== 1; }
                        ],
                    ],
                ]); ?>
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Как скрыть {delete} в gridview для пользователя с id==1

Сообщение Dominus »

Код: Выделить всё

//...
[
    'class' => 'yii\grid\ActionColumn',
    'template' => '{view} {update} {delete}',
    'visibleButtons' => [
        'delete' => function ($data) {
            return $data->id !== 1;
        }
    ]
],
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
Diplodok
Сообщения: 76
Зарегистрирован: 2012.07.09, 15:55
Контактная информация:

Re: Как скрыть {delete} в gridview для пользователя с id==1

Сообщение Diplodok »

Рабочий пример:

Код: Выделить всё

\yii\grid\GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            'id',
            [
                'class' => 'yii\grid\ActionColumn',
                'template' => '{view} {update} {delete}',
                'visibleButtons' => [
                    'update' => function($data) { return $data->id !== 1; },
                    'delete' => function($data) { return $data->id !== 1; }
                ]
            ],
        ],
    ]);
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: Как скрыть {delete} в gridview для пользователя с id==1

Сообщение svil »

:shock: Спасибо. Почему не работало - разбираюсь.C Вашим примером заработало. :P
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: Как скрыть {delete} в gridview для пользователя с id==1

Сообщение svil »

не было ['class' => 'yii\grid\SerialColumn'] - поэтому и не находило
Аватара пользователя
Diplodok
Сообщения: 76
Зарегистрирован: 2012.07.09, 15:55
Контактная информация:

Re: Как скрыть {delete} в gridview для пользователя с id==1

Сообщение Diplodok »

SerialColumn не на что не влияет и в данном случае его можно удалить.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Как скрыть {delete} в gridview для пользователя с id==1

Сообщение Dominus »

svil писал(а): 2018.08.14, 15:04 не было ['class' => 'yii\grid\SerialColumn'] - поэтому и не находило
2 раза был указан ключ 'visibleButtons' в массиве, да и не верные настройки)

Код: Выделить всё

<?= GridView::widget([
                'dataProvider' => $dataProvider,
                'columns' => [

                    'id',
                    'username',
                    'password',
                    'auth_key',

                    [
                        'class' => 'yii\grid\ActionColumn',
                        'template' => '{view} {update} {delete}'
                    ],

                    'visibleButtons' => [
                        'view' => Yii::$app->user->can('/user/view'),
                        'update' => Yii::$app->user->can('/user/update'),
                        'delete' => Yii::$app->user->can('/user/delete')
                    ],
                    'visibleButtons' => [
                        'delete' => function ($data) {
                            return $data->id !== 1;
                        }
                    ],
                ],
            ]); ?>
Если отформатировать, то это хорошо видно)
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: Как скрыть {delete} в gridview для пользователя с id==1

Сообщение svil »

Спасибо. Я перепробовала все подряд. В документации непонятно было, как применить visibleButtons. Не догадалась использовать $data, все модель вытаскивала с запросами и без.
Ответить