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
			| 
								 
											8 years ago
										 
									 | 
							
								<?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);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |