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