You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							171 lines
						
					
					
						
							5.1 KiB
						
					
					
				
			
		
		
	
	
							171 lines
						
					
					
						
							5.1 KiB
						
					
					
				| <?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\entities\Meta; | |
| 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): BlogPost | |
|     { | |
|         $category = $this->categories->get($form->category_id); | |
|  | |
|         $post = BlogPost::create( | |
|             $category->id, | |
|             $form->title, | |
|             $form->slug, | |
|             $form->description, | |
|             $form->content, | |
|             $form->published_at, | |
|             $form->video, | |
|             new Meta( | |
|                 $form->meta->title, | |
|                 $form->meta->description, | |
|                 $form->meta->keywords | |
|             ) | |
|         ); | |
|  | |
|         $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); | |
|         $category = $this->categories->get($form->category_id); | |
|  | |
|         $post->edit( | |
|             $category->id, | |
|             $form->title, | |
|             $form->slug, | |
|             $form->description, | |
|             $form->content, | |
|             $form->published_at, | |
|             $form->video, | |
|             new Meta( | |
|                 $form->meta->title, | |
|                 $form->meta->description, | |
|                 $form->meta->keywords | |
|             ) | |
|         ); | |
|  | |
|         if ($form->image) { | |
| 	        $post->cleanFiles(); | |
|             $post->setImage($form->image); | |
|         } | |
| 	    elseif ($form->video && (!$post->image || $form->reset_image)) { | |
| 		    $post->cleanFiles(); | |
| 		    $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; | |
| 		} | |
| 		elseif ($post->image && $form->reset_image) { | |
|         	$post->cleanFiles(); | |
|         	//Post::updateAll(['image' => null], ['id' => $post->id]); | |
| 			$post->image = null; | |
| 			$post->updateAttributes(['image']); | |
| 		} | |
|  | |
|         $this->transaction->wrap(function () use ($post, $form) { | |
|             $post->revokeTags(); | |
|             $this->posts->save($post); | |
|  | |
|             $tag_updated = false; | |
|             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 ); | |
| 		            $tag_updated = true; | |
| 	            } | |
|             } | |
|  | |
|             if ($tag_updated) { | |
| 	            $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); | |
|         $this->posts->remove($post); | |
|     } | |
| } |