forked from Public/pics
		
	
		
			
				
	
	
		
			195 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/*****************************************************************************
 | 
						|
 * EditTag.php
 | 
						|
 * Contains the tag edit controller.
 | 
						|
 *
 | 
						|
 * Kabuki CMS (C) 2013-2017, Aaron van Geffen
 | 
						|
 *****************************************************************************/
 | 
						|
 | 
						|
class EditTag extends HTMLController
 | 
						|
{
 | 
						|
	public function __construct()
 | 
						|
	{
 | 
						|
		$id_tag = isset($_GET['id']) ? (int) $_GET['id'] : 0;
 | 
						|
		if (empty($id_tag) && !isset($_GET['add']))
 | 
						|
			throw new UnexpectedValueException('Requested tag not found or not requesting a new tag.');
 | 
						|
 | 
						|
		if (!empty($id_tag))
 | 
						|
			$tag = Tag::fromId($id_tag);
 | 
						|
 | 
						|
		// Are we allowed to edit this tag?
 | 
						|
		$user = Registry::get('user');
 | 
						|
		if (!($user->isAdmin() || $user->getUserId() == $tag->id_user_owner))
 | 
						|
			throw new NotAllowedException();
 | 
						|
 | 
						|
		// Adding an tag?
 | 
						|
		if (isset($_GET['add']))
 | 
						|
		{
 | 
						|
			parent::__construct('Add a new tag');
 | 
						|
			$form_title = 'Add a new tag';
 | 
						|
			$this->page->addClass('edittag');
 | 
						|
		}
 | 
						|
		// Deleting one?
 | 
						|
		elseif (isset($_GET['delete']))
 | 
						|
		{
 | 
						|
			// So far so good?
 | 
						|
			if (Session::validateSession('get') && $tag->kind !== 'Album' && $tag->delete())
 | 
						|
			{
 | 
						|
				header('Location: ' . BASEURL . '/managetags/');
 | 
						|
				exit;
 | 
						|
			}
 | 
						|
			else
 | 
						|
				throw new Exception('Cannot delete tag: an error occured while processing the request.');
 | 
						|
		}
 | 
						|
		// Editing one, then, surely.
 | 
						|
		else
 | 
						|
		{
 | 
						|
			if ($tag->kind === 'Album')
 | 
						|
				throw new Exception('Cannot edit tag: is actually an album.');
 | 
						|
 | 
						|
			parent::__construct('Edit tag \'' . $tag->tag . '\'');
 | 
						|
			$form_title = 'Edit tag \'' . $tag->tag . '\'';
 | 
						|
			$this->page->addClass('edittag');
 | 
						|
		}
 | 
						|
 | 
						|
		// Session checking!
 | 
						|
		if (empty($_POST))
 | 
						|
			Session::resetSessionToken();
 | 
						|
		else
 | 
						|
			Session::validateSession();
 | 
						|
 | 
						|
		if ($id_tag)
 | 
						|
			$after_form = '<a href="' . BASEURL . '/edittag/?id=' . $id_tag . '&delete&' . Session::getSessionTokenKey() . '=' . Session::getSessionToken() . '" class="btn btn-danger" onclick="return confirm(\'Are you sure you want to delete this tag? You cannot undo this!\');">Delete tag</a>';
 | 
						|
		elseif (!$id_tag)
 | 
						|
			$after_form = '<button name="submit_and_new" class="btn">Save and add another</button>';
 | 
						|
 | 
						|
		$fields = [
 | 
						|
			'kind' => [
 | 
						|
				'type' => 'select',
 | 
						|
				'label' => 'Kind of tag',
 | 
						|
				'options' => [
 | 
						|
					'Location' => 'Location',
 | 
						|
					'Person' => 'Person',
 | 
						|
				],
 | 
						|
			],
 | 
						|
			'id_user_owner' => [
 | 
						|
				'type' => 'select',
 | 
						|
				'label' => 'Owner',
 | 
						|
				'options' => [0 => '(nobody)'] + Member::getMemberMap(),
 | 
						|
			],
 | 
						|
			'tag' => [
 | 
						|
				'type' => 'text',
 | 
						|
				'label' => 'Tag title',
 | 
						|
				'size' => 50,
 | 
						|
				'maxlength' => 255,
 | 
						|
			],
 | 
						|
			'slug' => [
 | 
						|
				'type' => 'text',
 | 
						|
				'label' => 'URL slug',
 | 
						|
				'size' => 50,
 | 
						|
				'maxlength' => 255,
 | 
						|
			],
 | 
						|
			'description' => [
 | 
						|
				'type' => 'textbox',
 | 
						|
				'label' => 'Description',
 | 
						|
				'size' => 50,
 | 
						|
				'maxlength' => 255,
 | 
						|
				'is_optional' => true,
 | 
						|
			],
 | 
						|
		];
 | 
						|
 | 
						|
		if (!$user->isAdmin())
 | 
						|
		{
 | 
						|
			unset($fields['kind']);
 | 
						|
			unset($fields['id_user_owner']);
 | 
						|
		}
 | 
						|
 | 
						|
		$form = new Form([
 | 
						|
			'request_url' => BASEURL . '/edittag/?' . ($id_tag ? 'id=' . $id_tag : 'add'),
 | 
						|
			'buttons_extra' => $after_form,
 | 
						|
			'fields' => $fields,
 | 
						|
		]);
 | 
						|
 | 
						|
		// Create the form, add in default values.
 | 
						|
		$form->setData($id_tag ? get_object_vars($tag) : $_POST);
 | 
						|
		$formview = new FormView($form, $form_title ?? '');
 | 
						|
		$this->page->adopt($formview);
 | 
						|
 | 
						|
		if (!empty($id_tag))
 | 
						|
		{
 | 
						|
			list($assets, $num_assets) = AssetIterator::getByOptions([
 | 
						|
				'direction' => 'desc',
 | 
						|
				'limit' => 500,
 | 
						|
				'id_tag' => $id_tag,
 | 
						|
			], true);
 | 
						|
 | 
						|
			if ($num_assets > 0)
 | 
						|
				$this->page->adopt(new FeaturedThumbnailManager($assets, $id_tag ? $tag->id_asset_thumb : 0));
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($_POST['changeThumbnail']))
 | 
						|
			$this->processThumbnail($tag);
 | 
						|
		elseif (!empty($_POST))
 | 
						|
			$this->processTagDetails($form, $id_tag, $tag ?? null);
 | 
						|
	}
 | 
						|
 | 
						|
	private function processThumbnail($tag)
 | 
						|
	{
 | 
						|
		if (empty($_POST))
 | 
						|
			return;
 | 
						|
 | 
						|
		$tag->id_asset_thumb = $_POST['featuredThumbnail'];
 | 
						|
		$tag->save();
 | 
						|
 | 
						|
		header('Location: ' . BASEURL . '/edittag/?id=' . $tag->id_tag);
 | 
						|
		exit;
 | 
						|
	}
 | 
						|
 | 
						|
	private function processTagDetails($form, $id_tag, $tag)
 | 
						|
	{
 | 
						|
		if (!empty($_POST))
 | 
						|
		{
 | 
						|
			$form->verify($_POST);
 | 
						|
 | 
						|
			// Anything missing?
 | 
						|
			if (!empty($form->getMissing()))
 | 
						|
				return $formview->adopt(new Alert('Some data missing', 'Please fill out the following fields: ' . implode(', ', $form->getMissing()), 'danger'));
 | 
						|
 | 
						|
			$data = $form->getData();
 | 
						|
			$data['id_parent'] = 0;
 | 
						|
 | 
						|
			// Quick stripping.
 | 
						|
			$data['slug'] = strtr($data['slug'], [' ' => '-', '--' => '-', '&' => 'and', '=>' => '', "'" => "", ":"=> "", '/' => '-', '\\' => '-']);
 | 
						|
 | 
						|
			// Creating a new tag?
 | 
						|
			if (!$id_tag)
 | 
						|
			{
 | 
						|
				$return = Tag::createNew($data);
 | 
						|
				if ($return === false)
 | 
						|
					return $formview->adopt(new Alert('Cannot create this tag', 'Something went wrong while creating the tag...', 'danger'));
 | 
						|
 | 
						|
				if (isset($_POST['submit_and_new']))
 | 
						|
				{
 | 
						|
					header('Location: ' . BASEURL . '/edittag/?add');
 | 
						|
					exit;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			// Just updating?
 | 
						|
			else
 | 
						|
			{
 | 
						|
				foreach ($data as $key => $value)
 | 
						|
					$tag->$key = $value;
 | 
						|
 | 
						|
				$tag->save();
 | 
						|
			}
 | 
						|
 | 
						|
			// Redirect to a clean page
 | 
						|
			if (Registry::get('user')->isAdmin())
 | 
						|
				header('Location: ' . BASEURL . '/managetags/');
 | 
						|
			else
 | 
						|
				header('Location: ' . BASEURL . '/edittag/?id=' . $id_tag);
 | 
						|
			exit;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |