Browse Source

Remove blog

master
Egorka 6 years ago
parent
commit
30d76ad23d
  1. 116
      common/modules/blog/BlogModule.php
  2. 249
      common/modules/blog/controllers/PostController.php
  3. 156
      common/modules/blog/controllers/manage/CategoryController.php
  4. 159
      common/modules/blog/controllers/manage/CommentController.php
  5. 311
      common/modules/blog/controllers/manage/PostController.php
  6. 151
      common/modules/blog/controllers/manage/TagController.php
  7. 117
      common/modules/blog/entities/BlogCategory.php
  8. 93
      common/modules/blog/entities/BlogComment.php
  9. 376
      common/modules/blog/entities/BlogPost.php
  10. 58
      common/modules/blog/entities/BlogTag.php
  11. 37
      common/modules/blog/entities/BlogTagAssignment.php
  12. 15
      common/modules/blog/entities/queries/BlogCategoryQuery.php
  13. 50
      common/modules/blog/entities/queries/BlogPostQuery.php
  14. 83
      common/modules/blog/forms/BlogCategoryForm.php
  15. 37
      common/modules/blog/forms/BlogCommentEditForm.php
  16. 20
      common/modules/blog/forms/BlogCommentForm.php
  17. 144
      common/modules/blog/forms/BlogPostForm.php
  18. 46
      common/modules/blog/forms/BlogTagForm.php
  19. 51
      common/modules/blog/forms/BlogTagSingleForm.php
  20. 56
      common/modules/blog/forms/search/BlogCategorySearch.php
  21. 72
      common/modules/blog/forms/search/BlogCommentSearch.php
  22. 71
      common/modules/blog/forms/search/BlogPostSearch.php
  23. 55
      common/modules/blog/forms/search/BlogTagSearch.php
  24. 132
      common/modules/blog/helpers/BlogPostHelper.php
  25. 11
      common/modules/blog/manifest.php
  26. 83
      common/modules/blog/messages/ru/blog.php
  27. 8
      common/modules/blog/messages/ru/blog_public.php
  28. 31
      common/modules/blog/migrations/m180605_184534_create_blog_categories_table.php
  29. 42
      common/modules/blog/migrations/m180605_190347_create_blog_posts_table.php
  30. 28
      common/modules/blog/migrations/m180605_193423_create_blog_tags_table.php
  31. 36
      common/modules/blog/migrations/m180605_193748_create_blog_tag_assignments_table.php
  32. 43
      common/modules/blog/migrations/m180605_194207_create_blog_comments_table.php
  33. 33
      common/modules/blog/migrations/m180725_091725_add_blog_posts_type_field.php
  34. 27
      common/modules/blog/migrations/m180725_113503_remove_blog_posts_slug_unique_index.php
  35. 33
      common/modules/blog/migrations/m180827_195932_set_blog_unicode_collate.php
  36. 54
      common/modules/blog/migrations/m180828_190314_create_blog_post_lng_table.php
  37. 55
      common/modules/blog/migrations/m180830_163050_create_blog_categories_lng_table.php
  38. 31
      common/modules/blog/repositories/BlogCategoryRepository.php
  39. 36
      common/modules/blog/repositories/BlogRepository.php
  40. 36
      common/modules/blog/repositories/BlogTagRepository.php
  41. 23
      common/modules/blog/repositories/read/BlogCategoryReadRepository.php
  42. 99
      common/modules/blog/repositories/read/BlogPostReadRepository.php
  43. 18
      common/modules/blog/repositories/read/BlogTagReadRepository.php
  44. 52
      common/modules/blog/services/BlogCategoryManageService.php
  45. 37
      common/modules/blog/services/BlogCommentManageService.php
  46. 32
      common/modules/blog/services/BlogCommentService.php
  47. 193
      common/modules/blog/services/BlogPostManageService.php
  48. 43
      common/modules/blog/services/BlogTagManageService.php
  49. 92
      common/modules/blog/urls/BlogCategoryUrlRule.php
  50. 90
      common/modules/blog/urls/BlogMainUrlRule.php
  51. 91
      common/modules/blog/urls/BlogTagUrlRule.php
  52. 73
      common/modules/blog/views/manage/category/_form.php
  53. 35
      common/modules/blog/views/manage/category/_form_tab.php
  54. 77
      common/modules/blog/views/manage/category/_view_tab.php
  55. 17
      common/modules/blog/views/manage/category/create.php
  56. 59
      common/modules/blog/views/manage/category/index.php
  57. 19
      common/modules/blog/views/manage/category/update.php
  58. 69
      common/modules/blog/views/manage/category/view.php
  59. 54
      common/modules/blog/views/manage/comment/index.php
  60. 34
      common/modules/blog/views/manage/comment/update.php
  61. 71
      common/modules/blog/views/manage/comment/view.php
  62. 222
      common/modules/blog/views/manage/post/_form.php
  63. 35
      common/modules/blog/views/manage/post/_form_tab.php
  64. 78
      common/modules/blog/views/manage/post/_view_tab.php
  65. 17
      common/modules/blog/views/manage/post/create.php
  66. 80
      common/modules/blog/views/manage/post/index.php
  67. 21
      common/modules/blog/views/manage/post/update.php
  68. 183
      common/modules/blog/views/manage/post/view.php
  69. 45
      common/modules/blog/views/manage/tag/_form.php
  70. 17
      common/modules/blog/views/manage/tag/create.php
  71. 47
      common/modules/blog/views/manage/tag/index.php
  72. 19
      common/modules/blog/views/manage/tag/update.php
  73. 39
      common/modules/blog/views/manage/tag/view.php
  74. 42
      common/modules/blog/views/post/_list.php
  75. 51
      common/modules/blog/views/post/_post.php
  76. 40
      common/modules/blog/views/post/category.php
  77. 13
      common/modules/blog/views/post/index.php
  78. 113
      common/modules/blog/views/post/post.php
  79. 29
      common/modules/blog/widgets/CategoriesWidget.php
  80. 20
      common/modules/blog/widgets/CommentView.php
  81. 57
      common/modules/blog/widgets/CommentsWidget.php
  82. 30
      common/modules/blog/widgets/MenuItemCreatorWidget.php
  83. 42
      common/modules/blog/widgets/PostByTagsWidget.php
  84. 39
      common/modules/blog/widgets/TagWidget.php
  85. 32
      common/modules/blog/widgets/views/categories/categories.php
  86. 78
      common/modules/blog/widgets/views/comments/_comment.php
  87. 103
      common/modules/blog/widgets/views/comments/comments.php
  88. 128
      common/modules/blog/widgets/views/menu-item/creator.php
  89. 38
      common/modules/blog/widgets/views/slider-relative.php
  90. 21
      common/modules/blog/widgets/views/tags/tags.php

116
common/modules/blog/BlogModule.php

@ -1,116 +0,0 @@
<?php
namespace common\modules\blog;
use common\modules\blog\widgets\MenuItemCreatorWidget;
use core\components\modules\ModuleInterface;
use yii\helpers\ArrayHelper;
/**
* blog module definition class
*/
class BlogModule extends \yii\base\Module implements ModuleInterface
{
/**
* @inheritdoc
*/
public $controllerNamespace = 'common\modules\blog\controllers';
/**
* @inheritdoc
*/
public function init()
{
parent::init();
// custom initialization code goes here
}
public function bootstrap($app)
{
// add migration path
$app->controllerMap['migrate']['migrationPath'][] = '@common/modules/blog/migrations';
// add search rules
$app->params['search_rules'][] = "SELECT title, content, CONCAT('/blog/manage/post/view/', blog_post_id) AS url FROM {{blog_posts_lng}}";
// add rules
$app->getUrlManager()->addRules([
'blog' => 'blog/post/index',
]);
$app->getUrlManager()->addRules([
['class' => 'common\modules\blog\urls\BlogMainUrlRule'],
['class' => 'common\modules\blog\urls\BlogCategoryUrlRule'],
['class' => 'common\modules\blog\urls\BlogTagUrlRule'],
]);
$app->getUrlManager()->addRules([
'blog/manage/post/view/<id:\d+>' => 'blog/manage/post/view',
]);
// add languages
$app->getI18n()->translations = ArrayHelper::merge($app->getI18n()->translations, [
'blog' => [
'class' => 'yii\i18n\PhpMessageSource',
'basePath' => '@common/modules/blog/messages',
],
'blog_public' => [
'class' => 'yii\i18n\PhpMessageSource',
'basePath' => '@common/modules/blog/messages',
],
]);
// add menu items
/*$app->params['adminMenu'][] = [
'label' => \Yii::t('blog', 'Blog'), 'icon' => 'book', 'items' => [
['label' => \Yii::t('blog', 'Categories'), 'icon' => 'caret-right', 'url' => ['/blog/manage/category/index'], 'active' => \Yii::$app->controller->getUniqueId() == 'blog/manage/category'],
['label' => \Yii::t('blog', 'Posts'), 'icon' => 'caret-right', 'url' => ['/blog/manage/post/index'], 'active' => \Yii::$app->controller->getUniqueId() == 'blog/manage/post'],
], 'visible' => \Yii::$app->user->can('admin') || \Yii::$app->user->can('BlogManagement')
];*/
//print_r(basename($app->getBasePath())); die;
//print_r($app->basePath); die;
if (basename($app->getBasePath()) === 'backend') {
$app->params['adminMenu'][] = [
'label' => \Yii::t( 'blog', 'Blog' ),
'icon' => 'book',
'items' => [
[
'label' => \Yii::t( 'blog', 'Categories' ),
'icon' => 'caret-right',
'url' => [ '/blog/manage/category/index' ]
],
[
'label' => \Yii::t( 'blog', 'Posts' ),
'icon' => 'caret-right',
'url' => [ '/blog/manage/post/index' ]
],
[
'label' => \Yii::t( 'blog', 'Comments' ),
'icon' => 'caret-right',
'url' => [ '/blog/manage/comment/index' ]
],
[
'label' => \Yii::t( 'blog', 'Tags' ),
'icon' => 'caret-right',
'url' => [ '/blog/manage/tag/index' ]
],
],
'visible' => \Yii::$app->user->can( 'admin' ) || \Yii::$app->user->can( 'BlogManagement' )
];
}
}
public static function getMenuItemCreator($menu_id): array
{
$widgets = [];
$widgets[] = [
'id' => 'blog',
'title' => \Yii::t('blog', 'Blog'),
'content' => MenuItemCreatorWidget::widget([
'menu_id' => $menu_id,
]),
];
return $widgets;
}
}

249
common/modules/blog/controllers/PostController.php

@ -1,249 +0,0 @@
<?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, $language = '')
{
if (!$post = $this->posts->findPreview($id, $language)) {
throw new NotFoundHttpException('The requested page does not exist.');
}
/*if ($language) {
Yii::$app->language = $language;
}*/
return $this->render('post', [
'post' => $post,
]);
}
}

156
common/modules/blog/controllers/manage/CategoryController.php

@ -1,156 +0,0 @@
<?php
namespace common\modules\blog\controllers\manage;
use common\modules\blog\entities\BlogCategory;
use common\modules\blog\forms\BlogCategoryForm;
use common\modules\blog\forms\search\BlogCategorySearch;
use common\modules\blog\services\BlogCategoryManageService;
use Yii;
use yii\data\ActiveDataProvider;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
class CategoryController extends Controller
{
private $service;
public function __construct($id, $module, BlogCategoryManageService $service, $config = [])
{
parent::__construct($id, $module, $config);
$this->service = $service;
}
public function behaviors(): array
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['BlogManagement'],
],
[ // all the action are accessible to admin
'allow' => true,
'roles' => ['admin'],
],
],
],
'verbs' => [
'class' => VerbFilter::class,
'actions' => [
'delete' => ['POST'],
],
],
];
}
/**
* @return string
*/
public function actionIndex()
{
$searchModel = new BlogCategorySearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
/**
* @param $id
*
* @return string
* @throws NotFoundHttpException
*/
public function actionView($id)
{
$category = $this->findModel($id);
return $this->render('view', [
'category' => $category,
]);
}
/**
* @return string|\yii\web\Response
*/
public function actionCreate()
{
$form = new BlogCategoryForm();
$form->updateSort();
if ($form->load(Yii::$app->request->post()) && $form->validate()) {
try {
$category = $this->service->create($form);
return $this->redirect(['view', 'id' => $category->id]);
} catch (\DomainException $e) {
Yii::$app->errorHandler->logException($e);
Yii::$app->session->setFlash('error', $e->getMessage());
}
}
return $this->render('create', [
'model' => $form,
]);
}
/**
* @param $id
*
* @return string|\yii\web\Response
* @throws NotFoundHttpException
*/
public function actionUpdate($id)
{
$category = $this->findModel($id);
$form = new BlogCategoryForm($category);
if ($form->load(Yii::$app->request->post()) && $form->validate()) {
try {
$this->service->edit($category->id, $form);
return $this->redirect(['view', 'id' => $category->id]);
} catch (\DomainException $e) {
Yii::$app->errorHandler->logException($e);
Yii::$app->session->setFlash('error', $e->getMessage());
}
}
return $this->render('update', [
'model' => $form,
'category' => $category,
]);
}
/**
* @param $id
*
* @return \yii\web\Response
*/
public function actionDelete($id)
{
//$category = $this->findModel($id);
try {
$this->service->remove($id);
} catch (\DomainException $e) {
Yii::$app->errorHandler->logException($e);
Yii::$app->session->setFlash('error', $e->getMessage());
}
return $this->redirect(['index']);
}
/**
* @param $id
*
* @return BlogCategory
* @throws NotFoundHttpException
*/
protected function findModel($id): BlogCategory
{
if (($model = BlogCategory::findOne($id)) !== null) {
return $model;
}
throw new NotFoundHttpException('The requested page does not exist.');
}
}

159
common/modules/blog/controllers/manage/CommentController.php

@ -1,159 +0,0 @@
<?php
namespace common\modules\blog\controllers\manage;
use common\modules\blog\entities\BlogPost;
use common\modules\blog\forms\BlogCommentEditForm;
use common\modules\blog\forms\search\BlogCommentSearch;
use common\modules\blog\services\BlogCommentManageService;
use Yii;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
class CommentController extends Controller
{
private $service;
public function __construct($id, $module, BlogCommentManageService $service, $config = [])
{
parent::__construct($id, $module, $config);
$this->service = $service;
}
public function behaviors(): array
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['BlogManagement'],
],
[ // all the action are accessible to admin
'allow' => true,
'roles' => ['admin'],
],
],
],
'verbs' => [
'class' => VerbFilter::class,
'actions' => [
'delete' => ['POST'],
],
],
];
}
/**
* @return mixed
*/
public function actionIndex()
{
$searchModel = new BlogCommentSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
/**
* @param $post_id
* @param $id
*
* @return string|\yii\web\Response
* @throws NotFoundHttpException
*/
public function actionUpdate($post_id, $id)
{
$post = $this->findModel($post_id);
$comment = $post->getComment($id);
$form = new BlogCommentEditForm($comment);
if ($form->load(Yii::$app->request->post()) && $form->validate()) {
try {
$this->service->edit($post->id, $comment->id, $form);
return $this->redirect(['view', 'post_id' => $post->id, 'id' => $comment->id]);
} catch (\DomainException $e) {
Yii::$app->errorHandler->logException($e);
Yii::$app->session->setFlash('error', $e->getMessage());
}
}
return $this->render('update', [
'post' => $post,
'model' => $form,
]);
}
/**
* @param $post_id
* @param $id
*
* @return string
* @throws NotFoundHttpException
*/
public function actionView($post_id, $id)
{
$post = $this->findModel($post_id);
$comment = $post->getComment($id);
return $this->render('view', [
'post' => $post,
'comment' => $comment,
]);
}
/**
* @param $post_id
* @param $id
*
* @return \yii\web\Response
* @throws NotFoundHttpException
*/
public function actionActivate($post_id, $id)
{
$post = $this->findModel($post_id);
try {
$this->service->activate($post->id, $id);
} catch (\DomainException $e) {
Yii::$app->session->setFlash('error', $e->getMessage());
}
return $this->redirect(['view', 'post_id' => $post_id, 'id' => $id]);
}
/**
* @param $post_id
* @param $id
*
* @return \yii\web\Response
* @throws NotFoundHttpException
*/
public function actionDelete($post_id, $id)
{
$post = $this->findModel($post_id);
try {
$this->service->remove($post->id, $id);
} catch (\DomainException $e) {
Yii::$app->session->setFlash('error', $e->getMessage());
}
return $this->redirect(['index']);
}
/**
* @param $id
*
* @return BlogPost
* @throws NotFoundHttpException
*/
protected function findModel($id): BlogPost
{
if (($model = BlogPost::findOne($id)) !== null) {
return $model;
}
throw new NotFoundHttpException('The requested page does not exist.');
}
}

311
common/modules/blog/controllers/manage/PostController.php

@ -1,311 +0,0 @@
<?php
namespace common\modules\blog\controllers\manage;
use common\modules\blog\entities\BlogPost;
use common\modules\blog\entities\BlogTag;
use common\modules\blog\forms\BlogPostForm;
use common\modules\blog\forms\search\BlogPostSearch;
use common\modules\blog\services\BlogPostManageService;
use Yii;
use yii\helpers\Url;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use yii\web\Response;
class PostController extends Controller
{
private $service;
public function __construct($id, $module, BlogPostManageService $service, $config = [])
{
parent::__construct($id, $module, $config);
$this->service = $service;
}
public function behaviors(): array
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['BlogManagement'],
],
[ // all the action are accessible to admin
'allow' => true,
'roles' => ['admin'],
],
],
],
'verbs' => [
'class' => VerbFilter::class,
'actions' => [
'delete' => ['POST'],
'activate' => ['POST'],
'draft' => ['POST'],
'delete-photo' => ['POST'],
'move-photo-up' => ['POST'],
'move-photo-down' => ['POST'],
'restore-history' => ['POST'],
'clear-history' => ['POST'],
],
],
];
}
/**
* @return string
*/
public function actionIndex()
{
$searchModel = new BlogPostSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render( 'index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
/**
* @param $id
*
* @return string
* @throws NotFoundHttpException
*/
public function actionView($id)
{
$post = $this->findModel($id);
$history = BlogPost::find()
->andWhere(['OR', ['revision_id' => $id], ['id' => $id]])
->orderBy(['revision_at' => SORT_DESC])
->limit(20)
->all();
return $this->render('view', [
'post' => $post,
'history' => $history,
]);
}
public function actionCreatePreview($id = null, $language = '')
{
$this->service->removePreviews();
$form = new BlogPostForm();
$form->type = BlogPost::TYPE_PREVIEW;
if ($form->load(Yii::$app->request->post()) && $form->validate()) {
try {
$post = $this->service->create( $form, BlogPost::TYPE_PREVIEW );
if ($id && !$post->image) {
$real_post = BlogPost::findOne($id);
if ($real_post->image) {
$post->image = $real_post->image;
$post->save();
$path = Yii::getAlias('@staticRoot/origin/posts');
$parts = pathinfo($real_post->image);
copy($path . '/' . $real_post->id . '.' . $parts['extension'], $path . '/' . $post->id . '.' . $parts['extension']);
}
}
return $this->redirect(Url::to(Yii::$app->get('frontendUrlManager')->createAbsoluteUrl(['/blog/post/preview', 'id' => $post->id, 'language' => $language])));
} catch (\DomainException $e) {
Yii::$app->errorHandler->logException($e);
Yii::$app->session->setFlash('error', $e->getMessage());
}
}
$form->published_at = date('d.m.Y H:i:s');
return $this->render('create', [
'model' => $form,
]);
}
public function actionCreate()
{
$form = new BlogPostForm();
if ($form->load(Yii::$app->request->post()) && $form->validate()) {
try {
$post = $this->service->create( $form );
return $this->redirect( [ 'view', 'id' => $post->id ] );
} catch (\DomainException $e) {
Yii::$app->errorHandler->logException($e);
Yii::$app->session->setFlash('error', $e->getMessage());
}
}
$form->published_at = date('d.m.Y H:i:s');
return $this->render('create', [
'model' => $form,
]);
}
/**
* @param $id
*
* @return string|\yii\web\Response
* @throws NotFoundHttpException
*/
public function actionUpdate($id)
{
$post = $this->findModel($id);
$form = new BlogPostForm($post);
$form->published_at = date('d.m.Y H:i:s', $form->published_at);
if ($form->load(Yii::$app->request->post()) && $form->validate()) {
try {
$this->service->edit($post->id, $form);
return $this->redirect(['view', 'id' => $post->id]);
} catch (\DomainException $e) {
Yii::$app->errorHandler->logException($e);
Yii::$app->session->setFlash('error', $e->getMessage());
}
}
return $this->render('update', [
'model' => $form,
'post' => $post,
]);
}
/**
* @param $id
*
* @return Response
*/
public function actionDelete($id)
{
try {
$this->service->remove($id);
} catch (\DomainException $e) {
Yii::$app->session->setFlash('error', $e->getMessage());
}
return $this->redirect(['index']);
}
/**
* @param integer $id
* @return mixed
*/
public function actionActivate($id)
{
try {
$this->service->activate($id);
} catch (\DomainException $e) {
Yii::$app->session->setFlash('error', $e->getMessage());
}
return $this->redirect(['view', 'id' => $id]);
}
/**
* @param integer $id
* @return mixed
*/
public function actionDraft($id)
{
try {
$this->service->draft($id);
} catch (\DomainException $e) {
Yii::$app->session->setFlash('error', $e->getMessage());
}
return $this->redirect(['view', 'id' => $id]);
}
public function actionTagSearch($q = null, $id = null)
{
\Yii::$app->response->format = Response::FORMAT_JSON;
$out = ['results' => ['id' => '', 'text' => '']];
if (!is_null($q)) {
$data = BlogTag::find()->select('name as id, name as text')->andWhere(['like', 'name', $q])->orderBy('name')->limit(20)->asArray()->all();
$out['results'] = array_values($data);
}
elseif ($id > 0) {
$tag_name = BlogTag::findOne($id)->name;
$out['results'] = ['id' => $tag_name, 'text' => $tag_name];
}
return $out;
}
public function actionPostSearch($q = null, $id = null)
{
\Yii::$app->response->format = Response::FORMAT_JSON;
$out = ['results' => ['id' => '', 'text' => '']];
if (!is_null($q)) {
//$data = BlogPost::find()->select('id, title as text')->andWhere(['like', 'title', $q])->limit(20)->asArray()->all();
//$out['results'] = array_values($data);
$data = [];
$posts = BlogPost::find()
->with('translation')
->leftJoin('{{%blog_posts_lng}}', '`blog_posts_lng`.`blog_post_id` = `blog_posts`.`id`')
->andWhere(['like', 'blog_posts_lng.title', $q])
->limit(20)
->all();
foreach ($posts as $post) {
$data[] = [
'id' => $post->id,
'text' => isset($post->translation) ? $post->translation->title : null,
];
}
$out['results'] = array_values($data);
}
elseif ($id > 0) {
$tag_name = BlogPost::findOne($id)->translation->title;
$out['results'] = ['id' => $tag_name, 'text' => $tag_name];
}
else {
//$data = BlogPost::find()->select('id, title as text')->orderBy(['created_at' => SORT_DESC])->limit(20)->asArray()->all();
//$out['results'] = array_values($data);
$data = [];
$posts = BlogPost::find()->orderBy(['id' => SORT_DESC])->limit(20)->all();
foreach ($posts as $post) {
$data[] = [
'id' => $post->id,
'text' => isset($post->translation) ? $post->translation->title : null,
];
}
$out['results'] = array_values($data);
}
return $out;
}
public function actionRestoreHistory($id)
{
$post = $this->findModel($id);
if ($post_id = $post->revision_id) {
$new_id = $this->service->restoreHistory($id, $post->revision_id);
return $this->redirect(['/blog/manage/post/view', 'id' => $new_id]);
}
return $this->redirect(['/blog/manage/post/index']);
}
public function actionClearHistory($id)
{
$post = $this->findModel($id);
$this->service->clearHistory($post);
return $this->redirect(['/blog/manage/post/view', 'id' => $post->id]);
}
/**
* @param $id
*
* @return BlogPost
* @throws NotFoundHttpException
*/
protected function findModel($id): BlogPost
{
if (($model = BlogPost::findOne($id)) !== null) {
return $model;
}
throw new NotFoundHttpException('The requested page does not exist.');
}
protected function findLanguageModel($id)
{
if (($model = BlogPost::find()->multilingual()->andWhere(['id' => $id])->one()) !== null) {
return $model;
}
throw new NotFoundHttpException('The requested page does not exist.');
}
}

151
common/modules/blog/controllers/manage/TagController.php

@ -1,151 +0,0 @@
<?php
namespace common\modules\blog\controllers\manage;
use common\modules\blog\entities\BlogTag;
use common\modules\blog\forms\BlogTagSingleForm;
use common\modules\blog\forms\search\BlogTagSearch;
use common\modules\blog\services\BlogTagManageService;
use Yii;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
class TagController extends Controller
{
private $service;
public function __construct($id, $module, BlogTagManageService $service, $config = [])
{
parent::__construct($id, $module, $config);
$this->service = $service;
}
public function behaviors(): array
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['BlogManagement'],
],
[ // all the action are accessible to admin
'allow' => true,
'roles' => ['admin'],
],
],
],
'verbs' => [
'class' => VerbFilter::class,
'actions' => [
'delete' => ['POST'],
],
],
];
}
/**
* @return string
*/
public function actionIndex()
{
$searchModel = new BlogTagSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
/**
* @param $id
*
* @return string
* @throws NotFoundHttpException
*/
public function actionView($id)
{
$tag = $this->findModel($id);
return $this->render('view', [
'tag' => $tag,
]);
}
/**
* @return string|\yii\web\Response
*/
public function actionCreate()
{
$form = new BlogTagSingleForm();
if ($form->load(Yii::$app->request->post()) && $form->validate()) {
try {
$tag = $this->service->create($form);
return $this->redirect(['view', 'id' => $tag->id]);
} catch (\DomainException $e) {
Yii::$app->errorHandler->logException($e);
Yii::$app->session->setFlash('error', $e->getMessage());
}
}
return $this->render('create', [
'model' => $form,
]);
}
/**
* @param $id
*
* @return string|\yii\web\Response
* @throws NotFoundHttpException
*/
public function actionUpdate($id)
{
$tag = $this->findModel($id);
$form = new BlogTagSingleForm($tag);
if ($form->load(Yii::$app->request->post()) && $form->validate()) {
try {
$this->service->edit($tag->id, $form);
return $this->redirect(['view', 'id' => $tag->id]);
} catch (\DomainException $e) {
Yii::$app->errorHandler->logException($e);
Yii::$app->session->setFlash('error', $e->getMessage());
}
}
return $this->render('update', [
'model' => $form,
'tag' => $tag,
]);
}
/**
* @param $id
*
* @return \yii\web\Response
*/
public function actionDelete($id)
{
try {
$this->service->remove($id);
} catch (\DomainException $e) {
Yii::$app->errorHandler->logException($e);
Yii::$app->session->setFlash('error', $e->getMessage());
}
return $this->redirect(['index']);
}
/**
* @param $id
*
* @return BlogTag
* @throws NotFoundHttpException
*/
protected function findModel($id): BlogTag
{
if (($model = BlogTag::findOne($id)) !== null) {
return $model;
}
throw new NotFoundHttpException('The requested page does not exist.');
}
}

117
common/modules/blog/entities/BlogCategory.php

@ -1,117 +0,0 @@
<?php
namespace common\modules\blog\entities;
use common\modules\blog\entities\queries\BlogCategoryQuery;
use core\behaviors\LanguageBehavior;
use core\behaviors\SluggableRelationBehavior;
use yii\db\ActiveRecord;
use Yii;
/**
* @property integer $id
* @property string $slug
* @property integer $sort
*
*
* @method ActiveRecord findTranslation(string $language)
* @method void saveTranslations($translations)
*
* @property ActiveRecord[] $translations
* @property ActiveRecord $translation
*/
class BlogCategory extends ActiveRecord
{
public $_form;
public static function create($form, $slug, $sort): self
{
$category = new static();
$category->slug = $slug;
$category->sort = $sort;
$category->_form = $form;
return $category;
}
public function edit($form, $slug, $sort): void
{
$this->slug = $slug;
$this->sort = $sort;
$this->_form = $form;
}
public function attributeLabels()
{
return [
'id' => Yii::t('blog', 'ID'),
'name' => Yii::t('blog', 'Name'),
'slug' => Yii::t('blog', 'SEO link'),
'sort' => Yii::t('blog', 'Sort'),
'title' => Yii::t('blog', 'Title'),
'description' => Yii::t('blog', 'Description'),
'meta_title' => Yii::t('blog', 'META Title'),
'meta_description' => Yii::t('blog', 'META Description'),
'meta_keywords' => Yii::t('blog', 'META Keywords'),
];
}
public function getSeoTitle(): string
{
return $this->translation->meta_title ?: $this->getHeadingTile();
}
public function getHeadingTile(): string
{
return $this->translation->title ?: $this->translation->name;
}
public function getPostsCount(): int
{
return BlogPost::find()->where(['category_id' => $this->id])->count('*');
}
public static function tableName(): string
{
return '{{%blog_categories}}';
}
public function behaviors(): array
{
return [
/*[
'class' => SluggableBehavior::class,
'attribute' => 'title',
'ensureUnique' => true,
'preserveNonEmptyValues' => true,
],*/
[
'class' => LanguageBehavior::class,
'virtualClassName' => 'BlogCategoryVirtualTranslate',
'translatedLanguages' => \Yii::$app->params['translatedLanguages'],
'relativeField' => 'blog_category_id',
'tableName' => '{{%blog_categories_lng}}',
'attributes' => [
'title',
'description',
'name',
'meta_title',
'meta_description',
'meta_keywords'
],
//'defaultLanguage' => basename(Yii::$app->getBasePath()) === 'backend' ? Yii::$app->language : Yii::$app->params['defaultLanguage'],
'defaultLanguage' => \Yii::$app->params['defaultLanguage'],
],
[
'class' => SluggableRelationBehavior::class,
'attribute' => 'name',
'relation' => 'translation',
],
];
}
public static function find(): BlogCategoryQuery
{
return new BlogCategoryQuery(static::class);
}
}

93
common/modules/blog/entities/BlogComment.php

@ -1,93 +0,0 @@
<?php
namespace common\modules\blog\entities;
use core\entities\user\User;
use yii\db\ActiveQuery;
use yii\db\ActiveRecord;
use Yii;
/**
* @property int $id
* @property int $created_at
* @property int $post_id
* @property int $user_id
* @property int $parent_id
* @property string $text
* @property bool $active
*
* @property BlogPost $post
*/
class BlogComment extends ActiveRecord
{
public static function create($userId, $parentId, $text): self
{
$review = new static();
$review->user_id = $userId;
$review->parent_id = $parentId;
$review->text = $text;
$review->created_at = time();
$review->active = true;
return $review;
}
public function edit($parentId, $text): void
{
$this->parent_id = $parentId;
$this->text = $text;
}
public function attributeLabels()
{
return [
'id' => Yii::t('blog', 'ID'),
'user_id' => Yii::t('blog', 'User'),
'parent_id' => Yii::t('blog', 'Parent Comment ID'),
'created_at' => Yii::t('blog', 'Created At'),
'active' => Yii::t('blog', 'Published'),
'post_id' => Yii::t('blog', 'Post'),
'text' => Yii::t('blog', 'Comment'),
];
}
public function activate(): void
{
$this->active = true;
}
public function draft(): void
{
$this->active = false;
}
public function isActive(): bool
{
return $this->active == true;
}
public function isIdEqualTo($id): bool
{
return $this->id == $id;
}
public function isChildOf($id): bool
{
return $this->parent_id == $id;
}
public function getPost(): ActiveQuery
{
return $this->hasOne(BlogPost::class, ['id' => 'post_id']);
}
public function getUser(): ActiveQuery
{
return $this->hasOne(User::class, ['id' => 'user_id']);
}
public static function tableName(): string
{
return '{{%blog_comments}}';
}
}

376
common/modules/blog/entities/BlogPost.php

@ -1,376 +0,0 @@
<?php
namespace common\modules\blog\entities;
use common\modules\blog\entities\queries\BlogPostQuery;
use core\behaviors\LanguageBehavior;
use core\behaviors\SluggableRelationBehavior;
use lhs\Yii2SaveRelationsBehavior\SaveRelationsBehavior;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveQuery;
use yii\db\ActiveRecord;
use yii\web\UploadedFile;
use yiidreamteam\upload\ImageUploadBehavior;
use Yii;
/**
* This is the model class for table "posts".
*
* @property int $id
* @property int $category_id
* @property int $published_at
* @property int $created_at
* @property int $updated_at
* @property string $image
* @property string $video
* @property int $status
* @property int $comments_count
* @property int $views
* @property string $slug
* @property int $type
* @property int $revision_at
* @property int $revision_id
*
* @method ActiveRecord findTranslation(string $language)
* @method void saveTranslations($translations)
*
* @property ActiveRecord[] translations
* @property ActiveRecord[] translation
*
* @property BlogComment[] $blogComments
* @property BlogTagAssignment[] $blogTagAssignments
* @property BlogTag[] $tags
* @property BlogCategory $category
*
* @mixin ImageUploadBehavior
*/
class BlogPost extends ActiveRecord
{
const STATUS_DRAFT = 0;
const STATUS_ACTIVE = 1;
const TYPE_PUBLIC = 0;
const TYPE_REVISION = 1;
const TYPE_PREVIEW = 2;
const FILE_ORIGINAL_PATH = '@staticRoot/origin/posts';
public $_form;
public static function create($form, $categoryId, $slug, $published_at, $video, $type = BlogPost::TYPE_PUBLIC): self
{
$post = new static();
$post->category_id = $categoryId;
$post->slug = $slug;
$post->status = self::STATUS_DRAFT;
$post->created_at = time();
$post->comments_count = 0;
$post->published_at = $published_at;
$post->video = $video;
$post->type = $type;
$post->revision_at = time();
$post->_form = $form;
return $post;
}
public function setImage(UploadedFile $image): void
{
$this->image = $image;
}
public function edit($form, $categoryId, $slug, $published_at, $video, $type = BlogPost::TYPE_PUBLIC): void
{
$this->category_id = $categoryId;
$this->slug = $slug;
$this->published_at = $published_at;
$this->video = $video;
$this->type = $type;
$this->revision_at = time();
$this->_form = $form;
}
/**
* @inheritdoc
*/
public static function tableName()
{
return 'blog_posts';
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => Yii::t('blog', 'ID'),
'category_id' => Yii::t('blog', 'Category'),
'published_at' => Yii::t('blog', 'Published At'),
'created_at' => Yii::t('blog', 'Created At'),
'updated_at' => Yii::t('blog', 'Updated At'),
'title' => Yii::t('blog', 'Title'),
'description' => Yii::t('blog', 'Description'),
'content' => Yii::t('blog', 'Content'),
'image' => Yii::t('blog', 'Image'),
'video' => Yii::t('blog', 'Video'),
'type' => Yii::t('blog', 'Type'),
'revision_at' => Yii::t('blog', 'Revision At'),
'status' => Yii::t('blog', 'Status'),
'meta_json' => Yii::t('blog', 'Meta Json'),
'comments_count' => Yii::t('blog', 'Comments Count'),
'views' => Yii::t('blog', 'Views'),
'slug' => Yii::t('blog', 'Slug'),
'meta_title' => Yii::t('blog', 'META Title'),
'meta_description' => Yii::t('blog', 'META Description'),
'meta_keywords' => Yii::t('blog', 'META Keywords'),
];
}
public function activate(): void
{
if ($this->isActive()) {
throw new \DomainException('Post is already active.');
}
$this->status = self::STATUS_ACTIVE;
}
public function draft(): void
{
if ($this->isDraft()) {
throw new \DomainException('Post is already draft.');
}
$this->status = self::STATUS_DRAFT;
}
public function isActive(): bool
{
return $this->status == self::STATUS_ACTIVE;
}
public function isDraft(): bool
{
return $this->status == self::STATUS_DRAFT;
}
public function getSeoTitle(): string
{
return $this->translation->meta_title ?: $this->translation->title;
}
// Tags
public function assignTag($id): void
{
$assignments = $this->blogTagAssignments;
foreach ($assignments as $assignment) {
if ($assignment->isForTag($id)) {
return;
}
}
$assignments[] = BlogTagAssignment::create($id);
$this->blogTagAssignments = $assignments;
}
public function revokeTag($id): void
{
$assignments = $this->blogTagAssignments;
foreach ($assignments as $i => $assignment) {
if ($assignment->isForTag($id)) {
unset($assignments[$i]);
$this->blogTagAssignments = $assignments;
return;
}
}
throw new \DomainException('Assignment is not found.');
}
public function revokeTags(): void
{
$this->blogTagAssignments = [];
}
// Comments
public function addComment($userId, $parentId, $text): BlogComment
{
$parent = $parentId ? $this->getComment($parentId) : null;
if ($parent && !$parent->isActive()) {
throw new \DomainException('Cannot add comment to inactive parent.');
}
$comments = $this->blogComments;
$comments[] = $comment = BlogComment::create($userId, $parent ? $parent->id : null, $text);
$this->updateComments($comments);
return $comment;
}
public function editComment($id, $parentId, $text): void
{
$parent = $parentId ? $this->getComment($parentId) : null;
$comments = $this->blogComments;
foreach ($comments as $comment) {
if ($comment->isIdEqualTo($id)) {
$comment->edit($parent ? $parent->id : null, $text);
$this->updateComments($comments);
return;
}
}
throw new \DomainException('Comment is not found.');
}
public function activateComment($id): void
{
$comments = $this->blogComments;
foreach ($comments as $comment) {
if ($comment->isIdEqualTo($id)) {
$comment->activate();
$this->updateComments($comments);
return;
}
}
throw new \DomainException('Comment is not found.');
}
public function removeComment($id): void
{
$comments = $this->blogComments;
foreach ($comments as $i => $comment) {
if ($comment->isIdEqualTo($id)) {
if ($this->hasChildren($comment->id)) {
$comment->draft();
} else {
unset($comments[$i]);
}
$this->updateComments($comments);
return;
}
}
throw new \DomainException('Comment is not found.');
}
public function getComment($id): BlogComment
{
foreach ($this->blogComments as $comment) {
if ($comment->isIdEqualTo($id)) {
return $comment;
}
}
throw new \DomainException('Comment is not found.');
}
private function hasChildren($id): bool
{
foreach ($this->blogComments as $comment) {
if ($comment->isChildOf($id)) {
return true;
}
}
return false;
}
private function updateComments(array $comments): void
{
$this->blogComments = $comments;
$this->comments_count = count(array_filter($comments, function (BlogComment $comment) {
return $comment->isActive();
}));
}
######################################
public function getBlogComments(): ActiveQuery
{
return $this->hasMany(BlogComment::class, ['post_id' => 'id']);
}
public function getBlogTagAssignments(): ActiveQuery
{
return $this->hasMany(BlogTagAssignment::class, ['post_id' => 'id']);
}
public function getTags(): ActiveQuery
{
return $this->hasMany(BlogTag::class, ['id' => 'tag_id'])->viaTable('blog_tag_assignments', ['post_id' => 'id']);
}
public function getCategory(): ActiveQuery
{
return $this->hasOne(BlogCategory::class, ['id' => 'category_id']);
}
######################################
public function behaviors(): array
{
return [
TimestampBehavior::class,
[
'class' => SaveRelationsBehavior::class,
'relations' => ['blogTagAssignments', 'blogComments'],
],
/*[
'class' => SluggableBehavior::class,
'attribute' => 'title',
'ensureUnique' => true,
'preserveNonEmptyValues' => true,
],*/
[
'class' => LanguageBehavior::class,
'virtualClassName' => 'BlogVirtualTranslate',
'translatedLanguages' => \Yii::$app->params['translatedLanguages'],
'relativeField' => 'blog_post_id',
'tableName' => "{{%blog_posts_lng}}",
'attributes' => ['title', 'description', 'content', 'meta_title', 'meta_description', 'meta_keywords'],
//'defaultLanguage' => basename(Yii::$app->getBasePath()) === 'backend' ? Yii::$app->language : Yii::$app->params['defaultLanguage'],
'defaultLanguage' => \Yii::$app->params['defaultLanguage'],
],
[
'class' => SluggableRelationBehavior::class,
'attribute' => 'title',
'relation' => 'translation',
],
[
// todo Image Sizes to settings or theme settings
'class' => ImageUploadBehavior::class,
'attribute' => 'image',
'createThumbsOnRequest' => true,
//'filePath' => $this::FILE_ORIGINAL_PATH . '/[[id]].[[extension]]',
'filePath' => '@staticRoot/origin/posts/[[id]].[[extension]]',
'fileUrl' => '@static/origin/posts/[[id]].[[extension]]',
'thumbPath' => '@staticRoot/cache/posts/[[profile]]_[[id]].[[extension]]',
'thumbUrl' => '@static/cache/posts/[[profile]]_[[id]].[[extension]]',
'thumbs' => [
'blog_list' => ['width' => 750, 'height' => 300, 'resizeUp' => true],
'blog_post' => ['width' => 900, 'height' => 300],
'admin' => ['width' => 60, 'height' => 60],
'thumb' => ['width' => 150, 'height' => 150],
'list' => ['width' => 200, 'height' => 200],
'home_slider' => ['width' => 369, 'height' => 343],
'94_94' => ['width' => 94, 'height' => 94],
'368_287' => ['width' => 368, 'height' => 287],
'370_325' => ['width' => 370, 'height' => 325],
'683_407' => ['width' => 683, 'height' => 407],
'thumb_gallery_view' => ['width' => 300, 'height' => 170],
//'widget_list' => ['width' => 228, 'height' => 228],
//'origin' => ['processor' => [new WaterMarker(1024, 768, '@frontend/web/image/logo.png'), 'process']],
'origin' => ['width' => 1024, 'height' => 768],
],
],
];
}
public function transactions(): array
{
return [
self::SCENARIO_DEFAULT => self::OP_ALL,
];
}
public static function find(): BlogPostQuery
{
return new BlogPostQuery(static::class);
}
}

58
common/modules/blog/entities/BlogTag.php

@ -1,58 +0,0 @@
<?php
namespace common\modules\blog\entities;
use yii\db\ActiveRecord;
use yii\caching\TagDependency;
use yii\behaviors\SluggableBehavior;
use Yii;
/**
* @property integer $id
* @property string $name
* @property string $slug
*/
class BlogTag extends ActiveRecord
{
public static function create($name, $slug): self
{
$tag = new static();
$tag->name = $name;
$tag->slug = $slug;
return $tag;
}
public function edit($name, $slug): void
{
$this->name = $name;
if ($slug != $this->slug)
{
TagDependency::invalidate(\Yii::$app->cache, 'blog_tags');
}
$this->slug = $slug;
}
public function attributeLabels()
{
return [
'name' => Yii::t('blog', 'Tag Name'),
'slug' => Yii::t('blog', 'SEO link'),
];
}
public static function tableName(): string
{
return '{{%blog_tags}}';
}
public function behaviors() {
return [
[
'class' => SluggableBehavior::class,
'attribute' => 'name',
'ensureUnique' => true,
'preserveNonEmptyValues' => true,
],
];
}
}

37
common/modules/blog/entities/BlogTagAssignment.php

@ -1,37 +0,0 @@
<?php
namespace common\modules\blog\entities;
use yii\db\ActiveRecord;
use yii\db\ActiveQuery;
/**
* @property integer $post_id;
* @property integer $tag_id;
*
* @property BlogTag $tag
*/
class BlogTagAssignment extends ActiveRecord
{
public static function create($tagId): self
{
$assignment = new static();
$assignment->tag_id = $tagId;
return $assignment;
}
public function isForTag($id): bool
{
return $this->tag_id == $id;
}
public static function tableName(): string
{
return '{{%blog_tag_assignments}}';
}
public function getTag(): ActiveQuery
{
return $this->hasOne(BlogTag::class, ['id' => 'tag_id']);
}
}

15
common/modules/blog/entities/queries/BlogCategoryQuery.php

@ -1,15 +0,0 @@
<?php
/**
* Created by Error202
* Date: 27.07.2018
*/
namespace common\modules\blog\entities\queries;
use yii\db\ActiveQuery;
use core\components\LanguageTranslateTrait;
class BlogCategoryQuery extends ActiveQuery
{
use LanguageTranslateTrait;
}

50
common/modules/blog/entities/queries/BlogPostQuery.php

@ -1,50 +0,0 @@
<?php
namespace common\modules\blog\entities\queries;
use common\modules\blog\entities\BlogPost;
use core\components\LanguageTranslateTrait;
use yii\db\ActiveQuery;
class BlogPostQuery extends ActiveQuery
{
use LanguageTranslateTrait;
/**
* @param null $alias
* @return $this
*/
public function active($alias = null)
{
return $this->andWhere([
($alias ? $alias . '.' : '') . 'status' => BlogPost::STATUS_ACTIVE,
]);
}
public function pubDate()
{
return $this->andWhere(['<', 'published_at', time()]);
}
public function typePublic($alias = null)
{
return $this->andWhere([
($alias ? $alias . '.' : '') . 'type' => BlogPost::TYPE_PUBLIC,
]);
}
/*public function byType($type)
{
return $this->andWhere(['type_id' => $type]);
}*/
public function last()
{
return $this->orderBy(['published_at' => SORT_DESC]);
}
public function popular()
{
return $this->orderBy(['views' => SORT_DESC]);
}
}

83
common/modules/blog/forms/BlogCategoryForm.php

@ -1,83 +0,0 @@
<?php
namespace common\modules\blog\forms;
use common\modules\blog\entities\BlogCategory;
use core\components\LanguageDynamicModel;
use core\forms\CompositeForm;
use core\forms\MetaForm;
use core\validators\SlugValidator;
use Yii;
/**
* @property MetaForm $meta;
*/
class BlogCategoryForm extends LanguageDynamicModel
{
public $name;
public $slug;
public $title;
public $description;
public $sort;
public $meta_title;
public $meta_description;
public $meta_keywords;
public $_category;
public function __construct(BlogCategory $category = null, array $attributes = [], $config = [])
{
if ($category) {
$this->slug = $category->slug;
$this->sort = $category->sort;
$this->_category = $category;
} else {
$this->sort = BlogCategory::find()->max('sort') + 1;
}
parent::__construct($category, $attributes, $config);
}
public function rules(): array
{
return array_merge(
parent::rules(),
[
[['name'], 'required'],
[['name', 'slug', 'title', 'meta_title', 'meta_keywords'], 'string', 'max' => 255],
[['description', 'meta_description'], 'string'],
['slug', SlugValidator::class],
[['slug'], 'unique', 'targetClass' => BlogCategory::class, 'filter' => $this->_category ? ['<>', 'id', $this->_category->id] : null]
]
);
}
public function attributeLabels()
{
return array_merge(
parent::attributeLabels(),
[
'name' => Yii::t('blog', 'Name'),
'slug' => Yii::t('blog', 'SEO link'),
'sort' => Yii::t('blog', 'Sort'),
'title' => Yii::t('blog', 'Title'),
'description' => Yii::t('blog', 'Description'),
'meta_title' => Yii::t('blog', 'META Title'),
'meta_description' => Yii::t('blog', 'META Description'),
'meta_keywords' => Yii::t('blog', 'META Keywords'),
]
);
}
public function attributeHints() {
return array_merge(
parent::attributeHints(),
[
'slug' => Yii::t('blog', 'SEO link will be generated automatically if not specified'),
]
);
}
public function updateSort() {
$this->sort = BlogCategory::find()->max('sort') + 1;
}
}

37
common/modules/blog/forms/BlogCommentEditForm.php

@ -1,37 +0,0 @@
<?php
namespace common\modules\blog\forms;
use common\modules\blog\entities\BlogComment;
use yii\base\Model;
use Yii;
class BlogCommentEditForm extends Model
{
public $parentId;
public $text;
public function __construct(BlogComment $comment, $config = [])
{
$this->parentId = $comment->parent_id;
$this->text = $comment->text;
parent::__construct($config);
}
public function rules(): array
{
return [
[['text'], 'required'],
['text', 'string'],
['parentId', 'integer'],
];
}
public function attributeLabels()
{
return [
'parentId' => Yii::t('blog', 'Parent Comment ID'),
'text' => Yii::t('blog', 'Comment'),
];
}
}

20
common/modules/blog/forms/BlogCommentForm.php

@ -1,20 +0,0 @@
<?php
namespace common\modules\blog\forms;
use yii\base\Model;
class BlogCommentForm extends Model
{
public $parentId;
public $text;
public function rules(): array
{
return [
[['text'], 'required'],
['text', 'string'],
['parentId', 'integer'],
];
}
}

144
common/modules/blog/forms/BlogPostForm.php

@ -1,144 +0,0 @@
<?php
namespace common\modules\blog\forms;
use common\modules\blog\entities\BlogCategory;
use common\modules\blog\entities\BlogPost;
use core\forms\CompositeForm;
use core\forms\CompositeLanguageForm;
use core\forms\MetaForm;
use core\validators\SlugValidator;
use yii\db\ActiveQuery;
use yii\db\ActiveRecord;
use yii\helpers\ArrayHelper;
use yii\web\UploadedFile;
use Yii;
/**
* @property MetaForm $meta
* @property BlogTagForm $tags
*/
class BlogPostForm extends CompositeLanguageForm
{
public $type;
public $category_id;
public $title;
public $description;
public $content;
public $image;
public $video;
public $published_at;
public $slug;
public $reset_image;
public $status;
public $meta_title;
public $meta_description;
public $meta_keywords;
public $_post;
public function __construct(BlogPost $post = null, array $attributes = [], $config = [])
{
if ($post) {
$this->category_id = $post->category_id;
$this->video = $post->video;
$this->published_at = $post->published_at;
$this->slug = $post->slug;
$this->tags = new BlogTagForm($post);
$this->status = $post->status;
$this->_post = $post;
} else {
$this->tags = new BlogTagForm();
$this->status = 0;
}
parent::__construct($post, $attributes, $config);
}
public function rules(): array
{
return array_merge(
parent::rules(),
[
[['category_id', 'title'], 'required'],
[['title', 'video', 'meta_title', 'meta_keywords'], 'string', 'max' => 255],
[['category_id', 'status'], 'integer'],
[['description', 'content', 'meta_description'], 'string'],
[['image'], 'image'],
['reset_image', 'boolean'],
['published_at', 'safe'],
['slug', SlugValidator::class],
[['slug'], 'unique', 'targetClass' => BlogPost::class, 'filter' => function (ActiveQuery $query) {
if ($this->type != BlogPost::TYPE_PUBLIC) {
$query->andWhere($this->type . '=' . BlogPost::TYPE_PUBLIC);
}
$query->andWhere(['type' => BlogPost::TYPE_PUBLIC]);
if ($this->_post) {
$query->andWhere(['<>', 'id', $this->_post->id]);
}
return $query;
}],
]
);
}
public function attributeLabels()
{
return array_merge(
parent::attributeLabels(),
[
'id' => Yii::t('blog', 'ID'),
'category_id' => Yii::t('blog', 'Category'),
'published_at' => Yii::t('blog', 'Published At'),
'created_at' => Yii::t('blog', 'Created At'),
'updated_at' => Yii::t('blog', 'Updated At'),
'title' => Yii::t('blog', 'Title'),
'description' => Yii::t('blog', 'Description'),
'content' => Yii::t('blog', 'Content'),
'image' => Yii::t('blog', 'Image'),
'video' => Yii::t('blog', 'Video'),
'status' => Yii::t('blog', 'Status'),
'comments_count' => Yii::t('blog', 'Comments Count'),
'views' => Yii::t('blog', 'Views'),
'slug' => Yii::t('blog', 'Slug'),
'reset_image' => Yii::t('blog', 'Reset Image'),
'meta_title' => Yii::t('blog', 'META Title'),
'meta_description' => Yii::t('blog', 'META Description'),
'meta_keywords' => Yii::t('blog', 'META Keywords'),
]
);
}
public function attributeHints() {
return array_merge(
parent::attributeHints(),
[
'published_at' => Yii::t('blog', 'The article will be published after the specified date if its status is not a draft'),
'slug' => Yii::t('pages', 'SEO link will be generated automatically if not specified'),
]
);
}
public function categoriesList(): array
{
return ArrayHelper::map(BlogCategory::find()->orderBy('sort')->all(), 'id', function (BlogCategory $category) {
return $category->translation->name;
});
}
protected function internalForms(): array
{
return ['tags'];
}
public function beforeValidate(): bool
{
if (parent::beforeValidate()) {
$this->image = UploadedFile::getInstance($this, 'image');
$this->published_at = strtotime($this->published_at);
return true;
}
return false;
}
}

46
common/modules/blog/forms/BlogTagForm.php

@ -1,46 +0,0 @@
<?php
namespace common\modules\blog\forms;
use common\modules\blog\entities\BlogPost;
use common\modules\blog\entities\BlogTag;
use yii\base\Model;
use yii\helpers\ArrayHelper;
/**
* @property array $newNames
*/
class BlogTagForm extends Model
{
public $existing = [];
public $textNew;
public $new_tags;
public function __construct(BlogPost $post = null, $config = [])
{
if ($post) {
$this->new_tags = ArrayHelper::map($post->blogTagAssignments, 'tag_id', 'tag.name');
}
parent::__construct($config);
}
public function rules(): array
{
return [
['existing', 'each', 'rule' => ['integer']],
[['textNew'], 'string'],
['existing', 'default', 'value' => []],
['new_tags', 'each', 'rule' => ['string']],
];
}
public function tagsList(): array
{
return ArrayHelper::map(BlogTag::find()->orderBy('name')->asArray()->all(), 'id', 'name');
}
public function getNewNames(): array
{
return array_filter(array_map('trim', preg_split('#\s*,\s*#i', $this->textNew)));
}
}

51
common/modules/blog/forms/BlogTagSingleForm.php

@ -1,51 +0,0 @@
<?php
namespace common\modules\blog\forms;
use common\modules\blog\entities\BlogTag;
use core\validators\SlugValidator;
use yii\base\Model;
use Yii;
class BlogTagSingleForm extends Model
{
public $name;
public $slug;
public $type_id;
private $_tag;
public function __construct(BlogTag $tag = null, $config = [])
{
if ($tag) {
$this->name = $tag->name;
$this->slug = $tag->slug;
$this->_tag = $tag;
}
parent::__construct($config);
}
public function rules(): array
{
return [
[['name'], 'required'],
[['name', 'slug'], 'string', 'max' => 255],
['slug', SlugValidator::class],
[['name', 'slug'], 'unique', 'targetClass' => BlogTag::class, 'filter' => $this->_tag ? ['<>', 'id', $this->_tag->id] : null]
];
}
public function attributeLabels()
{
return [
'name' => Yii::t('blog', 'Tag Name'),
'slug' => Yii::t('blog', 'SEO link'),
];
}
public function attributeHints() {
return [
'slug' => Yii::t('pages', 'SEO link will be generated automatically if not specified'),
];
}
}

56
common/modules/blog/forms/search/BlogCategorySearch.php

@ -1,56 +0,0 @@
<?php
namespace common\modules\blog\forms\search;
use common\modules\blog\entities\BlogCategory;
use yii\base\Model;
use yii\data\ActiveDataProvider;
class BlogCategorySearch extends Model
{
public $id;
public $name;
public $slug;
public $title;
public function rules(): array
{
return [
[['id'], 'integer'],
[['slug'], 'safe'],
[['name', 'title'], 'safe'],
];
}
/**
* @param array $params
* @return ActiveDataProvider
*/
public function search(array $params): ActiveDataProvider
{
$query = BlogCategory::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => [
'defaultOrder' => ['sort' => SORT_ASC]
]
]);
$this->load($params);
if (!$this->validate()) {
$query->where('0=1');
return $dataProvider;
}
$query->andFilterWhere([
'id' => $this->id,
]);
$query
->andFilterWhere(['like', 'name', $this->name])
->andFilterWhere(['like', 'slug', $this->slug])
->andFilterWhere(['like', 'title', $this->title]);
return $dataProvider;
}
}

72
common/modules/blog/forms/search/BlogCommentSearch.php

@ -1,72 +0,0 @@
<?php
namespace common\modules\blog\forms\search;
use common\modules\blog\entities\BlogComment;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
class BlogCommentSearch extends Model
{
public $id;
public $text;
public $active;
public $post_id;
public function rules(): array
{
return [
[['id', 'post_id'], 'integer'],
[['text'], 'safe'],
[['active'], 'boolean'],
];
}
/**
* @param array $params
* @return ActiveDataProvider
*/
public function search(array $params): ActiveDataProvider
{
$query = BlogComment::find()->with(['post']);
$dataProvider = new ActiveDataProvider([
'query' => $query,
'key' => function (BlogComment $comment) {
return [
'post_id' => $comment->post_id,
'id' => $comment->id,
];
},
'sort' => [
'defaultOrder' => ['id' => SORT_DESC]
]
]);
$this->load($params);
if (!$this->validate()) {
$query->where('0=1');
return $dataProvider;
}
$query->andFilterWhere([
'id' => $this->id,
'post_id' => $this->post_id,
]);
$query
->andFilterWhere(['like', 'text', $this->text]);
return $dataProvider;
}
public function activeList(): array
{
return [
1 => Yii::$app->formatter->asBoolean(true),
0 => Yii::$app->formatter->asBoolean(false),
];
}
}

71
common/modules/blog/forms/search/BlogPostSearch.php

@ -1,71 +0,0 @@
<?php
namespace common\modules\blog\forms\search;
use common\modules\blog\entities\BlogCategory;
use common\modules\blog\entities\BlogPost;
use common\modules\blog\helpers\BlogPostHelper;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use yii\helpers\ArrayHelper;
class BlogPostSearch extends Model
{
public $id;
public $title;
public $status;
public $category_id;
public function rules(): array
{
return [
[['id', 'status', 'category_id'], 'integer'],
[['title'], 'safe'],
];
}
/**
* @param array $params
* @return ActiveDataProvider
*/
public function search(array $params): ActiveDataProvider
{
$query = BlogPost::find()->typePublic()->joinWith('translation');
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => [
'defaultOrder' => ['id' => SORT_DESC]
]
]);
$this->load($params);
if (!$this->validate()) {
$query->where('0=1');
return $dataProvider;
}
$query->andFilterWhere([
'id' => $this->id,
'category_id' => $this->category_id,
]);
$query
->andFilterWhere(['like', 'title', $this->title]);
return $dataProvider;
}
public function categoriesList(): array
{
return ArrayHelper::map(BlogCategory::find()->orderBy('sort')->all(), 'id', function (BlogCategory $category) {
return $category->translation->name;
});
}
public function statusList(): array
{
return BlogPostHelper::statusList();
}
}

55
common/modules/blog/forms/search/BlogTagSearch.php

@ -1,55 +0,0 @@
<?php
namespace common\modules\blog\forms\search;
use common\modules\blog\entities\BlogTag;
use yii\base\Model;
use yii\data\ActiveDataProvider;
class BlogTagSearch extends Model
{
public $id;
public $name;
public $slug;
public function rules(): array
{
return [
[['id'], 'integer'],
[['name', 'slug'], 'safe'],
];
}
/**
* @param array $params
* @return ActiveDataProvider
*/
public function search(array $params): ActiveDataProvider
{
$query = BlogTag::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => [
'defaultOrder' => ['name' => SORT_ASC]
]
]);
$this->load($params);
if (!$this->validate()) {
$query->where('0=1');
return $dataProvider;
}
$query->andFilterWhere([
'id' => $this->id,
]);
$query
->andFilterWhere(['like', 'name', $this->name])
->andFilterWhere(['like', 'slug', $this->slug]);
return $dataProvider;
}
}

132
common/modules/blog/helpers/BlogPostHelper.php

@ -1,132 +0,0 @@
<?php
namespace common\modules\blog\helpers;
use common\modules\blog\entities\BlogPost;
use common\modules\blog\forms\BlogPostForm;
use common\modules\blog\repositories\BlogRepository;
use common\modules\blog\repositories\read\BlogPostReadRepository;
use common\modules\blog\services\BlogPostManageService;
use core\dispatchers\DeferredEventDispatcher;
use core\entities\post\Post;
use core\services\TransactionManager;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use Yii;
class BlogPostHelper
{
public static function statusList(): array
{
return [
Post::STATUS_DRAFT => Yii::t('blog', 'Draft'),
Post::STATUS_ACTIVE => Yii::t('blog', 'Active'),
];
}
public static function statusName($status): string
{
return ArrayHelper::getValue(self::statusList(), $status);
}
public static function statusLabel($status): string
{
switch ($status) {
case Post::STATUS_DRAFT:
$class = 'label label-default';
break;
case Post::STATUS_ACTIVE:
$class = 'label label-success';
break;
default:
$class = 'label label-default';
}
return Html::tag('span', ArrayHelper::getValue(self::statusList(), $status), [
'class' => $class,
]);
}
public static function parseYoutubeUrl($url)
{
$urls = parse_url($url);
//url is http://youtu.be/xxxx
if($urls['host'] == 'youtu.be'){
$id = ltrim($urls['path'],'/');
}
//url is http://www.youtube.com/embed/xxxx
else if(strpos($urls['path'],'embed') == 1){
$id = end(explode('/',$urls['path']));
}
//url is xxxx only
else if(strpos($url,'/')===false){
$id = $url;
}
//http://www.youtube.com/watch?feature=player_embedded&v=m-t4pcO99gI
//url is http://www.youtube.com/watch?v=xxxx
else{
parse_str($urls['query']);
/* @var $v */
$id = $v;
if(!empty($feature)){
$id = end(explode('v=',$urls['query']));
}
}
return $id;
}
public static function saveRevision1(BlogPost $model) {
if (!$model->revision_id) {
$blogForm = new BlogPostForm($model);
$blog = BlogPost::create(
$blogForm,
$model->category_id,
$model->slug,
$model->published_at,
$model->video,
$model->type
);
$blog->type = BlogPost::TYPE_REVISION;
$blog->revision_at = $model->updated_at;
$blog->revision_id = $model->id;
foreach ($model->tags as $tag) {
$blog->assignTag($tag->id);
}
$blog->save();
if ($model->image) {
$path = Yii::getAlias( '@staticRoot/origin/posts' );
$parts = pathinfo( $model->image );
copy( $path . '/' . $model->id . '.' . $parts['extension'], $path . '/' . $blog->id . '.' . $parts['extension'] );
}
}
}
public static function saveRevision(BlogPost $model) {
if (!$model->revision_id) {
$revision = clone $model;
$revision->id = null;
$revision->isNewRecord = true;
$revision->revision_at = $revision->updated_at;
$revision->revision_id = $model->id;
$revision->type = BlogPost::TYPE_REVISION;
$revision->_form = new BlogPostForm($model);
$revision->save();
// tags
foreach ($model->tags as $tag) {
$revision->assignTag($tag->id);
}
$revision->save();
if ($model->image) {
$path = Yii::getAlias( '@staticRoot/origin/posts' );
$parts = pathinfo( $model->image );
copy( $path . '/' . $model->id . '.' . $parts['extension'], $path . '/' . $revision->id . '.' . $parts['extension'] );
}
}
}
}

11
common/modules/blog/manifest.php

@ -1,11 +0,0 @@
<?php
return [
'version' => '1.0.1',
'name' => 'blog',
'description' => 'Blog system for site with comments and slug',
'module' => 'BlogModule',
'permissions' => [
'BlogManagement' => 'Blog management system'
],
];

83
common/modules/blog/messages/ru/blog.php

@ -1,83 +0,0 @@
<?php
return [
'blog' => 'Блог',
'Blog system for site with comments and slug' => 'Публикация статей на сайте в виде ленты. Статьи разделены по категориям',
'All Posts' => 'Все статьи',
'Posts' => 'Статьи',
'Categories' => 'Категории',
'Tags' => 'Теги',
'News' => 'Новости',
'Comments' => 'Комментарии',
'Articles' => 'Статьи',
'Blog' => 'Блог',
'Blogs' => 'Блоги',
'Events' => 'События',
'Gallery' => 'Фотогалерея',
'Create Post' => 'Новая статья',
'Create Category' => 'Новая категория',
'Create Tag' => 'Новый тег',
'Common' => 'Основное',
'Title' => 'Заголовок',
'Description' => 'Описание',
'Content' => 'Содержание',
'Image' => 'Изображение',
'Existing' => 'Существующие',
'New tag' => 'Новый тег',
'Category' => 'Категория',
'Post is already active.' => 'Статья уже опубликована.',
'Published At' => 'Опубликовано',
'Created At' => 'Создано',
'Updated At' => 'Обновлено',
'Status' => 'Статус',
'ID' => '№',
'SEO' => 'МЕТА теги',
'Tag Name' => 'Тег',
'SEO link' => 'ЧПУ ссылка',
'Draft' => 'Черновик',
'Active' => 'Опубликовано',
'Activate' => 'Опубликовать',
'META Title' => 'Заголовок',
'META Description' => 'Описание',
'META Keywords' => 'Ключевые слова',
'Name' => 'Название',
'Sort' => 'Позиция',
'Update: {name}' => 'Редактирование: {name}',
'Types' => 'Типы',
'Create Type' => 'Новый тип',
'Singular' => 'Единственное число',
'Plural' => 'Множественное число',
'Slug' => 'ЧПУ ссылка',
'Update Post: {name}' => 'Редактирование: {name}',
'Update Post Comment: {name}' => 'Редактирование комментария: {name}',
'Update Tag: {name}' => 'Редактирование тега: {name}',
'Parent Comment ID' => 'Родительский комментарий',
'Comment' => 'Комментарий',
'Published' => 'Опубликовано',
'User' => 'Пользователь',
'Post' => 'Статья',
'YouTube URL' => 'Ссылка YouTube',
'Video URL' => 'Ссылка на видео (YouTube, Vimeo)',
'Add Image' => 'Новое изображение',
'Video' => 'Видео',
'If a video link is specified, the image will be used as a preview image' => 'Если указана ссылка на видео, то изображение будет рассматриваться как картинка для предварительного просмотра',
'Reset Image' => 'Сбросить изображение',
'Set tags...' => 'Укажите теги...',
'Publish' => 'Публикация',
'Preview on site' => 'Просмотр на сайте',
'Publish Date' => 'Дата публикации',
'The article will be published after the specified date if its status is not a draft' => 'Статья будет опубликована после наступления указанной даты, если ее статус не черновик.',
'Blog Post' => 'Статья',
'Blog Home' => 'Блог',
'Select post...' => 'Укажите статью...',
'Type' => 'Тип',
'Revision At' => 'Версия',
'History' => 'История изменений',
'Clear History' => 'Очистить историю',
'History is empty' => 'Нет изменений',
'Current Edition' => 'Текущая редакция',
'Restore' => 'Восстановить',
'Are you sure you want to restore this history item?' => 'Вы уверены, что хотите восстановить эту запись?',
'Are you sure you want to remove this history?' => 'Вы уверены, что хотите удалить всю историю?',
'View' => 'Просмотр',
'SEO link will be generated automatically if not specified' => 'ЧПУ ссылка будет сгенерирована автоматически, если не указано',
];

8
common/modules/blog/messages/ru/blog_public.php

@ -1,8 +0,0 @@
<?php
return [
'Blog' => 'Блог',
'Read More' => 'Подробнее',
'Leave a Comment' => 'Комментировать',
'Categories' => 'Категории',
];

31
common/modules/blog/migrations/m180605_184534_create_blog_categories_table.php

@ -1,31 +0,0 @@
<?php
use yii\db\Migration;
/**
* Handles the creation of table `blog_categories`.
*/
class m180605_184534_create_blog_categories_table extends Migration
{
public function up()
{
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
$this->createTable('{{%blog_categories}}', [
'id' => $this->primaryKey(),
'name' => $this->string()->notNull(),
'slug' => $this->string()->notNull(),
'title' => $this->string(),
'description' => $this->text(),
'sort' => $this->integer()->notNull(),
'meta_json' => 'LONGTEXT NOT NULL',
], $tableOptions);
$this->createIndex('{{%idx-blog_categories-slug}}', '{{%blog_categories}}', 'slug', true);
}
public function down()
{
$this->dropTable('{{%blog_categories}}');
}
}

42
common/modules/blog/migrations/m180605_190347_create_blog_posts_table.php

@ -1,42 +0,0 @@
<?php
use yii\db\Migration;
/**
* Handles the creation of table `blog_posts`.
*/
class m180605_190347_create_blog_posts_table extends Migration
{
public function up()
{
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
$this->createTable('{{%blog_posts}}', [
'id' => $this->primaryKey(),
'category_id' => $this->integer()->notNull(),
'published_at' => $this->integer()->unsigned()->notNull(),
'created_at' => $this->integer()->unsigned(),
'updated_at' => $this->integer()->unsigned(),
'title' => $this->string()->notNull(),
'description' => $this->text(),
'content' => 'MEDIUMTEXT',
'image' => $this->string(),
'video' => $this->string(),
'status' => $this->integer()->notNull(),
'meta_json' => 'TEXT NOT NULL',
'comments_count' => $this->integer()->notNull()->defaultValue(0),
'views' => $this->integer()->notNull()->defaultValue(0),
'slug' => $this->string()->notNull(),
], $tableOptions);
$this->createIndex('{{%idx-blog_posts-category_id}}', '{{%blog_posts}}', 'category_id');
$this->createIndex('{{%idx-blog_posts-slug}}', '{{%blog_posts}}', 'slug', true);
$this->addForeignKey('{{%fk-blog_posts-category_id}}', '{{%blog_posts}}', 'category_id', '{{%blog_categories}}', 'id');
}
public function down()
{
$this->dropForeignKey('{{%fk-blog_posts-category_id}}', '{{%blog_posts}}');
$this->dropTable('{{%blog_posts}}');
}
}

28
common/modules/blog/migrations/m180605_193423_create_blog_tags_table.php

@ -1,28 +0,0 @@
<?php
use yii\db\Migration;
/**
* Handles the creation of table `blog_tags`.
*/
class m180605_193423_create_blog_tags_table extends Migration
{
public function up()
{
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
$this->createTable('{{%blog_tags}}', [
'id' => $this->primaryKey(),
'name' => $this->string()->notNull(),
'slug' => $this->string()->notNull(),
], $tableOptions);
$this->createIndex('{{%idx-blog_tags-slug}}', '{{%blog_tags}}', 'slug', true);
}
public function down()
{
$this->dropIndex('{{%idx-blog_tags-slug}}', '{{%blog_tags}}');
$this->dropTable('{{%blog_tags}}');
}
}

36
common/modules/blog/migrations/m180605_193748_create_blog_tag_assignments_table.php

@ -1,36 +0,0 @@
<?php
use yii\db\Migration;
/**
* Handles the creation of table `blog_tag_assignments`.
*/
class m180605_193748_create_blog_tag_assignments_table extends Migration
{
public function up()
{
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE=InnoDB';
$this->createTable('{{%blog_tag_assignments}}', [
'post_id' => $this->integer()->notNull(),
'tag_id' => $this->integer()->notNull(),
], $tableOptions);
$this->addPrimaryKey('{{%pk-blog_tag_assignments}}', '{{%blog_tag_assignments}}', ['post_id', 'tag_id']);
$this->createIndex('{{%idx-blog_tag_assignments-post_id}}', '{{%blog_tag_assignments}}', 'post_id');
$this->createIndex('{{%idx-blog_tag_assignments-tag_id}}', '{{%blog_tag_assignments}}', 'tag_id');
$this->addForeignKey('{{%fk-blog_tag_assignments-post_id}}', '{{%blog_tag_assignments}}', 'post_id', '{{%blog_posts}}', 'id', 'CASCADE', 'RESTRICT');
$this->addForeignKey('{{%fk-blog_tag_assignments-tag_id}}', '{{%blog_tag_assignments}}', 'tag_id', '{{%blog_tags}}', 'id', 'CASCADE', 'RESTRICT');
}
public function down()
{
$this->dropIndex('{{%idx-blog_tag_assignments-tag_id}}', '{{%blog_tag_assignments}}');
$this->dropIndex('{{%idx-blog_tag_assignments-post_id}}', '{{%blog_tag_assignments}}');
$this->dropForeignKey('{{%fk-blog_tag_assignments-tag_id}}', '{{%blog_tag_assignments}}');
$this->dropForeignKey('{{%fk-blog_tag_assignments-post_id}}', '{{%blog_tag_assignments}}');
$this->dropTable('{{%blog_tag_assignments}}');
}
}

43
common/modules/blog/migrations/m180605_194207_create_blog_comments_table.php

@ -1,43 +0,0 @@
<?php
use yii\db\Migration;
/**
* Handles the creation of table `blog_comments`.
*/
class m180605_194207_create_blog_comments_table extends Migration
{
public function up()
{
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
$this->createTable('{{%blog_comments}}', [
'id' => $this->primaryKey(),
'post_id' => $this->integer()->notNull(),
'user_id' => $this->integer()->notNull(),
'parent_id' => $this->integer(),
'created_at' => $this->integer()->unsigned()->notNull(),
'text' => $this->text()->notNull(),
'active' => $this->boolean()->notNull(),
], $tableOptions);
$this->createIndex('{{%idx-blog_comments-post_id}}', '{{%blog_comments}}', 'post_id');
$this->createIndex('{{%idx-blog_comments-user_id}}', '{{%blog_comments}}', 'user_id');
$this->createIndex('{{%idx-blog_comments-parent_id}}', '{{%blog_comments}}', 'parent_id');
$this->addForeignKey('{{%fk-blog_comments-post_id}}', '{{%blog_comments}}', 'post_id', '{{%blog_posts}}', 'id', 'CASCADE');
$this->addForeignKey('{{%fk-blog_comments-user_id}}', '{{%blog_comments}}', 'user_id', '{{%users}}', 'id', 'CASCADE');
$this->addForeignKey('{{%fk-blog_comments-parent_id}}', '{{%blog_comments}}', 'parent_id', '{{%blog_comments}}', 'id', 'CASCADE');
}
public function down()
{
$this->dropForeignKey('{{%fk-blog_comments-parent_id}}', '{{%blog_comments}}');
$this->dropForeignKey('{{%fk-blog_comments-user_id}}', '{{%blog_comments}}');
$this->dropForeignKey('{{%fk-blog_comments-post_id}}', '{{%blog_comments}}');
$this->dropIndex('{{%idx-blog_comments-parent_id}}', '{{%blog_comments}}');
$this->dropIndex('{{%idx-blog_comments-user_id}}', '{{%blog_comments}}');
$this->dropIndex('{{%idx-blog_comments-post_id}}', '{{%blog_comments}}');
$this->dropTable('{{%blog_comments}}');
}
}

33
common/modules/blog/migrations/m180725_091725_add_blog_posts_type_field.php

@ -1,33 +0,0 @@
<?php
use yii\db\Migration;
/**
* Class m180725_091725_add_blog_posts_type_field
*/
class m180725_091725_add_blog_posts_type_field extends Migration
{
/**
* {@inheritdoc}
*/
public function safeUp()
{
$this->addColumn('{{%blog_posts}}', 'type', $this->integer(2)->defaultValue(0)); // 0 - public, 1 - revision, 2 - preview
$this->addColumn('{{%blog_posts}}', 'revision_at', $this->integer()->unsigned());
$this->addColumn('{{%blog_posts}}', 'revision_id', $this->integer());
$this->createIndex('idx_blog_posts_revision_id', '{{%blog_posts}}', 'revision_id');
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->dropIndex('idx_blog_posts_revision_id', '{{%blog_posts}}');
$this->dropColumn('{{%blog_posts}}', 'type');
$this->dropColumn('{{%blog_posts}}', 'revision_at');
$this->dropColumn('{{%blog_posts}}', 'revision_id');
}
}

27
common/modules/blog/migrations/m180725_113503_remove_blog_posts_slug_unique_index.php

@ -1,27 +0,0 @@
<?php
use yii\db\Migration;
/**
* Class m180725_113503_remove_blog_posts_slug_unique_index
*/
class m180725_113503_remove_blog_posts_slug_unique_index extends Migration
{
/**
* {@inheritdoc}
*/
public function safeUp()
{
$this->dropIndex('{{%idx-blog_posts-slug}}', '{{%blog_posts}}');
$this->createIndex('{{%idx-blog_posts-slug}}', '{{%blog_posts}}', 'slug');
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->dropIndex('{{%idx-blog_posts-slug}}', '{{%blog_posts}}');
$this->createIndex('{{%idx-blog_posts-slug}}', '{{%blog_posts}}', 'slug');
}
}

33
common/modules/blog/migrations/m180827_195932_set_blog_unicode_collate.php

@ -1,33 +0,0 @@
<?php
use yii\db\Migration;
/**
* Class m180827_195932_set_blog_unicode_collate
*/
class m180827_195932_set_blog_unicode_collate extends Migration
{
/**
* {@inheritdoc}
*/
public function safeUp()
{
$tables = ['blog_tag_assignments'];
$db = Yii::$app->getDb();
$db->createCommand('SET FOREIGN_KEY_CHECKS=0;')->execute();
foreach ($tables as $table) {
$db->createCommand("ALTER TABLE `$table` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci")->execute();
}
$db->createCommand('SET FOREIGN_KEY_CHECKS=1;')->execute();
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
true;
}
}

54
common/modules/blog/migrations/m180828_190314_create_blog_post_lng_table.php

@ -1,54 +0,0 @@
<?php
use yii\db\Migration;
/**
* Handles the creation of table `blog_post_lng`.
*/
class m180828_190314_create_blog_post_lng_table extends Migration
{
/**
* {@inheritdoc}
*/
public function safeUp()
{
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
$this->createTable('{{%blog_posts_lng}}', [
'id' => $this->primaryKey(),
'blog_post_id' => $this->integer()->notNull(),
'language' => $this->string(6)->notNull(),
'title' => $this->string()->notNull(),
'description' => $this->text(),
'content' => 'MEDIUMTEXT',
'meta_title' => $this->string(255),
'meta_description' => $this->text(),
'meta_keywords' => $this->string(255),
], $tableOptions);
$this->createIndex('idx_blog_posts_lng_language', '{{%blog_posts_lng}}', 'language');
$this->createIndex('idx_blog_posts_lng_blog_post_id', '{{%blog_posts_lng}}', 'blog_post_id');
$this->addForeignKey('frg_blog_posts_lng_blog_posts_blog_post_id_id', '{{%blog_posts_lng}}', 'blog_post_id', '{{%blog_posts}}', 'id', 'CASCADE', 'CASCADE');
$this->dropColumn('{{%blog_posts}}', 'title');
$this->dropColumn('{{%blog_posts}}', 'description');
$this->dropColumn('{{%blog_posts}}', 'content');
$this->dropColumn('{{%blog_posts}}', 'meta_json');
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->addColumn('{{%blog_posts}}', 'title', $this->string(255)->notNull());
$this->addColumn('{{%blog_posts}}', 'description', $this->text());
$this->addColumn('{{%blog_posts}}', 'description', 'MEDIUMTEXT');
$this->addColumn('{{%blog_posts}}', 'meta_json', $this->text());
$this->dropForeignKey('frg_blog_posts_lng_blog_posts_blog_post_id_id', '{{%blog_posts_lng}}');
$this->dropIndex('idx_blog_posts_lng_blog_post_id', '{{%blog_posts_lng}}');
$this->dropIndex('idx_blog_posts_lng_language', '{{%blog_posts_lng}}');
$this->dropTable('{{%blog_posts_lng}}');
}
}

55
common/modules/blog/migrations/m180830_163050_create_blog_categories_lng_table.php

@ -1,55 +0,0 @@
<?php
use yii\db\Migration;
/**
* Handles the creation of table `blog_categories_lng`.
*/
class m180830_163050_create_blog_categories_lng_table extends Migration
{
/**
* {@inheritdoc}
*/
public function safeUp()
{
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
$this->createTable('{{%blog_categories_lng}}', [
'id' => $this->primaryKey(),
'blog_category_id' => $this->integer()->notNull(),
'language' => $this->string(6)->notNull(),
'name' => $this->string()->notNull(),
'title' => $this->string(),
'description' => $this->text(),
'meta_title' => $this->string(255),
'meta_description' => $this->text(),
'meta_keywords' => $this->string(255),
], $tableOptions);
$this->createIndex('idx_blog_categories_lng_language', '{{%blog_categories_lng}}', 'language');
$this->createIndex('idx_blog_categories_lng_blog_category_id', '{{%blog_categories_lng}}', 'blog_category_id');
$this->addForeignKey('frg_blog_categories_lng_blog_categories_blog_category_id_id', '{{%blog_categories_lng}}', 'blog_category_id', '{{%blog_categories}}', 'id', 'CASCADE', 'CASCADE');
$this->dropColumn('{{%blog_categories}}', 'title');
$this->dropColumn('{{%blog_categories}}', 'description');
$this->dropColumn('{{%blog_categories}}', 'name');
$this->dropColumn('{{%blog_categories}}', 'meta_json');
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->dropForeignKey('frg_blog_categories_lng_blog_categories_blog_category_id_id', '{{%blog_categories_lng}}');
$this->dropIndex('idx_blog_categories_lng_blog_category_id', '{{%blog_categories_lng}}');
$this->dropIndex('idx_blog_categories_lng_language', '{{%blog_categories_lng}}');
$this->dropTable('{{%blog_categories_lng}}');
$this->addColumn('{{%blog_categories}}', 'title', $this->string(255));
$this->addColumn('{{%blog_categories}}', 'name', $this->string(255)->notNull());
$this->addColumn('{{%blog_categories}}', 'description', $this->text());
$this->addColumn('{{%blog_categories}}', 'meta_json', 'LONGTEXT NOT NULL');
}
}

31
common/modules/blog/repositories/BlogCategoryRepository.php

@ -1,31 +0,0 @@
<?php
namespace common\modules\blog\repositories;
use common\modules\blog\entities\BlogCategory;
use core\repositories\NotFoundException;
class BlogCategoryRepository
{
public function get($id): BlogCategory
{
if (!$category = BlogCategory::findOne($id)) {
throw new NotFoundException('Category is not found.');
}
return $category;
}
public function save(BlogCategory $category): void
{
if (!$category->save()) {
throw new \RuntimeException('Saving error.');
}
}
public function remove(BlogCategory $category): void
{
if (!$category->delete()) {
throw new \RuntimeException('Removing error.');
}
}
}

36
common/modules/blog/repositories/BlogRepository.php

@ -1,36 +0,0 @@
<?php
namespace common\modules\blog\repositories;
use common\modules\blog\entities\BlogPost;
use core\repositories\NotFoundException;
class BlogRepository
{
public function get($id): BlogPost
{
if (!$post = BlogPost::findOne($id)) {
throw new NotFoundException('Post is not found.');
}
return $post;
}
public function existsByCategory($id): bool
{
return BlogPost::find()->andWhere(['category_id' => $id])->exists();
}
public function save(BlogPost $post): void
{
if (!$post->save()) {
throw new \RuntimeException('Saving error.');
}
}
public function remove(BlogPost $post): void
{
if (!$post->delete()) {
throw new \RuntimeException('Removing error.');
}
}
}

36
common/modules/blog/repositories/BlogTagRepository.php

@ -1,36 +0,0 @@
<?php
namespace common\modules\blog\repositories;
use common\modules\blog\entities\BlogTag;
use core\repositories\NotFoundException;
class BlogTagRepository
{
public function get($id): BlogTag
{
if (!$tag = BlogTag::findOne($id)) {
throw new NotFoundException('Tag is not found.');
}
return $tag;
}
public function findByName($name): ?BlogTag
{
return BlogTag::findOne(['name' => $name]);
}
public function save(BlogTag $tag): void
{
if (!$tag->save()) {
throw new \RuntimeException('Saving error.');
}
}
public function remove(BlogTag $tag): void
{
if (!$tag->delete()) {
throw new \RuntimeException('Removing error.');
}
}
}

23
common/modules/blog/repositories/read/BlogCategoryReadRepository.php

