Как выводить только свои статьи?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Boglik
Сообщения: 42
Зарегистрирован: 2018.10.16, 04:49

Как выводить только свои статьи?

Сообщение Boglik »

Создаю систему заявок.
Создал через груд модель, контроллеры, виеры.
Все что нужно допилил, кроме одного пункта:
Как модифицировать код, чтобы выводились только те заявки, которые создал сам пользователь?
В таблице zayvka - id, title,text, id_user
id_user - связывается со id пользователем. Как категории, вообщем. Но как сделать, чтобы было как в категориях я как-то не могу понять.

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

    /**
     * Lists all Zayavka models.
     * @return mixed
     */
    public function actionIndex()
    {

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

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,

        ]);

    }
Prooksius
Сообщения: 100
Зарегистрирован: 2019.01.17, 23:24

Re: Как выводить только свои статьи?

Сообщение Prooksius »

ID залогиненного юзера можно узнать так:

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

Yii::$app->user->id
В методе search вашей поисковой модели пропишите доп. условие, типа такого:

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

if (!Yii::$app->user->isGuest) {
	$query->andWhere(['id_user' => Yii::$app->user->id]);
}
Boglik
Сообщения: 42
Зарегистрирован: 2018.10.16, 04:49

Re: Как выводить только свои статьи?

Сообщение Boglik »

Переделал на такое:

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

    public function actionIndex()
    {

        //$posts = Post::find()->select('id, title, excerpt')->all();
        $query = Zayavka::find()->where(['id_user' => '3]'])->orderBy('id DESC');
        $pages = new \yii\data\Pagination(['totalCount' =>$query->count(), 'pageSize' => 20, 'pageSizeParam' => false, 'forcePageParam' => false]);
        $posts = $query->offset($pages->offset)->limit($pages->limit)->all();
        return $this->render('../zayavka/index', compact('posts', 'pages' ));

    }
id_user - это поле в таблице Zayavka - где создаются сами заявки. Заполняются значением 1,2,3 соответственно в зависимости от их ID в таблице User.

Как сделать так, чтобы при заходе на страницу они видели каждый свои созданные заявки?
То что выше код - это я прописал параметр 3 вручную. А хотелось бы что-то типа

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

$query = Zayavka::find()->where(['id_user' => '$id_user]'])->orderBy('id DESC');
Но я не совсем понимаю как это реализовывать. Связанные таблицы?
Prooksius - вы это имели ввиду? Я ваш пост увидел когда уже переписал все.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как выводить только свои статьи?

Сообщение ElisDN »

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

['id_user' => Yii::$app->user->id]
Boglik
Сообщения: 42
Зарегистрирован: 2018.10.16, 04:49

Re: Как выводить только свои статьи?

Сообщение Boglik »

Да. Это сработало. Спасибо.
Но теперь возник вопрос, а как теперь вставлять данные по умолчанию?
Каждый пользователь имеет свой ID который наследуется в таблицу zayavka и за счет этого происходит вывод данных.
В контроллере хочу вставить следующее, но правильно ли?
Это данные, которые должны автоматически заполняться, браться ID юзера из таблицы user и вставлять их в zayavka поле user_id
Код, который я пытаюсь модифицровать

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

$model->attributeLabels()->insert('zayavka', ['id_user' => Yii::$app->user->id])->execute();


ZayavkaController.php

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

    
    //создаем заявку
        public function actionCreate()
    {

        $model = new Zayavka();
$model->attributeLabels()->insert('zayavka', ['id_user' => Yii::$app->user->id])->execute();
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        }

        return $this->render('create', [
            'model' => $model,
        ]);
    }
В модели:
zayavka.php

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

<?php

namespace app\models;

use Yii;
use yii\db\ActiveRecord;

/**
 * This is the model class for table "zayavka".
 *
 * @property int $id
 * @property string $title
 * @property string $text
 * @property string $file
 * @property string $id_user
 */
class Zayavka extends \yii\db\ActiveRecord
{
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return '{{zayavka}}';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['text', 'file'], 'string'],
            [['title'], 'string', 'max' => 255],
            [['id'], 'unique'],

        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'title' => 'Title',
            'text' => 'Text',
            'file' => 'File',
            'id' => 'id_user',
        ];
    }
}
Prooksius
Сообщения: 100
Зарегистрирован: 2019.01.17, 23:24

Re: Как выводить только свои статьи?

Сообщение Prooksius »

Непонятно, конечно, что вы этим пытаетесь сделать.

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

$model->attributeLabels()->insert('zayavka', ['id_user' => Yii::$app->user->id])->execute();
Наверное, вместо этой непонятной строки нужно делать так:

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

$model->id_user = Yii::$app->user->id;
Здесь поле id_user заполняется значением id текущего залогиненного пользователя. В итоге получаем:

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

//создаем заявку
        public function actionCreate()
    {

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

        return $this->render('create', [
            'model' => $model,
        ]);
    }
Также советую почитать документацию, вот этот раздел:
https://www.yiiframework.com/doc/guide/ ... ating-data - Как сохранять данные.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Как выводить только свои статьи?

Сообщение unknownby »

А может вещи, которые должны проходить в модели, оставлять их там? А не выносить всё в контроллер, который отвечает за взаимосвязь вьюхи с моделью.

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

public function beforeSave($insert)
{
    if (parent::beforeSave($insert)) {
 
        //... тут ваш код
        $this->id_user = \Yii::$app->user->id;
 
        return true;
    }
    return false;
}
А actionIndex лучше вернуть в первоначальное состояние и добавить обычное условие внутри метода search, чем превращать контроллер в чудовище. :)
Prooksius
Сообщения: 100
Зарегистрирован: 2019.01.17, 23:24

Re: Как выводить только свои статьи?

Сообщение Prooksius »

В изначальном варианте, когда вы получали dataProvider, в него уже встроено разделение по страницам (по умолчанию 20 записей на страницу)
Почитайте про них
unknownby писал(а): 2020.06.01, 08:52 А может вещи, которые должны проходить в модели, оставлять их там? А не выносить всё в контроллер, который отвечает за взаимосвязь вьюхи с моделью.
Можно и так, не вопрос. Ну я думаю, в данном случае, одна простая строчка кода контроллеру не повредит. Но вообщем-то, вы правы, конечно.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Как выводить только свои статьи?

Сообщение unknownby »

Prooksius писал(а): 2020.06.01, 10:15 Можно и так, не вопрос. Ну я думаю, в данном случае, одна простая строчка кода контроллеру не повредит. Но вообщем-то, вы правы, конечно.
Есть опыт, когда одна простая строчка превращается в большой кусок кода. Просто потому, что было уже написано и терять нечего :D
Ответить