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.
		
		
		
		
		
			
		
			
				
					
					
						
							163 lines
						
					
					
						
							4.8 KiB
						
					
					
				
			
		
		
	
	
							163 lines
						
					
					
						
							4.8 KiB
						
					
					
				| <?php | |
|  | |
| namespace core\services\post; | |
|  | |
| use core\entities\Meta; | |
| use core\entities\post\Post; | |
| use core\entities\post\PostTag; | |
| use core\forms\post\PostForm; | |
| use core\helpers\PostHelper; | |
| use core\repositories\post\PostCategoryRepository; | |
| use core\repositories\post\PostRepository; | |
| use core\repositories\post\PostTagRepository; | |
| use core\services\TransactionManager; | |
| use yii\base\Security; | |
| use yii\helpers\Inflector; | |
|  | |
| class PostManageService | |
| { | |
|     private $posts; | |
|     private $categories; | |
|     private $tags; | |
|     private $transaction; | |
|  | |
|     public function __construct( | |
|         PostRepository $posts, | |
|         PostCategoryRepository $categories, | |
|         PostTagRepository $tags, | |
|         TransactionManager $transaction | |
|     ) | |
|     { | |
|         $this->posts = $posts; | |
|         $this->categories = $categories; | |
|         $this->tags = $tags; | |
|         $this->transaction = $transaction; | |
|     } | |
|  | |
|     public function create(PostForm $form): Post | |
|     { | |
|         $category = $this->categories->get($form->category_id); | |
|  | |
|         $post = Post::create( | |
|             $category->id, | |
|             $form->title, | |
|             $form->slug, | |
|             $form->description, | |
|             $form->content, | |
|             $form->type_id, | |
|             $form->published_at, | |
|             $form->video, | |
|             new Meta( | |
|                 $form->meta->title, | |
|                 $form->meta->description, | |
|                 $form->meta->keywords | |
|             ) | |
|         ); | |
|  | |
|         if ($form->image) { | |
|             $post->setImage($form->image); | |
|         } | |
|         else if ($form->video) { | |
| 	        $src = 'https://i.ytimg.com/vi/' . PostHelper::parseYoutubeUrl($post->video) . '/maxresdefault.jpg'; | |
| 	        $filename = (new Security())->generateRandomString(15) . '.jpg'; | |
| 	        copy($src, \Yii::getAlias(Post::FILE_ORIGINAL_PATH . '/' . $post->id . '.jpg')); | |
| 	        $post->image = $filename; | |
|         } | |
|  | |
|         $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, $form->type_id ) ) { | |
| 				        $tag = PostTag::create( $tag_name, Inflector::slug( $tag_name, '_' ), $form->type_id ); | |
| 				        $this->tags->save( $tag ); | |
| 			        } | |
| 			        $post->assignTag( $tag->id ); | |
| 		        } | |
| 	        } | |
|             $this->posts->save($post); | |
|         }); | |
|  | |
|         return $post; | |
|     } | |
|  | |
|     public function edit($id, PostForm $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 = 'https://i.ytimg.com/vi/' . PostHelper::parseYoutubeUrl($post->video) . '/maxresdefault.jpg'; | |
| 			$filename = (new Security())->generateRandomString(15) . '.jpg'; | |
| 			copy($src, \Yii::getAlias(Post::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, $form->type_id ) ) { | |
| 			            $tag = PostTag::create( $tag_name, Inflector::slug( $tag_name, '_' ), $form->type_id ); | |
| 			            $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); | |
|     } | |
| } |