@ -1,23 +0,0 @@
<?php
namespace common\modules\blog\repositories\read;
use common\modules\blog\entities\BlogCategory;
class BlogCategoryReadRepository
{
public function getAll(): array
{
return BlogCategory::find()->orderBy('sort')->all();
}
public function find($id): ?BlogCategory
{
return BlogCategory::findOne($id);
}
public function findBySlug($slug): ?BlogCategory
{
return BlogCategory::find()->andWhere(['slug' => $slug])->one();
}
}

99
common/modules/blog/repositories/read/BlogPostReadRepository.php

@ -1,99 +0,0 @@
<?php
namespace common\modules\blog\repositories\read;
use common\modules\blog\entities\BlogCategory;
use common\modules\blog\entities\BlogPost;
use common\modules\blog\entities\BlogTag;
use yii\data\ActiveDataProvider;
use yii\data\DataProviderInterface;
use yii\db\ActiveQuery;
class BlogPostReadRepository
{
public function count(): int
{
return BlogPost::find()->active()->pubDate()->typePublic()->count();
}
public function getAllByRange($offset, $limit): array
{
return BlogPost::find()->active()->pubDate()->typePublic()->orderBy(['id' => SORT_ASC])->limit($limit)->offset($offset)->all();
}
public function getAll(): DataProviderInterface
{
$query = BlogPost::find()->active()->pubDate()->typePublic()->with('category');
return $this->getProvider($query);
}
public function getAllByCategory(BlogCategory $category): DataProviderInterface
{
$query = BlogPost::find()->active()->pubDate()->typePublic()->andWhere(['category_id' => $category->id])->with('category');
return $this->getProvider($query);
}
public function findNext(int $id): ?BlogPost
{
return BlogPost::find()->active()->pubDate()->typePublic()->andWhere(['>', 'id', $id])->one();
}
public function findPrev(int $id): ?BlogPost
{
return BlogPost::find()->active()->pubDate()->typePublic()->andWhere(['<', 'id', $id])->orderBy(['id' => SORT_DESC])->one();
}
public function getAllByTag(BlogTag $tag): DataProviderInterface
{
$query = BlogPost::find()->alias('p')->active('p')->typePublic('p')->with('category');
$query->joinWith(['blogTagAssignments ta'], false);
$query->andWhere(['ta.tag_id' => $tag->id]);
$query->groupBy('p.id');
return $this->getProvider($query);
}
public function getByTagsId(BlogPost $post, array $tag_ids, int $limit = 15): DataProviderInterface
{
$query = BlogPost::find()->alias('p')->active('p')->typePublic('p')->with('category');
$query->joinWith(['blogTagAssignments ta'], false);
$query->andWhere(['ta.tag_id' => $tag_ids]);
$query->andWhere(['!=', 'p.id', $post->id]);
$query->groupBy('p.id');
$query->limit($limit);
return $this->getProvider($query);
}
public function getLast($limit): array
{
return BlogPost::find()->with('category')->orderBy(['id' => SORT_DESC])->limit($limit)->all();
}
public function getPopular($limit): array
{
return BlogPost::find()->with('category')->orderBy(['comments_count' => SORT_DESC])->limit($limit)->all();
}
public function find($id): ?BlogPost
{
return BlogPost::find()->active()->andWhere(['id' => $id])->one();
}
private function getProvider(ActiveQuery $query): ActiveDataProvider
{
return new ActiveDataProvider([
'query' => $query,
'sort' => ['defaultOrder' => ['created_at' => SORT_DESC]],
]);
}
public function findBySlug($slug): ?BlogPost
{
return BlogPost::find()->andWhere(['slug' => $slug])->one();
}
public function findPreview($id, $language): ?BlogPost
{
return BlogPost::find()->localized($language)->andWhere(['id' => $id])->one();
}
}

18
common/modules/blog/repositories/read/BlogTagReadRepository.php

@ -1,18 +0,0 @@
<?php
namespace common\modules\blog\repositories\read;
use common\modules\blog\entities\BlogTag;
class BlogTagReadRepository
{
public function find($id): ?BlogTag
{
return BlogTag::findOne($id);
}
public function findBySlug($slug): ?BlogTag
{
return BlogTag::find()->andWhere(['slug' => $slug])->one();
}
}

52
common/modules/blog/services/BlogCategoryManageService.php

@ -1,52 +0,0 @@
<?php
namespace common\modules\blog\services;
use common\modules\blog\entities\BlogCategory;
use common\modules\blog\forms\BlogCategoryForm;
use common\modules\blog\repositories\BlogCategoryRepository;
use common\modules\blog\repositories\BlogRepository;
use core\entities\Meta;
class BlogCategoryManageService
{
private $categories;
private $posts;
public function __construct(BlogCategoryRepository $categories, BlogRepository $posts)
{
$this->categories = $categories;
$this->posts = $posts;
}
public function create(BlogCategoryForm $form): BlogCategory
{
$category = BlogCategory::create(
$form,
$form->slug,
$form->sort
);
$this->categories->save($category);
return $category;
}
public function edit($id, BlogCategoryForm $form): void
{
$category = $this->categories->get($id);
$category->edit(
$form,
$form->slug,
$form->sort
);
$this->categories->save($category);
}
public function remove($id): void
{
$category = $this->categories->get($id);
if ($this->posts->existsByCategory($category->id)) {
throw new \DomainException('Unable to remove category with posts.');
}
$this->categories->remove($category);
}
}

37
common/modules/blog/services/BlogCommentManageService.php

@ -1,37 +0,0 @@
<?php
namespace common\modules\blog\services;
use common\modules\blog\forms\BlogCommentEditForm;
use common\modules\blog\repositories\BlogRepository;
class BlogCommentManageService
{
private $posts;
public function __construct(BlogRepository $posts)
{
$this->posts = $posts;
}
public function edit($postId, $id, BlogCommentEditForm $form): void
{
$post = $this->posts->get($postId);
$post->editComment($id, $form->parentId, $form->text);
$this->posts->save($post);
}
public function activate($postId, $id): void
{
$post = $this->posts->get($postId);
$post->activateComment($id);
$this->posts->save($post);
}
public function remove($postId, $id): void
{
$post = $this->posts->get($postId);
$post->removeComment($id);
$this->posts->save($post);
}
}

32
common/modules/blog/services/BlogCommentService.php

@ -1,32 +0,0 @@
<?php
namespace common\modules\blog\services;
use common\modules\blog\entities\BlogComment;
use common\modules\blog\forms\BlogCommentForm;
use common\modules\blog\repositories\BlogRepository;
use core\repositories\user\UserRepository;
class BlogCommentService
{
private $posts;
private $users;
public function __construct(BlogRepository $posts, UserRepository $users)
{
$this->posts = $posts;
$this->users = $users;
}
public function create($postId, $userId, BlogCommentForm $form): BlogComment
{
$post = $this->posts->get($postId);
$user = $this->users->get($userId);
$comment = $post->addComment($user->id, $form->parentId, $form->text);
$this->posts->save($post);
return $comment;
}
}

193
common/modules/blog/services/BlogPostManageService.php

@ -1,193 +0,0 @@
<?php
namespace common\modules\blog\services;
use common\modules\blog\entities\BlogPost;
use common\modules\blog\entities\BlogTag;
use common\modules\blog\forms\BlogPostForm;
use common\modules\blog\helpers\BlogPostHelper;
use common\modules\blog\repositories\BlogCategoryRepository;
use common\modules\blog\repositories\BlogRepository;
use common\modules\blog\repositories\BlogTagRepository;
use core\helpers\VideoHelper;
use core\services\TransactionManager;
use yii\base\Security;
use yii\helpers\Inflector;
class BlogPostManageService
{
private $posts;
private $categories;
private $tags;
private $transaction;
public function __construct(
BlogRepository $posts,
BlogCategoryRepository $categories,
BlogTagRepository $tags,
TransactionManager $transaction
)
{
$this->posts = $posts;
$this->categories = $categories;
$this->tags = $tags;
$this->transaction = $transaction;
}
public function create(BlogPostForm $form, $type = BlogPost::TYPE_PUBLIC): BlogPost
{
$category = $this->categories->get($form->category_id);
$post = BlogPost::create(
$form,
$category->id,
$form->slug,
$form->published_at,
$form->video,
$type
);
$this->transaction->wrap(function () use ($post, $form) {
if (is_array($form->tags->new_tags) && !empty($form->tags->new_tags)) {
foreach ( $form->tags->new_tags as $tag_id => $tag_name ) {
if ( !$tag = $this->tags->findByName( $tag_name ) ) {
$tag = BlogTag::create( $tag_name, Inflector::slug( $tag_name, '_' ) );
$this->tags->save( $tag );
}
$post->assignTag( $tag->id );
}
}
$this->posts->save($post);
if ($form->image) {
$post->setImage($form->image);
}
else if ($form->video) {
$src = VideoHelper::getThumb($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'));
$post->image = $filename;
}
if ($form->status == BlogPost::STATUS_ACTIVE) {
$post->activate();
}
$this->posts->save($post);
});
return $post;
}
public function edit($id, BlogPostForm $form): void
{
$post = $this->posts->get($id);
BlogPostHelper::saveRevision(clone $post);
//$this->saveRevision(clone $post);
//print_r($post->translations); die;
$category = $this->categories->get($form->category_id);
$post->edit(
$form,
$category->id,
$form->slug,
$form->published_at,
$form->video,
$post->type
);
if ($form->image) {
$post->cleanFiles();
$post->setImage($form->image);
}
elseif ($form->video && (!$post->image || $form->reset_image)) {
$post->cleanFiles();
$src = VideoHelper::getThumb($form->video);
$filename = (new Security())->generateRandomString(15) . '.jpg';
copy($src, \Yii::getAlias(BlogPost::FILE_ORIGINAL_PATH . '/' . $post->id . '.jpg'));
$post->image = $filename;
}
elseif ($post->image && $form->reset_image) {
$post->cleanFiles();
$post->image = null;
$post->updateAttributes(['image']);
}
$this->transaction->wrap(function () use ($post, $form) {
$post->revokeTags();
$this->posts->save($post);
if (is_array($form->tags->new_tags) && !empty($form->tags->new_tags)) {
foreach ( $form->tags->new_tags as $tag_id => $tag_name ) {
if ( ! $tag = $this->tags->findByName( $tag_name ) ) {
$tag = BlogTag::create( $tag_name, Inflector::slug( $tag_name, '_' ) );
$this->tags->save( $tag );
}
$post->assignTag( $tag->id );
}
}
$this->posts->save( $post );
});
}
public function activate($id): void
{
$post = $this->posts->get($id);
$post->activate();
$this->posts->save($post);
}
public function draft($id): void
{
$post = $this->posts->get($id);
$post->draft();
$this->posts->save($post);
}
public function remove($id): void
{
$post = $this->posts->get($id);
// Remove revisions
$this->clearHistory($post);
// Remove preview
$this->removePreviews();
$this->posts->remove($post);
}
public function removePreviews(): void
{
$posts = BlogPost::find()->andWhere(['type' => BlogPost::TYPE_PREVIEW])->all();
foreach ($posts as $post) {
$post->delete();
}
}
public function clearHistory(BlogPost $post): void
{
BlogPost::deleteAll(['revision_id' => $post->id]);
}
public function restoreHistory($from_id, $id): int
{
$post = $this->posts->get($id);
$from = $this->posts->get($from_id);
// update revision id
BlogPost::updateAll(['revision_id' => $from->id], ['revision_id' => $post->id]);
$this->posts->remove($post);
$from->revision_id = null;
$from->type = BlogPost::TYPE_PUBLIC;
$this->posts->save($from);
// delete never revisions
BlogPost::deleteAll(['AND', ['revision_id' => $from->id], ['>', 'revision_at', $from->revision_at]]);
return $from->id;
}
}

43
common/modules/blog/services/BlogTagManageService.php

@ -1,43 +0,0 @@
<?php
namespace common\modules\blog\services;
use common\modules\blog\entities\BlogTag;
use common\modules\blog\forms\BlogTagSingleForm;
use common\modules\blog\repositories\BlogTagRepository;
class BlogTagManageService
{
private $tags;
public function __construct(BlogTagRepository $tags)
{
$this->tags = $tags;
}
public function create(BlogTagSingleForm $form): BlogTag
{
$tag = BlogTag::create(
$form->name,
$form->slug
);
$this->tags->save($tag);
return $tag;
}
public function edit($id, BlogTagSingleForm $form): void
{
$tag = $this->tags->get($id);
$tag->edit(
$form->name,
$form->slug
);
$this->tags->save($tag);
}
public function remove($id): void
{
$tag = $this->tags->get($id);
$this->tags->remove($tag);
}
}

92
common/modules/blog/urls/BlogCategoryUrlRule.php

@ -1,92 +0,0 @@
<?php
namespace common\modules\blog\urls;
use yii\caching\TagDependency;
use common\modules\blog\repositories\read\BlogCategoryReadRepository;
use yii\base\BaseObject;
use core\helpers\LanguageHelper;
use yii\caching\Cache;
use yii\web\UrlNormalizerRedirectException;
use yii\web\UrlRuleInterface;
class BlogCategoryUrlRule extends BaseObject implements UrlRuleInterface
{
public $prefix = 'blog/category';
private $repository;
private $cache;
public function __construct(BlogCategoryReadRepository $repository, Cache $cache, $config = [])
{
parent::__construct($config);
$this->repository = $repository;
$this->cache = $cache;
}
public function parseRequest($manager, $request)
{
$uri = ltrim(LanguageHelper::processLangInUrl($request->pathInfo), '/');
if (preg_match('#^' . $this->prefix . '/(.*[a-z])$#is', $uri, $matches)) {
$path = $matches['1'];
$result = $this->cache->getOrSet( [ 'blog_category_route', 'path' => $path ], function () use ( $path ) {
if ( ! $post = $this->repository->findBySlug( $this->getPathSlug( $path ) ) ) {
return [ 'id' => null, 'path' => null ];
}
return [ 'id' => $post->id, 'path' => $post->slug ];
}, null, new TagDependency(['tags' => ['blog']]) );
if ( empty( $result['id'] ) ) {
return false;
}
if ( $path != $result['path'] ) {
throw new UrlNormalizerRedirectException( [
'blog/post/category',
'id' => $result['id'],
], 301 );
}
return [ 'blog/post/category', [ 'id' => $result['id'] ] ];
}
return false;
}
public function createUrl($manager, $route, $params)
{
if ($route == 'blog/post/category') {
if (empty($params['id'])) {
throw new \InvalidArgumentException('Empty id.');
}
$id = $params['id'];
$url = $this->cache->getOrSet(['blog_category_route', 'id' => $id], function () use ($id) {
if (!$post = $this->repository->find($id)) {
return null;
}
return $post->slug;
//return $this->getPagePath($post);
}, null, new TagDependency(['tags' => ['blog']]));
if (!$url) {
throw new \InvalidArgumentException('Undefined id.');
}
$url = $this->prefix . '/' . $url;
unset($params['id']);
if (!empty($params) && ($query = http_build_query($params)) !== '') {
$url .= '?' . $query;
}
//return $url;
return LanguageHelper::addLangToUrl($url, isset($params['language']) ? $params['language'] : null);
}
return false;
}
private function getPathSlug($path): string
{
$chunks = explode('/', $path);
return end($chunks);
}
}

90
common/modules/blog/urls/BlogMainUrlRule.php

@ -1,90 +0,0 @@
<?php
namespace common\modules\blog\urls;
use common\modules\blog\repositories\read\BlogPostReadRepository;
use yii\base\BaseObject;
use yii\caching\Cache;
use yii\caching\TagDependency;
use yii\web\UrlNormalizerRedirectException;
use yii\web\UrlRuleInterface;
use InvalidArgumentException;
use core\helpers\LanguageHelper;
class BlogMainUrlRule extends BaseObject implements UrlRuleInterface
{
public $prefix = 'blog/post';
private $repository;
private $cache;
public function __construct(BlogPostReadRepository $repository, Cache $cache, $config = [])
{
parent::__construct($config);
$this->repository = $repository;
$this->cache = $cache;
}
public function parseRequest($manager, $request)
{
$uri = ltrim(LanguageHelper::processLangInUrl($request->pathInfo), '/');
if (preg_match('#^' . $this->prefix . '/(.*[a-z])$#is', $uri, $matches)) {
$path = $matches['1'];
$result = $this->cache->getOrSet( [ 'blog_main_route', 'path' => $path ], function () use ( $path ) {
if ( ! $post = $this->repository->findBySlug($this->getPathSlug( $path ) ) ) {
return [ 'id' => null, 'path' => null ];
}
return [ 'id' => $post->id, 'path' => $post->slug ];
}, null, new TagDependency(['tags' => ['blog']]) );
if ( empty( $result['id'] ) ) {
return false;
}
if ( $path != $result['path'] ) {
throw new UrlNormalizerRedirectException( [ 'blog/post/post', 'id' => $result['id'] ], 301 );
}
return ['blog/post/post', ['id' => $result['id']]];
}
return false;
}
public function createUrl($manager, $route, $params)
{
if ($route == 'blog/post/post') {
if (empty($params['id'])) {
throw new InvalidArgumentException('Empty id.');
}
$id = $params['id'];
$url = $this->cache->getOrSet(['post_main_route', 'id' => $id], function () use ($id) {
if (!$post = $this->repository->find($id)) {
return null;
}
return $post->slug;
}, null, new TagDependency(['tags' => ['blog']]));
if (!$url) {
return '#';
//throw new InvalidArgumentException('Undefined id.');
}
$url = $this->prefix . '/' . $url;
unset($params['id']);
if (!empty($params) && ($query = http_build_query($params)) !== '') {
$url .= '?' . $query;
}
//return $url;
return LanguageHelper::addLangToUrl($url, isset($params['language']) ? $params['language'] : null);
}
return false;
}
private function getPathSlug($path): string
{
$chunks = explode('/', $path);
return end($chunks);
}
}

91
common/modules/blog/urls/BlogTagUrlRule.php

@ -1,91 +0,0 @@
<?php
namespace common\modules\blog\urls;
use yii\caching\TagDependency;
use common\modules\blog\repositories\read\BlogTagReadRepository;
use yii\base\BaseObject;
use yii\base\InvalidParamException;
use yii\caching\Cache;
use yii\web\UrlNormalizerRedirectException;
use yii\web\UrlRuleInterface;
class BlogTagUrlRule extends BaseObject implements UrlRuleInterface
{
public $prefix = 'blog/tag';
private $repository;
private $cache;
public function __construct(BlogTagReadRepository $repository, Cache $cache, $config = [])
{
parent::__construct($config);
$this->repository = $repository;
$this->cache = $cache;
}
public function parseRequest($manager, $request)
{
if (preg_match('#^' . $this->prefix . '/(.*[a-z])$#is', $request->pathInfo, $matches)) {
$path = $matches['1'];
$result = $this->cache->getOrSet( [ 'blog_tag_route', 'path' => $path ], function () use ( $path ) {
if ( ! $post = $this->repository->findBySlug( $this->getPathSlug( $path ) ) ) {
return [ 'id' => null, 'path' => null ];
}
return [ 'id' => $post->id, 'path' => $post->slug ];
}, null, new TagDependency(['tags' => ['blog']]) );
if ( empty( $result['id'] ) ) {
return false;
}
if ( $path != $result['path'] ) {
throw new UrlNormalizerRedirectException( [
'blog/post/tag',
'id' => $result['id'],
], 301 );
}
return [ 'blog/post/tag', [ 'id' => $result['id'] ] ];
}
return false;
}
public function createUrl($manager, $route, $params)
{
if ($route == 'blog/post/tag') {
if (empty($params['id'])) {
throw new \InvalidArgumentException('Empty id.');
}
$id = $params['id'];
$url = $this->cache->getOrSet(['blog_tag_route', 'id' => $id], function () use ($id) {
if (!$post = $this->repository->find($id)) {
return null;
}
return $post->slug;
//return $this->getPagePath($post);
}, null, new TagDependency(['tags' => ['blog']]));
if (!$url) {
throw new \InvalidArgumentException('Undefined id.');
}
$url = $this->prefix . '/' . $url;
unset($params['id']);
if (!empty($params) && ($query = http_build_query($params)) !== '') {
$url .= '?' . $query;
}
return $url;
}
return false;
}
private function getPathSlug($path): string
{
$chunks = explode('/', $path);
return end($chunks);
}
}

73
common/modules/blog/views/manage/category/_form.php

@ -1,73 +0,0 @@
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $model \common\modules\blog\forms\BlogCategoryForm */
/* @var $form yii\widgets\ActiveForm */
$js2 = '
$(".hint-block").each(function () {
var $hint = $(this);
var label = $hint.parent().find("label");
label.html(label.html() + \' <i style="color:#3c8dbc" class="fa fa-question-circle" aria-hidden="true"></i>\');
label.addClass("help").popover({
html: true,
trigger: "hover",
placement: "bottom",
content: $hint.html()
});
$(this).hide();
});
';
$this->registerJs($js2);
?>
<div class="category-form">
<?php $form = ActiveForm::begin(); ?>
<div class="box box-default">
<div class="box-header with-border"><?= Yii::t('blog', 'Common') ?></div>
<div class="box-body">
<div class="row">
<div class="col-md-2">
<?= $form->field($model, 'sort')->textInput(['maxlength' => true]) ?>
</div>
<div class="col-md-10">
<?= $form->field($model, 'slug')->textInput(['maxlength' => true]) ?>
</div>
</div>
<?php
$items = [];
foreach (Yii::$app->params['translatedLanguages'] as $language => $language_name) {
$items[] = [
'label' => $language_name,
'content' => $this->render('_form_tab', [
'form' => $form,
'model' => $model,
'language' => $language,
]),
];
}
?>
<div class="nav-tabs-custom">
<?= \yii\bootstrap\Tabs::widget([
'items' => $items
]) ?>
</div>
</div>
</div>
<div class="form-group">
<?= Html::submitButton(Yii::t('buttons','Save'), ['class' => 'btn btn-success']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>

35
common/modules/blog/views/manage/category/_form_tab.php

@ -1,35 +0,0 @@
<?php
/**
* Created by Error202
* Date: 28.08.2018
*/
use zertex\ckeditor\CKEditor;
/**
* @var $this \yii\web\View
* @var $form \yii\widgets\ActiveForm
* @var $model \common\modules\blog\forms\BlogPostForm
* @var $language string
*/
$postfix = $language == Yii::$app->params['defaultLanguage'] ? '' : '_' . $language;
?>
<div class="box box-default">
<div class="box-body">
<?= $form->field($model, 'name' . $postfix)->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'title' . $postfix)->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'description' . $postfix)->widget(CKEditor::class) ?>
</div>
</div>
<div class="box box-default">
<div class="box-header with-border"><?= Yii::t('blog', 'SEO') ?></div>
<div class="box-body">
<?= $form->field($model, 'meta_title' . $postfix)->textInput() ?>
<?= $form->field($model, 'meta_description' . $postfix)->textarea(['rows' => 2]) ?>
<?= $form->field($model, 'meta_keywords' . $postfix)->textInput() ?>
</div>
</div>

77
common/modules/blog/views/manage/category/_view_tab.php

@ -1,77 +0,0 @@
<?php
/**
* Created by Error202
* Date: 25.08.2018
*/
use yii\widgets\DetailView;
use common\modules\blog\entities\BlogCategory;
/**
* @var $this \yii\web\View
* @var $category BlogCategory
* @var $language string
*/
?>
<?= DetailView::widget([
'model' => $category,
'attributes' => [
[
'label' => Yii::t('blog', 'Name'),
'value' => function(BlogCategory $entity) use ($language) {
return $entity->findTranslation($language)->name;
}
],
[
'label' => Yii::t('blog', 'Title'),
'value' => function(BlogCategory $entity) use ($language) {
return $entity->findTranslation($language)->title;
}
],
],
]) ?>
<div class="box">
<div class="box-header with-border"><?= Yii::t('blog', 'SEO') ?></div>
<div class="box-body">
<?= DetailView::widget([
'model' => $category,
'attributes' => [
[
'label' => Yii::t('blog', 'META Title'),
'value' => function(BlogCategory $entity) use ($language) {
return $entity->findTranslation($language)->meta_title;
}
],
[
'label' => Yii::t('blog', 'META Description'),
'value' => function(BlogCategory $entity) use ($language) {
return $entity->findTranslation($language)->meta_description;
}
],
[
'label' => Yii::t('blog', 'META Keywords'),
'value' => function(BlogCategory $entity) use ($language) {
return $entity->findTranslation($language)->meta_keywords;
}
],
],
]) ?>
</div>
</div>
<div class="box">
<div class="box-header with-border"><?= Yii::t('blog', 'Description') ?></div>
<div class="box-body">
<?= Yii::$app->formatter->asHtml($category->findTranslation($language)->description, [
'Attr.AllowedRel' => array('nofollow'),
'HTML.SafeObject' => true,
'Output.FlashCompat' => true,
'HTML.SafeIframe' => true,
'URI.SafeIframeRegexp'=>'%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/)%',
]) ?>
</div>
</div>

17
common/modules/blog/views/manage/category/create.php

@ -1,17 +0,0 @@
<?php
/* @var $this yii\web\View */
/* @var $model \common\modules\blog\forms\BlogCategoryForm */
$title = Yii::t('blog', 'Create Category');
$this->title = $title;
$this->params['breadcrumbs'][] = ['label' => Yii::t('blog', 'Categories'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $title;
?>
<div class="category-create">
<?= $this->render('_form', [
'model' => $model,
]) ?>
</div>

59
common/modules/blog/views/manage/category/index.php

@ -1,59 +0,0 @@
<?php
use common\modules\blog\entities\BlogCategory;
use yii\grid\ActionColumn;
use yii\helpers\Html;
use yii\grid\GridView;
/* @var $this yii\web\View */
/* @var $searchModel \common\modules\blog\forms\search\BlogCategorySearch */
/* @var $dataProvider yii\data\ActiveDataProvider */
$title = Yii::t('blog', 'Categories');
$this->title = $title;
$this->params['breadcrumbs'][] = $title;
?>
<div class="blog-category-index">
<p>
<?= Html::a(Yii::t('blog', 'Create Category'), ['create'], ['class' => 'btn btn-success']) ?>
</p>
<div class="box">
<div class="box-body">
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
[
'attribute' => 'sort',
'options' => ['style' => 'width: 100px;'],
],
[
'attribute' => 'name',
'value' => function (BlogCategory $model) {
return Html::a(Html::encode($model->translation->name), ['view', 'id' => $model->id]);
},
'format' => 'raw',
],
[
'attribute' => 'slug',
],
[
'attribute' => 'title',
'value' => function (BlogCategory $model) {
$title = isset($model->findTranslation(Yii::$app->language)->title) ? $model->findTranslation(Yii::$app->language)->title : $model->findTranslation(Yii::$app->params['defaultLanguage'])->title;
return Html::a(Html::encode($title), ['view', 'id' => $model->id]);
},
'format' => 'raw',
],
[
'class' => ActionColumn::class,
'options' => ['style' => 'width: 100px;'],
'contentOptions' => ['class' => 'text-center'],
],
],
]); ?>
</div>
</div>
</div>

