@Illya_s

Как удалять посты в блоге?

Какой механизм удаления постов в Yii2? В проекте блог вынесен как отдельный модуль. Если удалять на локальном сайте в backend пост, то debage не фиксирует ошибок, приходится закрывать страницу через диспетчер задач, т.к. браузер зависает, и посты удаляются только в базе.
Пробовал добавить такой метод в Blog.Controller- не работает.

public function actionDelete($id=NULL)
{
    if ($id === NULL)
    {
        Yii::$app->session->setFlash('PostDeletedError');
        Yii::$app->getResponse()->redirect(array('site/index'));
    }
 
    $post = Post::find($id);
 
 
    if ($post === NULL)
    {
        Yii::$app->session->setFlash('PostDeletedError');
        Yii::$app->getResponse()->redirect(array('site/index'));
    }
 
    $post->delete();
 
    Yii::$app->session->setFlash('PostDeleted');
    Yii::$app->getResponse()->redirect(array('site/index'));
}


BlogController

<?php

namespace illyas\blog\controllers;
        

use Yii;
use common\models\ImageManager;
use medeyacom\blog\models\BlogSearch;
use yii\web\Controller;
use yii\web\MethodNotAllowedHttpException;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;


/**
 * BlogController implements the CRUD actions for Blog model.
 */
class BlogController extends Controller
{
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['POST'],
                    'delete-image' => ['POST'],
                    'sort-image' => ['POST'],

                ],
            ],
        ];
    }

    /**
     * Lists all Blog models.
     * @return mixed
     */
    public function actionIndex()
    {
        $searchModel = new BlogSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

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

    /**
     * Displays a single Blog model.
     * @param integer $id
     * @return mixed
     */
    public function actionView($id)
    {
        return $this->render('view', [
            'model' => $this->findModel($id),
        ]);
    }

    /**
     * Creates a new Blog model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate()
    {
        $model = new \illyas\blog\models\Blog();
        $model->sort = 50;

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

    /**
     * Updates an existing Blog model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     */

    public function actionUpdate($id)
    {
        $model = $this->findModel($id);

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

    /**
     * Deletes an existing Blog model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     */
   

    public function actionDelete($id)
    {
        $this->findModel($id)->delete();

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



    public function actionDeleteImage()
    {
        if(($model = ImageManager::findOne(Yii::$app->request->post('key'))) and $model->delete()){
            return true;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }

    public function actionSortImage($id)
    {
        if(Yii::$app->request->isAjax){
            $post = Yii::$app->request->post('sort');
            if($post['oldIndex'] > $post['newIndex']){
                $param = ['and',['>=','sort',$post['newIndex']],['<','sort',$post['oldIndex']]];
                $counter = 1;
            }else{
                $param = ['and',['<=','sort',$post['newIndex']],['>','sort',$post['oldIndex']]];
                $counter = -1;
            }
            ImageManager::updateAllCounters(['sort' => $counter], [
               'and',['class'=>'blog','item_id'=>$id],$param
               ]);
    
            ImageManager::updateAll(['sort' => $post['newIndex']], [
                    'id' => $post['stack'][$post['newIndex']]['key']
                ]);
                return true;
            }
            throw new MethodNotAllowedHttpException();
        }

         /**
             * Finds the Blog model based on its primary key value.
             * If the model is not found, a 404 HTTP exception will be thrown.
             * @param integer $id
             * @return Blog the loaded model
             * @throws NotFoundHttpException if the model cannot be found
             */

    protected function findModel($id)
    {
        if (($model = \illyas\blog\models\Blog::find()->with('tags')->andWhere(['id'=>$id])->one()) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }
}
  • Вопрос задан
  • 298 просмотров
Пригласить эксперта
Ответы на вопрос 2
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
посты удаляются только в базе

А где они еще должны удаляться?

браузер зависает

Вот тут yii не при чем.

public function actionDelete($id=NULL)

если сделать public function actionDelete($id)
То yii и так будет ошибку кидать, так что первое условие лишнее, я про
if ($id === NULL)
    {
        Yii::$app->session->setFlash('PostDeletedError');
        Yii::$app->getResponse()->redirect(array('site/index'));
    }

И вообще Вы накрутили много лишнего, стандартный crud через gii делает нормальный экшен, Вы его даже в коде привели, останется только flash добавить:
public function actionDelete($id){
    if (($post = Post::findOne($id)) and $post->delete())
    {
         Yii::$app->session->setFlash('PostDeleted');
    }else{
         Yii::$app->session->setFlash('PostDeleted');
   }
   return $this->redirect(['site/index']);
}
Ответ написан
Комментировать
@Illya_s Автор вопроса
Этот код не работает
public function actionDelete($id){
    if (($post = Post::findOne($id)) and $post->delete())
    {
         Yii::$app->session->setFlash('PostDeleted');
    }else{
         Yii::$app->session->setFlash('PostDeleted');
   }
   return $this->redirect(['site/index']);
}


А где они еще должны удаляться?


Поясню: если зайти MySQLменеджер в 'блог' -'данные' и 'удалить выбранную строку', то пост удалится.
Удаляться должны на сайте.

Если пробовать удалить пост на странице блога "admin.site.com/blog" либо по адресу: "admin.site.com/blog/blog/view?id=4" то посты не удалить. После нажатия в левом нижнем углу появляется строчка: admin.site.com/blog/blog/delete?id=4 и окно браузера после этого можно закрыть только через диспетчер задач.

Все перепробовал, подумал вначале: может, какой-то JS ушёл с бесконечный цикл? Но вот что интересно. В GoogleChrome - зависает, а в Microsoft Edge - c первого раза пост удалился, но со второго появилась ошибка:
d27950bce5c0444bb232129e2918c9d8.jpg в Mozzila- тоже самое. Если в Blog.php закомментировать 'beforeDelete' полностью- то пост удаляется.
В чем причина здесь?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы