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.
		
		
		
		
		
			
		
			
				
					
					
						
							162 lines
						
					
					
						
							4.1 KiB
						
					
					
				
			
		
		
	
	
							162 lines
						
					
					
						
							4.1 KiB
						
					
					
				| <?php | |
|  | |
| namespace common\modules\blog\controllers; | |
|  | |
| use common\modules\blog\forms\BlogCommentForm; | |
| use common\modules\blog\repositories\read\BlogCategoryReadRepository; | |
| use common\modules\blog\repositories\read\BlogPostReadRepository; | |
| use common\modules\blog\repositories\read\BlogTagReadRepository; | |
| use common\modules\blog\services\BlogCommentService; | |
| use frontend\components\FrontendController; | |
| use Yii; | |
| use yii\data\ActiveDataProvider; | |
| use yii\web\NotFoundHttpException; | |
| use yii\filters\AccessControl; | |
|  | |
| class PostController extends FrontendController | |
| { | |
|     public $layout = 'blog'; | |
|  | |
|     private $service; | |
|     private $posts; | |
|     private $categories; | |
|     private $tags; | |
|  | |
|     public function __construct( | |
|         $id, | |
|         $module, | |
|         BlogCommentService $service, | |
|         BlogPostReadRepository $posts, | |
|         BlogCategoryReadRepository $categories, | |
|         BlogTagReadRepository $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' => ['Blog'], | |
| 					], | |
| 					[ | |
| 						'actions' => ['comment'], | |
| 						'allow' => true, | |
| 						'roles' => ['Comments'], | |
| 					], | |
| 					[    // all the action are accessible to admin | |
| 						'allow' => true, | |
| 						'roles' => ['admin'], | |
| 					], | |
| 				], | |
| 			], | |
| 		]; | |
| 	} | |
|  | |
| 	/** | |
| 	 * @return string | |
| 	 */ | |
|     public function actionIndex() | |
|     { | |
| 	    /* @var $dataProvider ActiveDataProvider */ | |
|         $dataProvider = $this->posts->getAll(); | |
| 	    $dataProvider->pagination->pageSize = 10; | |
|  | |
|         return $this->render('index', [ | |
|             'dataProvider' => $dataProvider, | |
|         ]); | |
|     } | |
|  | |
| 	/** | |
| 	 * @param $id | |
| 	 * | |
| 	 * @return string | |
| 	 * @throws NotFoundHttpException | |
| 	 */ | |
|     public function actionCategory($id) | |
|     { | |
| 	    if (!$category = $this->categories->find($id)) { | |
| 		    throw new NotFoundHttpException('The requested page does not exist.'); | |
| 	    } | |
|         $dataProvider = $this->posts->getAllByCategory($category); | |
|  | |
|         return $this->render('category', [ | |
|             'category' => $category, | |
|             'dataProvider' => $dataProvider, | |
|         ]); | |
|     } | |
|  | |
|     /** | |
|      * @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.'); | |
|         } | |
|  | |
|         return $this->render('post', [ | |
|             'post' => $post, | |
|         ]); | |
|     } | |
|  | |
|     /** | |
|      * @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 BlogCommentForm(); | |
|  | |
|         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, | |
|         ]); | |
|     } | |
| } |