19
common/modules/blog/views/manage/category/update.php

@ -1,19 +0,0 @@
<?php
/* @var $this yii\web\View */
/* @var $category \common\modules\blog\entities\BlogCategory */
/* @var $model \common\modules\blog\forms\BlogCategoryForm */
$title = Yii::t('blog', 'Update: {name}', ['name' => $category->translation->name]);
$this->title = $title;
$this->params['breadcrumbs'][] = ['label' => Yii::t('blog', 'Categories'), 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => $category->translation->name, 'url' => ['view', 'id' => $category->id]];
$this->params['breadcrumbs'][] = Yii::t('buttons', 'Editing');
?>
<div class="category-update">
<?= $this->render('_form', [
'model' => $model,
]) ?>
</div>

69
common/modules/blog/views/manage/category/view.php

@ -1,69 +0,0 @@
<?php
use yii\helpers\Html;
use yii\widgets\DetailView;
/* @var $this yii\web\View */
/* @var $category \common\modules\blog\entities\BlogCategory */
$title = $category->translation->name;
$this->title = $title;
$this->params['breadcrumbs'][] = ['label' => Yii::t('blog', 'Categories'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $title;
$css = <<<CSS
.detail-view th {
width: 25%;
}
CSS;
$this->registerCss($css);
?>
<div class="blog-category-view">
<p>
<?= Html::a(Yii::t('blog', 'Categories'), ['index'], ['class' => 'btn btn-default']) ?>
<?= Html::a(Yii::t('buttons', 'Edit'), ['update', 'id' => $category->id], ['class' => 'btn btn-primary']) ?>
<?= Html::a(Yii::t('buttons', 'Delete'), ['delete', 'id' => $category->id], [
'class' => 'btn btn-danger',
'data' => [
'confirm' => Yii::t('buttons', 'Are you sure you want to delete this item?'),
'method' => 'post',
],
]) ?>
</p>
<div class="box">
<div class="box-header with-border"><?= Yii::t('blog', 'Common') ?></div>
<div class="box-body">
<?= DetailView::widget([
'model' => $category,
'attributes' => [
'id',
'slug',
'sort',
],
]) ?>
</div>
</div>
<?php
$items = [];
foreach (Yii::$app->params['translatedLanguages'] as $language => $language_name) {
$items[] = [
'label' => $language_name,
'content' => $this->render('_view_tab', [
'category' => $category,
'language' => $language,
]),
];
}
?>
<div class="nav-tabs-custom">
<?= \yii\bootstrap\Tabs::widget([
'items' => $items,
]) ?>
</div>
</div>

54
common/modules/blog/views/manage/comment/index.php

@ -1,54 +0,0 @@
<?php
use common\modules\blog\entities\BlogComment;
use yii\grid\ActionColumn;
use yii\grid\GridView;
use yii\helpers\StringHelper;
/* @var $this yii\web\View */
/* @var $searchModel \common\modules\blog\forms\search\BlogCommentSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */
$this->title = Yii::t('blog', 'Comments');
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="blog-comments-index">
<div class="box">
<div class="box-body">
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
[
'attribute' => 'id',
'options' => ['style' => 'width: 40px;'],
'contentOptions' => ['class' => 'text-center'],
],
[
'attribute' => 'text',
'value' => function (BlogComment $model) {
return StringHelper::truncate(strip_tags($model->text), 100);
},
],
[
'attribute' => 'created_at',
'format' => ['datetime', 'php:d.m.Y H:i'],
'options' => ['style' => 'width: 60px;'],
'contentOptions' => ['class' => 'text-center'],
],
[
'attribute' => 'active',
'filter' => $searchModel->activeList(),
'format' => 'boolean',
'contentOptions' => ['style' => 'width: 150px'],
],
[
'class' => ActionColumn::class,
'options' => ['style' => 'width: 100px;'],
'contentOptions' => ['class' => 'text-center'],
],
],
]); ?>
</div>
</div>
</div>

34
common/modules/blog/views/manage/comment/update.php

@ -1,34 +0,0 @@
<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
/* @var $this yii\web\View */
/* @var $post \common\modules\blog\entities\BlogPost */
/* @var $model \common\modules\blog\forms\BlogCommentEditForm */
$this->title = Yii::t('blog', 'Update Post Comment: {name}', ['name' => $post->title]);
$this->params['breadcrumbs'][] = ['label' => Yii::t('blog', 'Comment'), 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => $post->title, 'url' => ['view', 'id' => $post->id]];
$this->params['breadcrumbs'][] = Yii::t('buttons', 'Editing');
?>
<div class="post-update">
<?php $form = ActiveForm::begin([
'options' => ['enctype'=>'multipart/form-data']
]); ?>
<div class="box box-default">
<div class="box-header with-border"><?= Yii::t('blog', 'Common') ?></div>
<div class="box-body">
<?= $form->field($model, 'parentId')->textInput() ?>
<?= $form->field($model, 'text')->textarea(['rows' => 20]) ?>
</div>
</div>
<div class="form-group">
<?= Html::submitButton(Yii::t('buttons', 'Save'), ['class' => 'btn btn-success']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>

71
common/modules/blog/views/manage/comment/view.php

@ -1,71 +0,0 @@
<?php
use yii\helpers\Html;
use yii\widgets\DetailView;
use core\entities\user\User;
use common\modules\blog\entities\BlogComment;
/* @var $this yii\web\View */
/* @var $post \common\modules\blog\entities\BlogPost */
/* @var $comment BlogComment */
/* @var $modificationsProvider yii\data\ActiveDataProvider */
$this->title = $post->title;
$this->params['breadcrumbs'][] = ['label' => Yii::t('blog', 'Comments'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="user-view">
<p>
<?= Html::a(Yii::t('blog', 'Comments'), ['index'], ['class' => 'btn btn-default']) ?>
<?= Html::a(Yii::t('buttons', 'Edit'), ['update', 'post_id' => $post->id, 'id' => $comment->id], ['class' => 'btn btn-primary']) ?>
<?php if ($comment->isActive()): ?>
<?= Html::a(Yii::t('buttons', 'Delete'), ['delete', 'post_id' => $post->id, 'id' => $comment->id], [
'class' => 'btn btn-danger',
'data' => [
'confirm' => Yii::t('buttons', 'Are you sure you want to delete this item?'),
'method' => 'post',
],
]) ?>
<?php else: ?>
<?= Html::a(Yii::t('buttons', 'Restore'), ['activate', 'post_id' => $post->id, 'id' => $comment->id], [
'class' => 'btn btn-success',
'data' => [
'confirm' => Yii::t('buttons', 'Are you sure you want to activate this item?'),
'method' => 'post',
],
]) ?>
<?php endif; ?>
</p>
<div class="box">
<div class="box-body">
<?= DetailView::widget([
'model' => $comment,
'attributes' => [
'id',
'created_at:boolean',
'active:boolean',
[
'attribute' => 'user_id',
'value' => function(BlogComment $comment) {
return User::findOne($comment->user_id)->username;
},
],
'parent_id',
[
'attribute' => 'post_id',
'value' => $post->title,
],
],
]) ?>
</div>
</div>
<div class="box">
<div class="box-body">
<?= Yii::$app->formatter->asNtext($comment->text) ?>
</div>
</div>
</div>

222
common/modules/blog/views/manage/post/_form.php

@ -1,222 +0,0 @@
<?php
use kartik\file\FileInput;
use yii\helpers\Html;
use kartik\form\ActiveForm;
use yii\web\JsExpression;
use yii\helpers\Url;
use yii\helpers\Json;
use yii\helpers\ArrayHelper;
use kartik\widgets\DateTimePicker;
use kartik\widgets\Select2;
use common\modules\blog\helpers\BlogPostHelper;
/* @var $this yii\web\View */
/* @var $model \common\modules\blog\forms\BlogPostForm */
/* @var $form yii\widgets\ActiveForm */
$fetchUrl = Url::to( [ 'tag-search' ] );
if (isset($model->_post)) {
$tagsJson = Json::encode( Json::encode( ArrayHelper::map( $model->_post->tags, 'id', 'name' ) ) );
$js = <<<JS
var arr = {$tagsJson};
$.each(JSON.parse(arr), function( key, value ) {
$("#posttagform-new_tags").append("<option value='"+value+"' selected>"+value+"</option>");
});
$('#posttagform-new_tags').trigger('change');
JS;
$this->registerJs( $js, $this::POS_READY );
}
$js2 = '
$(".hint-block").each(function () {
var $hint = $(this);
var label = $hint.parent().find("label");
label.html(label.html() + \' <i style="color:#3c8dbc" class="fa fa-question-circle" aria-hidden="true"></i>\');
label.addClass("help").popover({
html: true,
trigger: "hover",
placement: "bottom",
content: $hint.html()
});
$(this).hide();
});
';
$this->registerJs($js2);
?>
<div class="post-form">
<?php $form = ActiveForm::begin([
'options' => ['enctype'=>'multipart/form-data']
]); ?>
<div class="row">
<div class="col-md-10">
<div class="row">
<div class="col-md-6">
<div class="box box-default">
<div class="box-body">
<?= $form->field($model, 'category_id')->dropDownList($model->categoriesList()) ?>
</div>
</div>
</div>
<div class="col-md-6">
<div class="box box-default">
<div class="box-body">
<?= $form->field($model->tags, 'new_tags')->widget(Select2::class, [
'options' => [
'placeholder' => Yii::t('blog','Set tags...'),
'multiple' => true,
],
'pluginOptions' => [
'tags' => true,
'tokenSeparators' => [',', ' '],
'maximumInputLength' => 12,
'ajax' => [
'url' => $fetchUrl,
'dataType' => 'json',
'data' => new JsExpression('function(params) { return {q:params.term}; }')
],
'escapeMarkup' => new JsExpression('function (markup) { return markup; }'),
'templateResult' => new JsExpression('function(tag) { return tag.text; }'),
'templateSelection' => new JsExpression('function (tag) { return tag.text; }'),
],
])->label(Yii::t('blog', 'Tags')); ?>
</div>
</div>
</div>
</div>
<div class="box box-default">
<div class="box-body">
<!-- < ?= $form->field($model, 'title')->textInput(['maxlength' => true]) ?> -->
<?= $form->field($model, 'slug')->textInput(['maxlength' => true]) ?>
<!-- < ?= $form->field($model, 'description')->textarea(['rows' => 5]) ?>
< ?= $form->field($model, 'content')->widget(CKEditor::class) ?> -->
</div>
</div>
<?php
$items = [];
foreach (Yii::$app->params['translatedLanguages'] as $language => $language_name) {
$items[] = [
'label' => $language_name,
'content' => $this->render('_form_tab', [
'form' => $form,
'model' => $model,
'language' => $language,
]),
];
}
?>
<div class="nav-tabs-custom">
<?= \yii\bootstrap\Tabs::widget([
'items' => $items
]) ?>
</div>
<div class="box box-default">
<div class="box-body">
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="#field_image"><?= Yii::t('blog', 'Image') ?></a></li>
<li><a data-toggle="tab" href="#field_video"><?= Yii::t('blog', 'Video') ?></a></li>
</ul>
<div class="tab-content">
<div id="field_image" class="tab-pane fade in active" style="padding-top: 20px;">
<?= $form->field($model, 'image')->label(false)->widget(FileInput::class, [
'options' => [
'accept' => 'image/*',
],
'pluginOptions' => [
'showUpload' => false,
],
]) ?>
<?php if (isset($model->_post) && $model->_post->image): ?>
<?= Html::img($model->_post->getThumbFileUrl('image', 'thumb_gallery_view'), [
'class' => 'thumbnail',
'width' => 300,
]) ?>
<?= $form->field($model, 'reset_image')->checkbox() ?>
<?php endif; ?>
</div>
<div id="field_video" class="tab-pane fade" style="padding-top: 20px;">
<?= $form->field($model, 'video')->textInput()->label(Yii::t('blog', 'Video URL'))->hint(Yii::t('blog', 'If a video link is specified, the image will be used as a preview image')) ?>
</div>
</div>
</div>
</div>
<div class="form-group">
<?= Html::submitButton(Yii::t('buttons', 'Save'), [
'class' => 'btn btn-success',
'value'=>'save',
'name'=>'submit_save',
'formaction' => Yii::$app->request->getUrl(),
'formtarget' => '_self',
]) ?>
</div>
</div>
<div class="col-md-2">
<div class="box box-default">
<div class="box-header with-border"><?= Yii::t('blog', 'Publish') ?></div>
<div class="box-body">
<div class="btn-group">
<button type="button" class="btn btn-info"><?= Yii::t('blog', 'Preview on site') ?></button>
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown">
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu" role="menu">
<?php foreach (Yii::$app->params['translatedLanguages'] as $language => $language_name): ?>
<li>
<?= Html::submitButton($language_name, [
'class' => 'btn btn-block btn-flat bg-white',
'value'=>'preview',
'name'=>'submit_preview',
'formaction' => \yii\helpers\Url::to(['/blog/manage/post/create-preview', 'language' => $language == Yii::$app->params['defaultLanguage'] ? '' : $language]),
'formtarget' => '_blank',
'style' => 'border:0; background-color:#ffffff;',
]) ?>
</li>
<?php endforeach; ?>
</ul>
</div>
<hr>
<?= $form->field($model, 'status')->radioList(BlogPostHelper::statusList()) ?>
<hr>
<?= $form->field($model, 'published_at')->widget(DateTimePicker::class, [
'options' => [],
'removeButton' => false,
'pluginOptions' => [
'autoclose' => true,
'format' => 'dd.mm.yyyy hh:ii:ss',
]
])->label(Yii::t('blog', 'Publish Date')); ?>
</div>
</div>
</div>
</div>
<?php ActiveForm::end(); ?>
</div>

35
common/modules/blog/views/manage/post/_form_tab.php

@ -1,35 +0,0 @@
<?php
/**
* Created by Error202
* Date: 28.08.2018
*/
use zertex\ckeditor\CKEditor;
/**
* @var $this \yii\web\View
* @var $form \yii\widgets\ActiveForm
* @var $model \common\modules\blog\forms\BlogPostForm
* @var $language string
*/
$postfix = $language == Yii::$app->params['defaultLanguage'] ? '' : '_' . $language;
?>
<div class="box box-default">
<div class="box-body">
<?= $form->field($model, 'title' . $postfix)->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'description' . $postfix)->textarea(['rows' => 5]) ?>
<?= $form->field($model, 'content' . $postfix)->widget(CKEditor::class) ?>
</div>
</div>
<div class="box box-default">
<div class="box-header with-border"><?= Yii::t('blog', 'SEO') ?></div>
<div class="box-body">
<?= $form->field($model, 'meta_title' . $postfix)->textInput() ?>
<?= $form->field($model, 'meta_description' . $postfix)->textarea(['rows' => 2]) ?>
<?= $form->field($model, 'meta_keywords' . $postfix)->textInput() ?>
</div>
</div>

78
common/modules/blog/views/manage/post/_view_tab.php

@ -1,78 +0,0 @@
<?php
/**
* Created by Error202
* Date: 25.08.2018
*/
use yii\widgets\DetailView;
use common\modules\blog\entities\BlogPost;
/**
* @var $this \yii\web\View
* @var $post \common\modules\blog\entities\BlogPost
* @var $language string
*/
?>
<?= DetailView::widget([
'model' => $post,
'attributes' => [
[
'label' => Yii::t('blog', 'Title'),
'value' => function(BlogPost $entity) use ($language) {
return $entity->findTranslation($language)->title;
}
],
],
]) ?>
<div class="box">
<div class="box-header with-border"><?= Yii::t('blog', 'SEO') ?></div>
<div class="box-body">
<?= DetailView::widget([
'model' => $post,
'attributes' => [
[
'label' => Yii::t('blog', 'META Title'),
'value' => function(BlogPost $entity) use ($language) {
return $entity->findTranslation($language)->meta_title;
}
],
[
'label' => Yii::t('blog', 'META Description'),
'value' => function(BlogPost $entity) use ($language) {
return $entity->findTranslation($language)->meta_description;
}
],
[
'label' => Yii::t('blog', 'META Keywords'),
'value' => function(BlogPost $entity) use ($language) {
return $entity->findTranslation($language)->meta_keywords;
}
],
],
]) ?>
</div>
</div>
<div class="box">
<div class="box-header with-border"><?= Yii::t('blog', 'Description') ?></div>
<div class="box-body">
<?= Yii::$app->formatter->asNtext($post->findTranslation($language)->description) ?>
</div>
</div>
<div class="box">
<div class="box-header with-border"><?= Yii::t('blog', 'Content') ?></div>
<div class="box-body">
<?= Yii::$app->formatter->asHtml($post->findTranslation($language)->content, [
'Attr.AllowedRel' => array('nofollow'),
'HTML.SafeObject' => true,
'Output.FlashCompat' => true,
'HTML.SafeIframe' => true,
'URI.SafeIframeRegexp'=>'%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/)%',
]) ?>
</div>
</div>

17
common/modules/blog/views/manage/post/create.php

@ -1,17 +0,0 @@
<?php
/* @var $this yii\web\View */
/* @var $model \common\modules\blog\forms\BlogPostForm */
$title = Yii::t('blog', 'Create Post');
$this->title = $title;
$this->params['breadcrumbs'][] = ['label' => Yii::t('blog', 'Posts'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $title;
?>
<div class="post-create">
<?= $this->render('_form', [
'model' => $model,
]) ?>
</div>

80
common/modules/blog/views/manage/post/index.php

@ -1,80 +0,0 @@
<?php
use common\modules\blog\entities\BlogPost;
use common\modules\blog\helpers\BlogPostHelper;
use yii\helpers\Html;
use yii\grid\ActionColumn;
use yii\grid\GridView;
/* @var $this yii\web\View */
/* @var $searchModel \common\modules\blog\forms\search\BlogPostSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */
$title = Yii::t('blog', 'All Posts');
$this->title = $title;
$this->params['breadcrumbs'][] = $title;
?>
<div class="blog-post-index">
<p>
<?= Html::a(Yii::t('blog', 'Create Post'), ['create'], ['class' => 'btn btn-success']) ?>
</p>
<div class="box">
<div class="box-body">
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
[
'attribute' => 'id',
'options' => ['style' => 'width: 40px;'],
'contentOptions' => ['class' => 'text-center'],
],
[
'attribute' => 'title',
'value' => function (BlogPost $model) {
$title = isset($model->translation->title) ? $model->findTranslation(Yii::$app->language)->title : $model->findTranslation(Yii::$app->params['defaultLanguage'])->title;
return Html::a(Html::encode($title), ['view', 'id' => $model->id]);
},
'format' => 'raw',
],
[
'attribute' => 'category_id',
'filter' => $searchModel->categoriesList(),
'value' => function (BlogPost $model) {
return $model->category->translation->name;
},
],
[
'attribute' => 'published_at',
'format' => ['datetime', 'php:d.m.Y H:i'],
'options' => ['style' => 'width: 60px;'],
'contentOptions' => ['class' => 'text-center'],
],
[
'attribute' => 'status',
'filter' => $searchModel->statusList(),
'value' => function (BlogPost $model) {
return BlogPostHelper::statusLabel($model->status);
},
'format' => 'raw',
'options' => ['style' => 'width: 120px;'],
'contentOptions' => ['class' => 'text-center'],
],
[
'class' => ActionColumn::class,
/*'urlCreator' => function($action, BlogPost $model, $key, $index, $column) {
$params = is_array($key) ? $key : ['id' => (string) $key];
$params[0] = $column->controller ? $column->controller . '/' . $action : $action;
return Url::toRoute($params);
},*/
'options' => ['style' => 'width: 100px;'],
'contentOptions' => ['class' => 'text-center'],
],
],
]); ?>
</div>
</div>
</div>

21
common/modules/blog/views/manage/post/update.php

@ -1,21 +0,0 @@
<?php
/* @var $this yii\web\View */
/* @var $post \common\modules\blog\entities\BlogPost */
/* @var $model \common\modules\blog\forms\BlogPostForm */
use yii\helpers\StringHelper;
$title = Yii::t('blog', 'Update Post: {name}', ['name' => StringHelper::truncateWords($post->translation->title, 6, '...')]);
$this->title = $title;
$this->params['breadcrumbs'][] = ['label' => Yii::t('blog', 'Posts'), 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => StringHelper::truncateWords($post->translation->title, 4, '...'), 'url' => ['view', 'id' => $post->id]];
$this->params['breadcrumbs'][] = Yii::t('buttons', 'Editing');
?>
<div class="post-update">
<?= $this->render('_form', [
'model' => $model,
]) ?>
</div>

183
common/modules/blog/views/manage/post/view.php

@ -1,183 +0,0 @@
<?php
use common\modules\blog\helpers\BlogPostHelper;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use yii\widgets\DetailView;
/* @var $this yii\web\View */
/* @var $post \common\modules\blog\entities\BlogPost */
/* @var $modificationsProvider yii\data\ActiveDataProvider */
/* @var $history \common\modules\blog\entities\BlogPost[] */
$title = $post->translation->title;
$this->title = $title;
$this->params['breadcrumbs'][] = ['label' => Yii::t('blog', 'Posts'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $title;
$css = <<<CSS
.detail-view th {
width: 25%;
}
CSS;
$this->registerCss($css);
?>
<div class="post-view">
<p>
<?= Html::a(Yii::t('blog', 'All Posts'), ['index'], ['class' => 'btn btn-default']) ?>
<?php if ($post->isActive()): ?>
<?= Html::a(Yii::t('blog', 'Draft'), ['draft', 'id' => $post->id], ['class' => 'btn btn-primary', 'data-method' => 'post']) ?>
<?php else: ?>
<?= Html::a(Yii::t('blog', 'Activate'), ['activate', 'id' => $post->id], ['class' => 'btn btn-success', 'data-method' => 'post']) ?>
<?php endif; ?>
<?= Html::a(Yii::t('buttons', 'Edit'), ['update', 'id' => $post->id], ['class' => 'btn btn-primary']) ?>
<?= Html::a(Yii::t('buttons', 'Delete'), ['delete', 'id' => $post->id], [
'class' => 'btn btn-danger',
'data' => [
'confirm' => Yii::t('buttons', 'Are you sure you want to delete this item?'),
'method' => 'post',
],
]) ?>
</p>
<div class="row">
<div class="col-md-9">
<div class="box">
<div class="box-header with-border"><?= Yii::t('blog', 'Common') ?></div>
<div class="box-body">
<?= DetailView::widget([
'model' => $post,
'attributes' => [
'id',
[
'attribute' => 'status',
'value' => BlogPostHelper::statusLabel($post->status),
'format' => 'raw',
],
[
'attribute' => 'category_id',
'value' => $post->category->translation->name, //ArrayHelper::getValue($post, 'category.name'),
],
[
'label' => Yii::t('post', 'Tags'),
'format' => 'raw',
'value' => '<i class="fa fa-tag" aria-hidden="true"></i> ' . implode(' <i class="fa fa-tag" aria-hidden="true"></i> ', ArrayHelper::getColumn($post->tags, 'name')),
],
'slug'
],
]) ?>
</div>
</div>
<?php
$items = [];
foreach (Yii::$app->params['translatedLanguages'] as $language => $language_name) {
$items[] = [
'label' => $language_name,
'content' => $this->render('_view_tab', [
'post' => $post,
'language' => $language,
]),
];
}
?>
<div class="nav-tabs-custom">
<?= \yii\bootstrap\Tabs::widget([
'items' => $items,
]) ?>
</div>
<?php if ($post->image): ?>
<div class="box">
<div class="box-header with-border"><?= Yii::t('blog', 'Image') ?></div>
<div class="box-body">
<?= Html::img($post->getThumbFileUrl('image', 'thumb_gallery_view'), [
'class' => 'thumbnail',
'width' => 300,
]) ?>
</div>
</div>
<?php endif; ?>
<?php if (!$post->image && $post->video): ?>
<div class="box">
<div class="box-header with-border"><?= Yii::t('blog', 'Image') ?></div>
<div class="box-body">
<!-- < ?= Html::img('https://i.ytimg.com/vi/' . BlogPostHelper::parseYoutubeUrl($post->video) . '/maxresdefault.jpg', [
'width' => 300,
'class' => 'thumbnail',
]) ?> -->
<?= Html::img(\core\helpers\VideoHelper::getThumb($post->video), [
'width' => 300,
'class' => 'thumbnail',
]) ?>
</div>
</div>
<?php endif; ?>
<?php if ($post->video): ?>
<div class="box">
<div class="box-header with-border"><?= Yii::t('blog', 'Video') ?></div>
<div class="box-body">
<?= \core\widgets\VideoWidget::widget([
'src' => $post->video,
'style' => '',
]) ?>
</div>
</div>
<?php endif; ?>
</div>
<div class="col-md-3">
<div class="box">
<div class="box-header with-border"><?= Yii::t('blog', 'History') ?></div>
<div class="box-body">
<?php if ($history): ?>
<ul>
<?php foreach ($history as $item): ?>
<li>
<?php if ($item->revision_id): ?>
<?= date('d.m.Y H:i', $item->revision_at) ?>
<?= Html::a(Yii::t('blog', 'View'), \yii\helpers\Url::to(Yii::$app->get('frontendUrlManager')->createAbsoluteUrl(['/blog/post/preview', 'id' => $item->id])), [
'style' => 'font-size:11px;',
'target' => '_blank',
]) ?>
|
<?= Html::a(Yii::t('blog', 'Restore'), ['/blog/manage/post/restore-history', 'id' => $item->id], [
'style' => 'font-size:11px; color: red',
'data' => [
'confirm' => Yii::t('blog', 'Are you sure you want to restore this history item?'),
'method' => 'post',
],
]) ?>
<?php else: ?>
<strong><?= Yii::t('blog', 'Current Edition') ?></strong>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ul>
<?= Html::a(Yii::t('blog', 'Clear History'), ['/blog/manage/post/clear-history', 'id' => $post->id], [
'class' => 'btn btn-danger btn-sm pull-right',
'data' => [
'confirm' => Yii::t('blog', 'Are you sure you want to remove this history?'),
'method' => 'post',
],
]) ?>
<?php else: ?>
<div style="padding: 20px 0; text-align: center"><?= Yii::t('blog', 'History is empty') ?></div>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>

45
common/modules/blog/views/manage/tag/_form.php

@ -1,45 +0,0 @@
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $model \common\modules\blog\forms\BlogTagSingleForm */
/* @var $form yii\widgets\ActiveForm */
$js2 = '
$(".hint-block").each(function () {
var $hint = $(this);
var label = $hint.parent().find("label");
label.html(label.html() + \' <i style="color:#3c8dbc" class="fa fa-question-circle" aria-hidden="true"></i>\');
label.addClass("help").popover({
html: true,
trigger: "hover",
placement: "bottom",
content: $hint.html()
});
$(this).hide();
});
';
$this->registerJs($js2);
?>
<div class="tag-form">
<?php $form = ActiveForm::begin(); ?>
<div class="box box-default">
<div class="box-body">
<?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'slug')->textInput(['maxlength' => true]) ?>
</div>
</div>
<div class="form-group">
<?= Html::submitButton(Yii::t('buttons', 'Save'), ['class' => 'btn btn-success']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>

17
common/modules/blog/views/manage/tag/create.php

@ -1,17 +0,0 @@
<?php
/* @var $this yii\web\View */
/* @var $model \common\modules\blog\forms\BlogTagSingleForm */
$title = Yii::t('blog', 'Create Tag');
$this->title = $title;
$this->params['breadcrumbs'][] = ['label' => Yii::t('blog', 'Tags'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="tag-create">
<?= $this->render('_form', [
'model' => $model,
]) ?>
</div>

47
common/modules/blog/views/manage/tag/index.php

@ -1,47 +0,0 @@
<?php
use common\modules\blog\entities\BlogTag;
use yii\grid\ActionColumn;
use yii\helpers\Html;
use yii\grid\GridView;
/* @var $this yii\web\View */
/* @var $searchModel \common\modules\blog\forms\search\BlogTagSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */
$title = Yii::t('blog', 'Tags');
$this->title = $title;
$this->params['breadcrumbs'][] = $title;
?>
<div class="blog-tags-index">
<p>
<?= Html::a(Yii::t('blog', 'Create Tag'), ['create'], ['class' => 'btn btn-success']) ?>
</p>
<div class="box">
<div class="box-body">
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
[
'attribute' => 'name',
'value' => function (BlogTag $model) {
return Html::a(Html::encode($model->name), ['view', 'id' => $model->id]);
},
'format' => 'raw',
],
[
'attribute' => 'slug',
],
[
'class' => ActionColumn::class,
'options' => ['style' => 'width: 100px;'],
'contentOptions' => ['class' => 'text-center'],
],
],
]); ?>
</div>
</div>
</div>

19
common/modules/blog/views/manage/tag/update.php

@ -1,19 +0,0 @@
<?php
/* @var $this yii\web\View */
/* @var $tag \common\modules\blog\entities\BlogTag */
/* @var $model \common\modules\blog\forms\BlogTagSingleForm */
$title = Yii::t('blog', 'Update Tag: {name}', ['name' => $tag->name]);
$this->title = $title;
$this->params['breadcrumbs'][] = ['label' => Yii::t('blog', 'Tags'), 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => $tag->name, 'url' => ['view', 'id' => $tag->id]];
$this->params['breadcrumbs'][] = Yii::t('buttons', 'Editing');
?>
<div class="tag-update">
<?= $this->render('_form', [
'model' => $model,
]) ?>
</div>

39
common/modules/blog/views/manage/tag/view.php

@ -1,39 +0,0 @@
<?php
use yii\helpers\Html;
use yii\widgets\DetailView;
/* @var $this yii\web\View */
/* @var $tag \common\modules\blog\entities\BlogTag */
$title = $tag->name;
$this->title = $title;
$this->params['breadcrumbs'][] = ['label' => Yii::t('blog', 'Tags'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $title;
?>
<div class="user-view">
<p>
<?= Html::a(Yii::t('blog', 'Tags'), ['index'], ['class' => 'btn btn-default']) ?>
<?= Html::a(Yii::t('buttons', 'Edit'), ['update', 'id' => $tag->id], ['class' => 'btn btn-primary']) ?>
<?= Html::a(Yii::t('buttons', 'Delete'), ['delete', 'id' => $tag->id], [
'class' => 'btn btn-danger',
'data' => [
'confirm' => Yii::t('buttons', 'Are you sure you want to delete this item?'),
'method' => 'post',
],
]) ?>
</p>
<div class="box">
<div class="box-body">
<?= DetailView::widget([
'model' => $tag,
'attributes' => [
'name',
'slug',
],
]) ?>
</div>
</div>
</div>

42
common/modules/blog/views/post/_list.php

@ -1,42 +0,0 @@
<?php
/* @var $this yii\web\View */
/* @var $dataProvider yii\data\DataProviderInterface */
?>
<article class="heading-component">
<div class="heading-component-inner">
<h5 class="heading-component-title"><?= Yii::t('blog', 'All Posts') ?></h5>
</div>
</article>
<?= \yii\widgets\ListView::widget([
'dataProvider' => $dataProvider,
'layout' => "<div class='row row-30'>{items}</div>\n<nav class='pagination-wrap' aria-label='Page navigation'>{pager}</nav>",
'itemView' => '_post',
'pager' => [
//'pagination' => null,
'maxButtonCount' => 7,
'pageCssClass' => 'page-item',
'options' => [
'class' => 'pagination',
],
'disabledListItemSubTagOptions' => ['tag' => 'div', 'class' => 'disabled'],
'activePageCssClass' => 'active',
'linkOptions' => [
'class' => 'page-link',
],
'prevPageLabel' => '<span class="fa fa-angle-left"></span>',
'nextPageLabel' => '<span class="fa fa-angle-right"></span>',
],
'itemOptions' => [
'tag' => false
],
'options' => [
'tag' => false,
'class' => 'row row-30',
'id' => false,
],
]) ?>

51
common/modules/blog/views/post/_post.php

@ -1,51 +0,0 @@
<?php
/* @var $this yii\web\View */
/* @var $model \common\modules\blog\entities\BlogPost */
use yii\helpers\Html;
use yii\helpers\Url;
use yii\helpers\StringHelper;
$url = Url::to(['blog/post/post', 'id' =>$model->id]);
$url_full = Yii::$app->params['frontendHostInfo'] . Url::to(['blog/post/post', 'id' =>$model->id]);
?>
<div class="col-md-6">
<article class="post-future">
<a class="post-future-figure" href="<?= $url ?>">
<img src="<?= Html::encode($model->getThumbFileUrl('image', '368_287')) ?>" alt="<?= Html::encode($model->title) ?>" />
</a>
<div class="post-future-main">
<h4 class="post-future-title"><a href="<?= $url ?>"><?= Html::encode($model->title) ?></a></h4>
<div class="post-future-meta">
<!-- Badge-->
<div class="badge badge-secondary"><?= $model->category->name ?></div>
<div class="post-future-time"><span class="icon fa fa-calendar"></span>
<time datetime="<?= date('Y') ?>"><?= Yii::$app->formatter->asDate($model->published_at, 'php:d F, Y') ?></time>
</div>
</div>
<hr/>
<div class="post-future-text">
<p><?= StringHelper::truncateWords(Html::encode($model->description), 12, '...') ?></p>
</div>
<div class="post-future-footer group-flex group-flex-xs"><a class="button button-gray-outline" href="#"><?= Yii::t('blog', 'Read more') ?></a>
<div class="post-future-share">
<div class="inline-toggle-parent">
<div class="inline-toggle icon fa fa-share-alt" title="<?= Yii::t('blog', 'Share') ?>"></div>
<div class="inline-toggle-element">
<ul class="list-inline">
<li><span class="fa fa-share-alt"></span></li>
<li><a target="_blank" class="icon fa fa-facebook" href="https://www.facebook.com/sharer.php?src=sp&u=<?= urlencode($url_full) ?>"></a></li>
<li><a target="_blank" class="icon fa fa-odnoklassniki" href="https://connect.ok.ru/offer?url=<?= urlencode($url_full) ?>"></a></li>
<li><a target="_blank" class="icon fa fa-google-plus" href="https://plus.google.com/share?url=<?= urlencode($url_full) ?>"></a></li>
<li><a target="_blank" class="icon fa fa-vk" href="https://vk.com/share.php?url=<?= urlencode($url_full) ?>"></a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
</article>
</div>

40
common/modules/blog/views/post/category.php

@ -1,40 +0,0 @@
<?php
/* @var $this yii\web\View */
/* @var $dataProvider yii\data\DataProviderInterface */
/* @var $category \common\modules\blog\entities\BlogCategory */
use yii\helpers\Html;
$this->title = $category->getSeoTitle();
$this->registerMetaTag(['name' =>'description', 'content' => $category->meta->description]);
$this->registerMetaTag(['name' =>'keywords', 'content' => $category->meta->keywords]);
$this->params['breadcrumbs'][] = ['label' => Yii::t('blog', 'Blog'), 'url' => ['blog/post/index']];
$this->params['breadcrumbs'][] = $category->name;
$this->params['active_category'] = $category;
?>
<h1><?= Html::encode($category->getHeadingTile()) ?></h1>
<?php if (trim($category->description)): ?>
<div class="panel panel-default">
<div class="panel-body">
<?= Yii::$app->formatter->asHtml($category->description, [
'Attr.AllowedRel' => array('nofollow'),
'HTML.SafeObject' => true,
'Output.FlashCompat' => true,
'HTML.SafeIframe' => true,
'URI.SafeIframeRegexp'=>'%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/)%',
]) ?>
</div>
</div>
<?php endif; ?>
<?= $this->render('_list', [
'dataProvider' => $dataProvider
]) ?>

13
common/modules/blog/views/post/index.php

@ -1,13 +0,0 @@
<?php
/* @var $this yii\web\View */
/* @var $dataProvider yii\data\DataProviderInterface */
$this->title = Yii::t('blog', 'Blog');
$this->params['breadcrumbs'][] = $this->title;
?>
<?= $this->render('_list', [
'dataProvider' => $dataProvider
]) ?>

113
common/modules/blog/views/post/post.php

@ -1,113 +0,0 @@
<?php
/* @var $this yii\web\View */
/* @var $post \common\modules\blog\entities\BlogPost */
use common\modules\blog\widgets\CommentsWidget;
use yii\helpers\Html;
use yii\helpers\Url;
$this->title = $post->getSeoTitle();
$this->registerMetaTag(['name' =>'description', 'content' => $post->meta->description]);
$this->registerMetaTag(['name' =>'keywords', 'content' => $post->meta->keywords]);
$this->params['breadcrumbs'][] = ['label' => Yii::t('blog', 'Blog'), 'url' => ['blog/post/index']];
$this->params['breadcrumbs'][] = ['label' => $post->category->name, 'url' => ['blog/post/category', 'id' => $post->category->id]];
$this->params['breadcrumbs'][] = $post->title;
$this->params['active_category'] = $post->category;
$tagLinks = [];
foreach ($post->tags as $tag) {
$tagLinks[] = '<li>' . Html::a(Html::encode($tag->name), ['tag', 'slug' => $tag->slug]) . '</li>';
}
$url = Url::to(['blog/post/post', 'id' =>$post->id]);
$url_full = Yii::$app->params['frontendHostInfo'] . Url::to(['blog/post/post', 'id' =>$post->id]);
$js = <<<JS
jQuery(document).ready(function($) {
if (device.desktop() || device.tablet()) {
var relative_slider = $('#relative_carousel').bxSlider({
infiniteLoop: true,
hideControlOnEnd: true,
minSlides: 2,
maxSlides: 2,
moveSlides: 1,
slideMargin: 0,
pager: false,
prevText: '',
nextText: '',
controls: false
});
$('#relative-button-prev').on('click', function(){
relative_slider.goToPrevSlide();
return false;
});
$('#relative-button-next').on('click', function(){
relative_slider.goToNextSlide();
return false;
})
}
});
JS;
$this->registerJs($js, $this::POS_READY);
?>
<div class="blog-post">
<!-- Badge-->
<div class="badge badge-secondary"><?= $post->category->name ?>
</div>
<h3 class="blog-post-title"><?= Html::encode($post->title) ?></h3>
<div class="blog-post-header">
<div class="blog-post-meta">
<time class="blog-post-time" datetime="<?= date('Y') ?>"><span class="icon fa fa-calendar"></span><?= Yii::$app->formatter->asDate($post->published_at, 'php:d F, Y') ?></time>
<div class="blog-post-comment"><span class="icon fa fa-comment"></span><?= $post->comments_count ?></div>
<div class="blog-post-view"><span class="icon fa fa-eye"></span><?= $post->views ?></div>
</div>
</div>
<div class="blog-post-author-quote">
<p><?= $post->description ?></p>
</div>
<div class="blog-post-share">
<p><?= Yii::t('blog', 'Share') ?></p>
<ul class="group">
<li><a target="_blank" class="icon fa fa-facebook" href="https://www.facebook.com/sharer.php?src=sp&u=<?= urlencode($url_full) ?>"></a></li>
<li><a target="_blank" class="icon fa fa-odnoklassniki" href="https://connect.ok.ru/offer?url=<?= urlencode($url_full) ?>"></a></li>
<li><a target="_blank" class="icon fa fa-google-plus" href="https://plus.google.com/share?url=<?= urlencode($url_full) ?>"></a></li>
<li><a target="_blank" class="icon fa fa-vk" href="https://vk.com/share.php?url=<?= urlencode($url_full) ?>"></a></li>
</ul>
</div>
<div class="blog-post-content">
<img src="<?= Html::encode($post->getThumbFileUrl('image', '683_407')) ?>" alt="<?= Html::encode($post->title) ?>" width="683" height="407" />
<?= Yii::$app->formatter->asHtml($post->content, [
'Attr.AllowedRel' => array('nofollow'),
'HTML.SafeObject' => true,
'Output.FlashCompat' => true,
'HTML.SafeIframe' => true,
'URI.SafeIframeRegexp'=>'%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/)%',
]) ?>
</div>
</div>
<?= \common\modules\blog\widgets\PostByTagsWidget::widget([
'count' => 10,
'view' => 'slider-relative',
'post' => $post,
]) ?>
<ul class="list-tags" style="margin-top:20px"><?= implode(', ', $tagLinks) ?></ul>
<?= CommentsWidget::widget([
'post' => $post,
]) ?>

29
common/modules/blog/widgets/CategoriesWidget.php

@ -1,29 +0,0 @@
<?php
namespace common\modules\blog\widgets;
use common\modules\blog\entities\BlogCategory;
use common\modules\blog\repositories\read\BlogCategoryReadRepository;
use yii\base\Widget;
use yii\helpers\Html;
class CategoriesWidget extends Widget
{
/** @var BlogCategory|null */
public $active;
private $categories;
public function __construct(BlogCategoryReadRepository $categories, $config = [])
{
parent::__construct($config);
$this->categories = $categories;
}
public function run(): string
{
return $this->render('categories/categories', [
'categories' => $this->categories->getAll(),
]);
}
}

20
common/modules/blog/widgets/CommentView.php

@ -1,20 +0,0 @@
<?php
namespace common\modules\blog\widgets;
use common\modules\blog\entities\BlogComment;
class CommentView
{
public $comment;
/**
* @var self[]
*/
public $children;
public function __construct(BlogComment $comment, array $children)
{
$this->comment = $comment;
$this->children = $children;
}
}

57
common/modules/blog/widgets/CommentsWidget.php

@ -1,57 +0,0 @@
<?php
namespace common\modules\blog\widgets;
use common\modules\blog\entities\BlogComment;
use common\modules\blog\entities\BlogPost;
use common\modules\blog\forms\BlogCommentForm;
use yii\base\InvalidConfigException;
use yii\base\Widget;
class CommentsWidget extends Widget
{
/**
* @var BlogPost
*/
public $post;
public function init(): void
{
if (!$this->post) {
throw new InvalidConfigException('Specify the post.');
}
}
public function run(): string
{
$form = new BlogCommentForm();
$comments = $this->post->getBlogComments()
->orderBy(['parent_id' => SORT_ASC, 'id' => SORT_ASC])
->all();
$items = $this->treeRecursive($comments, null);
return $this->render('comments/comments', [
'post' => $this->post,
'items' => $items,
'commentForm' => $form,
]);
}
/**
* @param BlogComment[] $comments
* @param integer $parentId
* @return CommentView[]
*/
public function treeRecursive(&$comments, $parentId): array
{
$items = [];
foreach ($comments as $comment) {
if ($comment->parent_id == $parentId) {
$items[] = new CommentView($comment, $this->treeRecursive($comments, $comment->id));
}
}
return $items;
}
}

30
common/modules/blog/widgets/MenuItemCreatorWidget.php

@ -1,30 +0,0 @@
<?php
/**
* Created by Error202
* Date: 10.07.2018
*/
namespace common\modules\blog\widgets;
use core\forms\menu\MenuItemForm;
use yii\base\Widget;
class MenuItemCreatorWidget extends Widget
{
public $menu_id;
public function run()
{
$form = new MenuItemForm();
$form->module = 'blog';
$form->name = \Yii::t('blog', 'Blog');
$form->title_attr = \Yii::t('blog', 'Blog');
$form->menu_id = $this->menu_id;
$form->url = '/blog/post/index';
return $this->render('menu-item/creator', [
'model' => $form,
]);
}
}

42
common/modules/blog/widgets/PostByTagsWidget.php

@ -1,42 +0,0 @@
<?php
/**
* Created by Error202
* Date: 24.01.2018
*/
namespace common\modules\blog\widgets;
use common\modules\blog\entities\BlogTagAssignment;
use common\modules\blog\repositories\read\BlogPostReadRepository;
use yii\base\Widget;
use yii\helpers\ArrayHelper;
use yii\helpers\Url;
class PostByTagsWidget extends Widget
{
public $count;
public $view;
public $post;
public $posts;
public function __construct(BlogPostReadRepository $posts, $config = [])
{
parent::__construct($config);
$this->count = $this->count ? $this->count : 5;
$this->posts = $posts;
}
public function run(): string
{
$tag_ids = ArrayHelper::getColumn(BlogTagAssignment::find()->andWhere(['post_id' => $this->post->id])->all(), 'tag_id');
$posts = $this->posts->getByTagsId($this->post, $tag_ids, $this->count)->getModels();
return $this->render($this->view, [
'posts' => $posts,
'view' => $this->view,
'url' => Url::canonical(),
]);
}
}

39
common/modules/blog/widgets/TagWidget.php

@ -1,39 +0,0 @@
<?php
/**
* Created by Error202
* Date: 30.01.2018
*/
namespace common\modules\blog\widgets;
use common\modules\blog\entities\BlogPost;
use yii\base\Widget;
class TagWidget extends Widget
{
public $post_id;
public function run() {
// tags from categories with assignments, ordered by count
$tags = BlogPost::find()->select('t.name as name, count(t.id) as cnt, t.id as id')
->from('blog_posts as p, blog_tag_assignments as a, blog_tags as t')
->andWhere('p.id = a.post_id')
->andWhere('t.id = a.tag_id')
->andWhere(isset($this->post_id) ? 'p.id = ' . $this->post_id : '')
->groupBy('t.id')
->orderBy('cnt DESC')
->limit(20)
->asArray()
->all();
if ($tags) {
return $this->render( 'tags/tags', [
'tags' => $tags,
] );
}
else {
return '';
}
}
}

32
common/modules/blog/widgets/views/categories/categories.php

@ -1,32 +0,0 @@
<?php
/**
* Created by Error202
* Date: 21.06.2018
*/
use yii\helpers\Html;
/**
* @var $this \yii\web\View
* @var $categories \common\modules\blog\entities\BlogCategory[]
*/
?>
<!-- Categories Widget -->
<div class="card my-4">
<h5 class="card-header"><?= Yii::t('blog_public', 'Categories') ?></h5>
<div class="card-body">
<div class="row">
<div class="col-lg-12">
<ul class="list-unstyled mb-0 blog-categories-widget-list">
<?php foreach ($categories as $category): ?>
<li>
<?= Html::a($category->translation->name, ['/blog/post/category', 'id' => $category->id]) ?>
</li>
<?php endforeach; ?>
</ul>
</div>
</div>
</div>
</div>

78
common/modules/blog/widgets/views/comments/_comment.php

@ -1,78 +0,0 @@
<?php
/* @var $item \common\modules\blog\widgets\CommentView */
/* @var $child integer */
?>
<div data-id="<?= $item->comment->id ?>" class="blog-comment <?= $child ? 'blog-comment-child' : 'blog-comment-parent' ?>" style="margin-left: <?= $child * 30 ?>px">
<div class="media mb-4">
<img class="d-flex mr-3 rounded-circle blog-comment-avatar" src="<?= Yii::$app->avatar->show($item->comment->user->username) ?>" alt="">
<div class="media-body">
<a name="comment_<?= $item->comment->id ?>"></a>
<h5 class="mt-0"><?= $item->comment->user->username ?>
<time class="blog-comment-time" datetime="<?= date('Y', $item->comment->created_at) ?>">
<?php
$date = ($item->comment->created_at > time() - 60*60*24*365*50
? Yii::$app->formatter->asRelativeTime($item->comment->created_at)
: Yii::$app->formatter->asDatetime($item->comment->created_at));
?>
<?= $date ?>
</time>
</h5>
<p>
<?php if ($item->comment->isActive()): ?>
<?= Yii::$app->formatter->asNtext($item->comment->text) ?>
<?php else: ?>
<i>Comment is deleted.</i>
<?php endif; ?>
</p>
<div class="blog-comment-footer">
<?php if (!Yii::$app->user->isGuest): ?>
<div class="blog-comment-reply"><a href="#"><?= Yii::t('post', 'Reply') ?></a></div>
<?php endif; ?>
</div>
<div class="reply-block"></div>
</div>
</div>
<!--
<div class="post-comment-main">
<div class="post-comment-header">
<a name="comment_<?= $item->comment->id ?>"></a>
<h5 class="author-name"><?= $item->comment->user->username ?></h5>
<time class="post-comment-time" datetime="<?= date('Y', $item->comment->created_at) ?>">
<?php
$date = ($item->comment->created_at > time() - 60*60*24*365*50
? Yii::$app->formatter->asRelativeTime($item->comment->created_at)
: Yii::$app->formatter->asDatetime($item->comment->created_at));
?>
<?= $date ?>
</time>
</div>
<div class="post-comment-text">
<p>
<?php if ($item->comment->isActive()): ?>
<?= Yii::$app->formatter->asNtext($item->comment->text) ?>
<?php else: ?>
<i>Comment is deleted.</i>
<?php endif; ?>
</p>
</div>
<div class="post-comment-footer">
<?php if (!Yii::$app->user->isGuest): ?>
<div class="comment-reply"><span class="icon fa fa-comment"></span><a href="#"><?= Yii::t('post', 'Reply') ?></a></div>
<?php endif; ?>
</div>
<div class="reply-block"></div>
</div>-->
</div>
<?php foreach ($item->children as $children): ?>
<?= $this->render('_comment', ['item' => $children, 'child' => $child + 1]) ?>
<?php endforeach; ?>

103
common/modules/blog/widgets/views/comments/comments.php

@ -1,103 +0,0 @@
<?php
use yii\bootstrap\ActiveForm;
use yii\helpers\Html;
/* @var $this yii\web\View */
/* @var $post \common\modules\blog\entities\BlogPost */
/* @var $items \common\modules\blog\widgets\CommentView[] */
/* @var $count integer */
/* @var $commentForm \common\modules\blog\forms\BlogCommentForm */
$css = <<<CSS
a.reply-block-start {
display: block;
position: relative;
top: -100px;
visibility: hidden;
}
a#send-comment {
font-size: 14px;
font-weight: normal;
}
.heading-component {
margin-bottom: 20px;
}
CSS;
$this->registerCss( $css );
?>
<div class="row">
<div class="col-sm-12">
<!-- Heading Component-->
<article class="heading-component">
<div class="heading-component-inner">
<h5 class="heading-component-title">
<?= Yii::t( 'post', 'Comments: {count}', [ 'count' => $post->comments_count ] ) ?>
<?php if ( ! Yii::$app->user->isGuest ): ?>
<a id="send-comment" href="#reply-block-start"
class="pull-right"><?= Yii::t( 'post', 'Send comment' ) ?></a>
<?php endif; ?>
</h5>
</div>
</article>
<?php if ( count( $items ) > 0 ): ?>
<div class="blog-post-comments">
<?php foreach ( $items as $item ): ?>
<?= $this->render( '_comment', [ 'item' => $item, 'child' => 0 ] ) ?>
<?php endforeach; ?>
</div>
<?php endif; ?>
<?php if ( ! Yii::$app->user->isGuest ): ?>
<div id="reply-container">
<a name="reply-block-start" class="reply-block-start"></a>
<div id="reply-block" class="leave-reply">
<?php $form = ActiveForm::begin( [
'action' => [ 'comment', 'id' => $post->id ],
] ); ?>
<?= Html::activeHiddenInput( $commentForm, 'parentId' ) ?>
<?= $form->field( $commentForm, 'text' )->textarea( [ 'rows' => 5 ] )->label( Yii::t( 'post', 'Comment' ) ) ?>
<div class="form-group">
<?= Html::submitButton( Yii::t( 'post', 'Submit' ), [ 'class' => 'btn btn-primary' ] ) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
</div>
<?php else: ?>
<div style="text-align: center; padding: 20px;">
<?= Yii::t('post', 'Please {login} for writing a comment.', ['login' => Html::a(Yii::t('auth', 'Log in'), ['/auth/auth/login'])]) ?>
</div>
<?php endif; ?>
</div>
</div>
<?php $this->registerJs( "
jQuery(document).on('click', '.blog-post-comments .blog-comment-reply', function () {
var link = jQuery(this);
var form = jQuery('#reply-block');
var comment = link.closest('.blog-comment');
jQuery('#blogcommentform-parentid').val(comment.data('id'));
form.detach().appendTo(comment.find('.reply-block:first'));
return false;
});
jQuery(document).on('click', '#send-comment', function () {
var form = jQuery('#reply-block');
jQuery('#blogcommentform-parentid').val('');
form.detach().appendTo('#reply-container');
//return false;
});
" ); ?>

128
common/modules/blog/widgets/views/menu-item/creator.php

@ -1,128 +0,0 @@
<?php
/**
* Created by Error202
* Date: 10.07.2018
*/
/**
* @var $this \yii\web\View
* @var $model \core\forms\menu\MenuItemForm
*/
use yii\widgets\ActiveForm;
use yii\helpers\Html;
use yii\web\JsExpression;
use yii\helpers\Url;
$block_name = Yii::t('blog', 'Blog');
$block_title_attr = Yii::t('blog', 'Blog');
$js = <<<JS
function selectBlogPostOn() {
$("#post_select").removeAttr('disabled');
updateBlogUrl('post');
}
function selectBlogPostOff() {
$("#post_select").attr('disabled', 'disabled');
updateBlogUrl('blog');
}
function updateBlogUrl(type) {
if (type === 'blog') {
$("#blog_menu_item_url").val('/blog/post/index');
$("#blog_menu_item_url_params").val('');
$("#blog_menu_item_name").val('{$block_name}');
$("#blog_menu_item_title_attr").val('$block_title_attr');
}
else {
var select = $("#post_select");
var data = select.select2('data');
var selected_post = select.val();
$("#blog_menu_item_url").val('/blog/post/post/');
$("#blog_menu_item_url_params").val('{"id":'+selected_post+'}');
$("#blog_menu_item_name").val(data[0].text);
$("#blog_menu_item_title_attr").val(data[0].text);
}
}
JS;
$this->registerJs($js, $this::POS_HEAD);
$fetchUrl = Url::to( [ '/blog/manage/post/post-search' ] );
?>
<div class="menu_item_widget">
<div class="form-group">
<div class="radio">
<?= Html::label(Html::radio('blog_item_type', true, [
'value' => 'blog_home',
'onclick' => new JsExpression('selectBlogPostOff()'),
]) . Yii::t('blog', 'Blog Home')) ?>
</div>
<div class="radio">
<?= Html::label(Html::radio('blog_item_type', false, [
'value' => 'blog_post',
'onclick' => new JsExpression('selectBlogPostOn()'),
]) . Yii::t('blog', 'Blog Post')) ?>
</div>
<div>
<?= \kartik\widgets\Select2::widget([
'name' => 'post_select',
'value' => '',
'options' => [
'placeholder' => Yii::t('blog', 'Select post...'),
'id' => 'post_select',
'onchange' => new JsExpression("updateBlogUrl('post')"),
],
'pluginOptions' => [
'disabled' => true,
'ajax' => [
'url' => $fetchUrl,
'dataType' => 'json',
'data' => new JsExpression('function(params) { return {q:params.term}; }')
],
'escapeMarkup' => new JsExpression('function (markup) { return markup; }'),
'templateResult' => new JsExpression('function(tag) { return tag.text; }'),
'templateSelection' => new JsExpression('function (tag) { return tag.text; }'),
],
]) ?>
</div>
</div>
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'name')->hiddenInput([
'id' => 'blog_menu_item_name',
])->label(false) ?>
<?= $form->field($model, 'title_attr')->hiddenInput([
'id' => 'blog_menu_item_title_attr',
])->label(false) ?>
<?= $form->field($model, 'module')->hiddenInput([
])->label(false) ?>
<?= $form->field($model, 'menu_id')->hiddenInput([
])->label(false) ?>
<?= $form->field($model, 'url')->hiddenInput([
'id' => 'blog_menu_item_url',
])->label(false) ?>
<?= $form->field($model, 'url_params')->hiddenInput([
'value' => '',
'id' => 'blog_menu_item_url_params',
])->label(false) ?>
<div class="form-group">
<?= Html::submitButton(Yii::t('buttons', 'Add to menu'), [
'class' => 'btn btn-info btn-sm pull-right'
]) ?>
</div>
<?php ActiveForm::end(); ?>
</div>

38
common/modules/blog/widgets/views/slider-relative.php

@ -1,38 +0,0 @@
<?php
/**
* @var $this \yii\web\View
* @var $view string
* @var $posts \common\modules\blog\entities\BlogPost[]
*/
?>
<div class="row">
<div class="col-sm-12 owl-carousel-outer-navigation">
<!-- Heading Component-->
<article class="heading-component">
<div class="heading-component-inner">
<h5 class="heading-component-title"><?= Yii::t('post', 'Related') ?>
</h5>
<div class="owl-carousel-arrows-outline">
<div class="owl-nav">
<button class="owl-arrow owl-arrow-prev" id="relative-button-prev"></button>
<button class="owl-arrow owl-arrow-next" id="relative-button-next"></button>
</div>
</div>
</div>
</article>
<!-- Blog Carousel-->
<div id="relative_carousel" class="owl-carousel row">
<?php foreach ($posts as $post): ?>
<?= $this->render($view . '_item', [
'post' => $post
]) ?>
<?php endforeach; ?>
</div>
</div>
</div>

21
common/modules/blog/widgets/views/tags/tags.php

@ -1,21 +0,0 @@
<?php
/**
* Created by Error202
* Date: 21.06.2018
*/
use yii\helpers\Html;
/**
* @var $this \yii\web\View
* @var $tags array
*/
?>
<hr>
<ul class="list-unstyled">
<?php foreach ($tags as $tag): ?>
<li class="list-inline-item"><i class="fa fa-tag" aria-hidden="true"></i> <?= Html::a($tag['name'], ['/blog/post/tag', 'id' => $tag['id']]) ?></li>
<?php endforeach; ?>
</ul>
Loading…
Cancel
Save