You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
187 lines
4.6 KiB
187 lines
4.6 KiB
7 years ago
|
<?php
|
||
|
|
||
|
namespace frontend\controllers;
|
||
|
|
||
|
use core\entities\post\PostType;
|
||
|
use core\forms\post\PostCommentForm;
|
||
|
use core\repositories\post\read\PostCategoryReadRepository;
|
||
|
use core\repositories\post\read\PostReadRepository;
|
||
|
use core\repositories\post\read\PostTagReadRepository;
|
||
|
use core\services\post\PostCommentService;
|
||
|
use Yii;
|
||
|
use yii\data\ActiveDataProvider;
|
||
|
use yii\web\Controller;
|
||
|
use yii\web\NotFoundHttpException;
|
||
|
use yii\filters\AccessControl;
|
||
|
|
||
|
class PostController extends Controller
|
||
|
{
|
||
|
public $layout = 'post';
|
||
|
|
||
|
private $service;
|
||
|
private $posts;
|
||
|
private $categories;
|
||
|
private $tags;
|
||
|
|
||
|
public function __construct(
|
||
|
$id,
|
||
|
$module,
|
||
|
PostCommentService $service,
|
||
|
PostReadRepository $posts,
|
||
|
PostCategoryReadRepository $categories,
|
||
|
PostTagReadRepository $tags,
|
||
|
$config = []
|
||
|
)
|
||
|
{
|
||
|
parent::__construct($id, $module, $config);
|
||
|
$this->service = $service;
|
||
|
$this->posts = $posts;
|
||
|
$this->categories = $categories;
|
||
|
$this->tags = $tags;
|
||
|
}
|
||
|
|
||
|
public function behaviors(): array
|
||
|
{
|
||
|
return [
|
||
|
'access' => [
|
||
|
'class' => AccessControl::className(),
|
||
|
'rules' => [
|
||
|
[
|
||
|
'actions' => ['index', 'category', 'tag', 'post'],
|
||
|
'allow' => true,
|
||
|
'roles' => ['Posts'],
|
||
|
],
|
||
|
[
|
||
|
'actions' => ['comment'],
|
||
|
'allow' => true,
|
||
|
'roles' => ['Comments'],
|
||
|
],
|
||
|
[ // all the action are accessible to admin
|
||
|
'allow' => true,
|
||
|
'roles' => ['admin'],
|
||
|
],
|
||
|
],
|
||
|
],
|
||
|
];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param $tid
|
||
|
*
|
||
|
* @return string
|
||
|
* @throws NotFoundHttpException
|
||
|
*/
|
||
|
public function actionIndex($tid)
|
||
|
{
|
||
|
$type = $this->findType($tid);
|
||
|
/* @var $dataProvider ActiveDataProvider */
|
||
|
$dataProvider = $this->posts->getAll($type->id);
|
||
|
$dataProvider->pagination->pageSize = 10;
|
||
|
|
||
|
$this->layout = $type->name;
|
||
|
return $this->render($type->name . '/index', [
|
||
|
'dataProvider' => $dataProvider,
|
||
|
'type' => $type,
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param $id
|
||
|
* @param $tid
|
||
|
*
|
||
|
* @return string
|
||
|
* @throws NotFoundHttpException
|
||
|
*/
|
||
|
public function actionCategory($id, $tid)
|
||
|
{
|
||
|
if (!$category = $this->categories->find($id)) {
|
||
|
throw new NotFoundHttpException('The requested page does not exist.');
|
||
|
}
|
||
|
$type = $this->findType($tid);
|
||
|
|
||
|
$dataProvider = $this->posts->getAllByCategory($category);
|
||
|
|
||
|
return $this->render($type->name . '/category', [
|
||
|
'category' => $category,
|
||
|
'dataProvider' => $dataProvider,
|
||
|
'type' => $type,
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param $id
|
||
|
* @return mixed
|
||
|
* @throws NotFoundHttpException
|
||
|
*/
|
||
|
public function actionTag($id)
|
||
|
{
|
||
|
if (!$tag = $this->tags->find($id)) {
|
||
|
throw new NotFoundHttpException('The requested page does not exist.');
|
||
|
}
|
||
|
|
||
|
$dataProvider = $this->posts->getAllByTag($tag);
|
||
|
|
||
|
return $this->render('tag', [
|
||
|
'tag' => $tag,
|
||
|
'dataProvider' => $dataProvider,
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param $id
|
||
|
* @return mixed
|
||
|
* @throws NotFoundHttpException
|
||
|
*/
|
||
|
public function actionPost($id)
|
||
|
{
|
||
|
if (!$post = $this->posts->find($id)) {
|
||
|
throw new NotFoundHttpException('The requested page does not exist.');
|
||
|
}
|
||
|
|
||
|
$type = $this->findType($post->type_id);
|
||
|
|
||
|
$this->layout = $type->name;
|
||
|
|
||
|
return $this->render($type->name . '/post', [
|
||
|
'post' => $post,
|
||
|
'type' => $type,
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param $id
|
||
|
* @return mixed
|
||
|
* @throws NotFoundHttpException
|
||
|
*/
|
||
|
public function actionComment($id)
|
||
|
{
|
||
|
if (!$post = $this->posts->find($id)) {
|
||
|
throw new NotFoundHttpException('The requested page does not exist.');
|
||
|
}
|
||
|
|
||
|
$form = new PostCommentForm();
|
||
|
|
||
|
if ($form->load(Yii::$app->request->post()) && $form->validate()) {
|
||
|
try {
|
||
|
$comment = $this->service->create($post->id, Yii::$app->user->id, $form);
|
||
|
return $this->redirect(['post', 'id' => $post->id, '#' => 'comment_' . $comment->id]);
|
||
|
} catch (\DomainException $e) {
|
||
|
Yii::$app->errorHandler->logException($e);
|
||
|
Yii::$app->session->setFlash('error', $e->getMessage());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $this->render('comment', [
|
||
|
'post' => $post,
|
||
|
'model' => $form,
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
protected function findType($id): PostType
|
||
|
{
|
||
|
if (($type = PostType::findOne($id)) !== null) {
|
||
|
return $type;
|
||
|
}
|
||
|
throw new NotFoundHttpException('The requested page does not exist.');
|
||
|
}
|
||
|
}
|