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.
		
		
		
		
		
			
		
			
				
					
					
						
							246 lines
						
					
					
						
							6.8 KiB
						
					
					
				
			
		
		
	
	
							246 lines
						
					
					
						
							6.8 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::class, | 
						|
				'rules' => [ | 
						|
					[ | 
						|
						'actions' => ['index', 'category', 'tag', 'post'], | 
						|
						'allow' => true, | 
						|
						//'roles' => ['Blog'], | 
						|
					], | 
						|
					[ | 
						|
						'actions' => ['preview'], | 
						|
						'allow' => true, | 
						|
						'roles' => ['BlogManagement'], | 
						|
					], | 
						|
					[ | 
						|
						'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, | 
						|
        ]); | 
						|
    } | 
						|
 | 
						|
	public function beforeAction($action) | 
						|
	{ | 
						|
		// ...set `$this->enableCsrfValidation` here based on some conditions... | 
						|
		// call parent method that will check CSRF if such property is true. | 
						|
		if ($action->id === 'preview') { | 
						|
			# code... | 
						|
			$this->enableCsrfValidation = false; | 
						|
		} | 
						|
		return parent::beforeAction($action); | 
						|
	} | 
						|
 | 
						|
	/*public function actionPreview($id = null) | 
						|
    { | 
						|
	    Yii::$app->controller->enableCsrfValidation = false; | 
						|
	    $form = new BlogPostForm(); | 
						|
	    $parent = $id ? BlogPost::findOne($id) : null; | 
						|
 | 
						|
	    if ($form->load(Yii::$app->request->post())) { | 
						|
		    $form->slug = md5(time()); | 
						|
	    	if ($form->validate()) { | 
						|
			    $post               = new BlogPost(); | 
						|
			    $post->id           = - 1; | 
						|
			    $post->title        = $form->title; | 
						|
			    $post->description  = $form->description; | 
						|
			    $post->content      = $form->content; | 
						|
			    $post->category_id  = $form->category_id; | 
						|
			    $post->created_at   = time(); | 
						|
			    $post->updated_at   = time(); | 
						|
			    $post->published_at = time(); | 
						|
 | 
						|
			    $meta            = new Meta( $form->meta->title, $form->meta->description, $form->meta->keywords ); | 
						|
			    $post->meta      = $meta; | 
						|
			    $post->meta_json = Json::encode( [ | 
						|
				    'title'       => $form->meta->title, | 
						|
				    'description' => $form->meta->description, | 
						|
				    'keywords'    => $form->meta->keywords, | 
						|
			    ] ); | 
						|
			    $post->video     = $form->video; | 
						|
			    $post->slug      = $form->slug; | 
						|
 | 
						|
			    if ( $form->image ) { | 
						|
				    $post->setImage( $form->image ); | 
						|
			    } else if ( $form->video ) { | 
						|
				    $src      = 'https://i.ytimg.com/vi/' . BlogPostHelper::parseYoutubeUrl( $post->video ) . '/maxresdefault.jpg'; | 
						|
				    $filename = ( new Security() )->generateRandomString( 15 ) . '.jpg'; | 
						|
				    copy( $src, \Yii::getAlias( BlogPost::FILE_ORIGINAL_PATH . '/' . $post->id . '.jpg' ) ); | 
						|
				    //copy($src, \Yii::getAlias(BlogPost::FILE_ORIGINAL_PATH . '/' . $filename)); | 
						|
				    $post->image = $filename; | 
						|
			    } | 
						|
 | 
						|
			    if ( $post->image ) { | 
						|
				    $path = $post->getUploadedFilePath( 'image' ); | 
						|
				    FileHelper::createDirectory( pathinfo( $path, PATHINFO_DIRNAME ), 0775, true ); | 
						|
				    $post->image->saveAs( $path ); | 
						|
				    $post->image = $post->getImageFileUrl( 'image' ); | 
						|
			    } else { | 
						|
				    $post->image = $parent->image; | 
						|
				    //$post->image = $post->getImageFileUrl( 'image' ); | 
						|
			    } | 
						|
 | 
						|
			    return $this->render( 'post', [ | 
						|
				    'post' => $post, | 
						|
			    ] ); | 
						|
		    } | 
						|
	    } else {print_r($form->errors);} | 
						|
	    return ''; | 
						|
    }*/ | 
						|
 | 
						|
	public function actionPreview($id) | 
						|
	{ | 
						|
		if (!$post = $this->posts->findPreview($id)) { | 
						|
			throw new NotFoundHttpException('The requested page does not exist.'); | 
						|
		} | 
						|
 | 
						|
		return $this->render('post', [ | 
						|
			'post' => $post, | 
						|
		]); | 
						|
	} | 
						|
} |