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); | 
						|
    } | 
						|
} |