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
						
					
					
				<?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.'); | 
						|
	} | 
						|
} |