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

<?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,
]);
}
}