Просмотр файла libarea-0.9/app/Controllers/Publication/EditPublicationController.php

Размер файла: 5.93Kb
<?php

declare(strict_types=1);

namespace App\Controllers\Publication;

use Hleb\Static\Request;
use Hleb\Base\Controller;
use App\Content\Сheck\{Validator, Availability};
use App\Models\User\UserModel;
use App\Models\{FacetModel, PublicationModel, PollModel};
use UploadImage, Meta, Msg;

use App\Traits\Slug;
use App\Traits\Poll;
use App\Traits\Author;
use App\Traits\Related;
use App\Traits\AddFacetsContent;

class EditPublicationController extends Controller
{
	use Slug;
	use Poll;
	use Author;
	use Related;
	use AddFacetsContent;

	/**
	 * Post edit form
	 * Форма редактирования post
	 *
	 * @return void
	 */
	public function index()
	{
		$content = Availability::content(Request::param('id')->asPositiveInt(), 'id');

		$post_related = [];
		if ($content['post_related']) {
			$post_related = PublicationModel::postRelated($content['post_related']);
		}

		$blog = FacetModel::getFacetsUser('blog');
		$this->checkingEditPermissions($content, $blog);

		render(
			'/publications/edit/index',
			[
				'meta'  => Meta::get(__('app.edit_' . $content['post_type'])),
				'data'  => [
					'sheet'         => 'edit-content',
					'content'		=> $content,
					'user'          => UserModel::get($content['post_user_id'], 'id'),
					'blog'          => $blog,
					'post_arr'      => $post_related,
					'topic_arr'     => PublicationModel::getPostFacet($content['post_id'], 'topic'),
					'blog_arr'      => PublicationModel::getPostFacet($content['post_id'], 'blog'),
					'section_arr'   => PublicationModel::getPostFacet($content['post_id'], 'section'),
					'poll'          => PollModel::getQuestion($content['post_poll']),
				]
			]
		);
	}

    public function editArticle(): void
    {
        $this->callEdit('article');
    }

    public function editQuestion(): void
    {
        $this->callEdit('question');
    }

    public function editPost(): void
    {
        $this->callEdit('post');
    }

    public function editNote(): void
    {
        $this->callEdit('note');
    }

    public function editPage(): void
    {
        $this->callEdit('page');
    }

	public function callEdit(string $type): void
	{
		$data = Request::getParsedBody();
		$post = Availability::content($data['id']);

        if ($type === 'page') {
			if (!$this->container->user()->admin()) {
				redirect('/');
			}
        }

		$post_draft = $data['post_draft'] ?? false === 'on' ? 1 : 0;

		$blog = FacetModel::getFacetsUser('blog');
		$this->checkingEditPermissions($post, $blog);

		$redirect = url('publication.form.edit', ['id' => $data['id']]);

		Validator::publication($data, $type, $redirect);

		$post_date = ($post['post_draft'] == 1 && $post_draft == 0) ? date("Y-m-d H:i:s") : $post['post_date'];

		// Post cover
		$post_img = $post['post_content_img'];
		if (!empty($data['images'])) {
			$post_img = UploadImage::coverPost($data['images'], $post, $redirect);
		}

		// Add fastes (blogs, topics) to the content
		$this->addFacets($data, (int)$data['id'], $redirect);

		$post_related = $this->relatedPost();

		if ($this->container->user()->admin()) {
			$post_merged_id = Request::post('post_merged_id')->asInt();
			$post_slug = Request::post('post_slug')->value();
			if ($post_slug != $post['post_slug']) {
				if (PublicationModel::getSlug($slug = $this->getSlug($post_slug))) {
					$slug = $slug . "-";
				}
			}
		}

		if (!in_array($data['content_type'], ['article', 'post', 'note', 'question'])) {
			$data['content_type'] = 'article';
        }

		PublicationModel::editPost([
			'post_id' 			=> $data['id'],
			'post_title' 		=> $data['title'] ?? '',
			'post_slug' 		=> $slug ?? $post['post_slug'],
			'post_type' 		=> $data['content_type'],
			'post_translation'	=> Request::post('translation')->value() == 'on' ? 1 : 0,
			'post_date' 		=> $post_date,
			'post_user_id' 		=> $this->selectAuthor($post['post_user_id'], Request::post('user_id')->value()),
			'post_draft' 		=> $post_draft,
			'post_content' 		=> $data['content'],
			'post_content_img' 	=> $post_img ?? '',
			'post_related' 		=> $post_related ?? '',
			'post_merged_id' 	=> $post_merged_id ?? 0,
			'post_tl' 			=> Request::post('content_tl')->asInt(),
			'post_closed' 		=> Request::post('closed')->value() == 'on' ? 1 : 0,
			'post_nsfw' 		=> Request::post('nsfw')->value() == 'on' ? 1 : 0,
			'post_hidden' 		=> Request::post('hidden')->value() == 'on' ? 1 : 0,
			'post_top' 			=> Request::post('top')->value() == 'on' ? 1 : 0,
			'post_poll' 		=> $this->selectPoll(Request::post('poll_id')->value()),
			'post_modified' 	=> date("Y-m-d H:i:s"),
		]);

		Msg::redirect(__('msg.change_saved'), 'success', url('post.id', ['id' => $data['id']]));
	}

	/**
	 * Cover Removal
	 *
	 * @return void
	 */
	function coverPostRemove()
	{
		$post = Availability::content(Request::param('id')->asPositiveInt(), 'id');

		// Удалять может только автор
		// Only the author can delete it
		if ($this->container->access()->author('post', $post) == false) {
			Msg::redirect(__('msg.went_wrong'), 'error');
		}

		PublicationModel::setPostImgRemove($post['post_id']);
		UploadImage::coverPostRemove($post['post_content_img']);

		Msg::redirect(__('msg.cover_removed'), 'success', url('publication.form.edit', ['id' => $post['post_id']]));
	}

	public function uploadContentImage()
	{
		$type       = Request::param('type')->value();
		$id         = Request::param('id')->asInt();

		if (!in_array($type, ['post-telo', 'comment'])) {
			return false;
		}

		$img = $_FILES['file'];
		if ($_FILES['file']['name']) {
			return json_encode(['data' => ['filePath' => UploadImage::postImg($img, $type, $id)]]);
		}

		return false;
	}

	public function checkingEditPermissions(array $post, array $blog)
	{
		if (empty($blog)) {
			if ($this->container->access()->author('post', $post) == false) {
				Msg::redirect(__('msg.access_denied'), 'error');
			}
		} else {
			if ($this->container->access()->postAuthor($post, $blog[0]['facet_user_id'] ?? 0) == false) {
				Msg::redirect(__('msg.access_denied'), 'error');
			}
		}

		return true;
	}
}