Таблица Yii2 Gridview с данными - PullRequest
0 голосов
/ 09 июня 2018

моя проблема следующая.Я использую таблицу сетки Yii2 и идентификатор пользователя, который я записал в сеансе.И если я войду в систему с пользователем, который имеет, например, ID 2, я хочу отобразить данные в таблице только для пользователя с ID 2. Заранее спасибо за ответы.

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

    'company_name',
    'person_name',
    'company_address',
    'company_email:email',
    'meeting_date',
    'user_id',//external key
    'tel_fix',
    'tel_mob',

    ['class' => 'yii\grid\ActionColumn', 'template' => '{view} {update}'],
  ],
  'tableOptions' => ['class' => 'table table-striped table-bordered'],
]); ?>

Вотмой actionIndex от PartnersController.

public function actionIndex()
    {
        $searchModel = new PartnersSearch();

        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

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

И где я могу это сделать?

Спасибо большое!Но в вашем коде я сделал только одно изменение, и теперь оно отлично работает!

Вместо:

$query->andFilterWhere ( [
        'user_partner_id' => $this->user_partner_id,
      ] );

Я написал:

$query->andFilterWhere ( [
        'user_partner_id' => $_SESSION['sess_id_user'],
      ] );

В любом случае, спасибоочень сильно!

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

Вы можете добавить условие непосредственно в действие контроллера после создания $dataProvider:

public function actionIndex() {
    $searchModel = new PartnersSearch();

    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    $dataprovider->query->andWhere(['user_partner_id' => $_SESSION['sess_id_user']]);

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

Обратите внимание, что использование andFilterWhere() в таких случаях может быть опасным - условие будет пропущено, если $_SESSION['sess_id_user']пустой.Поэтому, если пользователь является гостем, он может просмотреть все записи, если вы не запретите гостевой доступ для этого действия.

0 голосов
/ 10 июня 2018

Если вы используете UserModel, просто замените ваш запрос в SearchModel:


     $query->andFilterWhere ([
                'user_partner_id' => Yii::$app->user->identity->sess_id_user,
            ]);

Или, если ваш sess_id_user является первичным ключом в UserModel:


     $query->andFilterWhere ([
                'user_partner_id' => Yii::$app->user->id,
            ]);

0 голосов
/ 09 июня 2018

Если вы хотите перечислить только записи для пользователя, который вошел в систему, вам нужно сделать следующее

В вашем controller/action добавить следующее перед вызовом функции search() из модели,я предполагаю, что имя действия - actionIndex(), а имя представления - index, вы можете изменить их на относительные имена.

Вы не должны жестко кодировать user_partner_id в запросе внутри search() function

 //THIS IS WRONG
 $query = Partners::find()->where('user_partner_id',$_SESSION['sess_id_user']);

но вместо этого вы должны передать его через параметры в метод search(), так как ваш PartnersSearch будет использоваться администраторами, которым необходимо, чтобы все записи были доступны.

Изменитьвы controller/action

public function actionIndex(){
   $searchModel = new \common\models\PartnersSearch();
   $params = Yii::$app->request->queryParams;
   $params['PartnersSearch']['user_partner_id'] = Yii::$app->user->id;
   $dataProvider = $model->search ( $params );
   $this->render('index',['searchModel']);
}

и убедитесь, что у вас добавлено условие andFilterWhere для user_partner_id в функции search() модели CompanySearch или добавьте его перед возвратом $dataProvider в методе search().

  public function search( $params ) {
        $query = PartnersSearch::find ();

        // add conditions that should always apply here

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

        $this->load ( $params );

        if ( !$this->validate () ) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }
        //your rest of code
        .................

        /*THIS LINE NEEDS TO BE ADDED*/
        $query->andFilterWhere ( [
            'user_partner_id' => $this->user_partner_id,
        ] );
         /*THIS LINE NEEDS TO BE ADDED*/

         return $dataProvider;
}

EDIT

Убедитесь, что ваше поле user_partner_id из модели Partner добавлено в правила safe внутри PartnerSearch Модель в противном случае не будет загружать значение.

...