Your IP : 216.73.216.240


Current Path : /home/j/u/v/juvelize/www/components/com_icagenda/src/Controller/
Upload File :
Current File : /home/j/u/v/juvelize/www/components/com_icagenda/src/Controller/EventController.php

<?php
/**
 *----------------------------------------------------------------------------
 * iCagenda     Events Management Extension for Joomla!
 *----------------------------------------------------------------------------
 * @version     3.9.5 2024-07-01
 *
 * @package     iCagenda.Site
 * @subpackage  src.Controller
 * @link        https://www.icagenda.com
 *
 * @author      Cyril Rezé
 * @copyright   (c) 2012-2024 Cyril Rezé / iCagenda. All rights reserved.
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 *
 * @since       3.8
 *----------------------------------------------------------------------------
*/

namespace WebiC\Component\iCagenda\Site\Controller;

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\LanguageHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\FormController;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Versioning\VersionableControllerTrait;

/**
 * Event controller class for iCagenda.
 */
class EventController extends FormController
{
	use VersionableControllerTrait;

	/**
	 * The URL view item variable.
	 *
	 * @var    string
	 */
	protected $view_item = 'manager';

	/**
	 * The URL view list variable.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $view_list = 'events';

	/**
	 * The URL edit variable.
	 *
	 * @var    string
	 */
	protected $urlVar = 'e.id';

	/**
	 * Method to cancel an edit.
	 *
	 * @param   string  $key  The name of the primary key of the URL variable.
	 *
	 * @return  boolean  True if access level checks pass, false otherwise.
	 */
	public function cancel($key = 'event_id')
	{
		$result = parent::cancel($key);

		// Get the model.
//		$model = $this->getModel();

		// Check Out.
//		$table = $model->getTable();
//		$table->checkIn($key);

		$this->setRedirect(Route::_($this->getReturnPage(), false));

		return $result;
	}

	/**
	 * Method to check out an event for editing and redirect to the edit form.
	 *
	 * @return  boolean
	 */
	public function edit($key = null, $urlVar = 'event_id')
	{
		$app  = Factory::getApplication();
		$user = Factory::getUser();

		// Get the previous event id (if any) and the current user id.
		$previousId = (int) $app->getUserState('com_icagenda.edit.event.id');
		$eventId    = $this->input->getInt('event_id');
		$Itemid     = $this->input->getInt('Itemid');

		$cookieLogin = $user->get('cookieLogin');

		// Check if the user logged in with a cookie
		if (!empty($cookieLogin))
		{
			// If so, the user must login to edit the event.
			$app->enqueueMessage(Text::_('JGLOBAL_REMEMBER_MUST_LOGIN'), 'message');
			$this->setRedirect(Route::_('index.php?option=com_users&view=login', false));

			return false;
		}

		// Set the event id for the event to edit in the session.
		$app->setUserState('com_icagenda.edit.event.id', $eventId);

		// Get the model.
		$model = $this->getModel();

		// Check Out.
		$table = $model->getTable();
		$table->checkOut($user->get('id'), $eventId);

		// Redirect to the edit screen.
		$return  = $this->getReturnPage();

		// No SEF Routing due to suffix URL issue.
//		$this->setRedirect(Route::_('index.php?option=com_icagenda&view=manager&layout=event_edit&Itemid=' . $Itemid . '&event_id=' . $eventId . '&return=' . base64_encode($return), false));
		$this->setRedirect('index.php?option=com_icagenda&view=manager&layout=event_edit&Itemid=' . $Itemid . '&event_id=' . $eventId . '&return=' . base64_encode($return));

		return true;
	}

	/**
	 * Method to save a event data.
	 *
	 * @return  void
	 */
	public function save($key = null, $urlVar = 'event_id')
	{
		// Check for request forgeries.
		$this->checkToken();

		$app     = Factory::getApplication();
		$model   = $this->getModel();
		$user    = Factory::getUser();
		$eventId = (int) $app->input->get('event_id');

		// Get the user data.
		$requestData = $app->input->post->get('jform', array(), 'array');

		// Validate the posted data.
		$form = $model->getForm();

		if (!$form)
		{
			throw new \Exception($model->getError(), 500);
		}

		// Send an object which can be modified through the plugin event
//		$objData = (object) $requestData;
//		$app->triggerEvent(
//			'onIcagendaNormaliseRequestData',
//			array('com_icagenda.event', $objData, $form)
//		);
//		$requestData = (array) $objData;

		// Validate the posted data.
		$data = $model->validate($form, $requestData);

		// Check for errors.
		if ($data === false)
		{
			// Get the validation messages.
			$errors = $model->getErrors();

			// Push up to three validation messages out to the user.
			for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++)
			{
				if ($errors[$i] instanceof \Exception)
				{
					$app->enqueueMessage($errors[$i]->getMessage(), 'warning');
				}
				else
				{
					$app->enqueueMessage($errors[$i], 'warning');
				}
			}

			// Save the data in the session.
			$app->setUserState('com_icagenda.edit.event.data', $requestData);

			// Redirect back to the edit screen.
			$userId = (int) $app->getUserState('com_icagenda.edit.event.id');
			$this->setRedirect(Route::_('index.php?option=com_icagenda&view=manager&layout=event_edit&event_id=' . $eventId, false));

			return false;
		}

		// Attempt to save the data.
		$return = $model->save($data);

		// Check for errors.
		if ($return === false)
		{
			// Save the data in the session.
			$app->setUserState('com_icagenda.edit.event.data', $data);

			// Redirect back to the edit screen.
			$this->setMessage(Text::sprintf('COM_ICAGENDA_MANAGER_EVENT_SAVE_FAILED', $model->getError()), 'warning');
			$this->setRedirect(Route::_('index.php?option=com_icagenda&view=manager&layout=event_edit&event_id=' . $eventId, false));

			return false;
		}

		// Check In.
		$table = $model->getTable();
		$table->checkIn($eventId);

		$langTag = $data['language'];

		// Get the current language tag.
		$currentLanguage = Factory::getLanguage()->getTag();

		// @TODO: add message if language changed for the event after edit
		// OR try to get return page in new language set for the event.
		// Note: this return issue when changing language in frontend edit exists for Joomla articles as well
		//       where a 404 error page 'Article not found' is returned.
		//       See: https://github.com/joomla/joomla-cms/issues/43659

//		if ($langTag != $currentLanguage && $langTag !== '*') {
			// Get all languages.
//			$languages = LanguageHelper::getLanguages('lang_code');

			// Get the SEF tag of current language.
//			$sefTag = $languages[$currentLanguage]->sef;

//			if ($sefTag) {
//				$routeLang = '&lang=' . $sefTag;
//			} else {
//				$arr = explode("/", $currentLanguage, 2);
//				$first = $arr[0];
//				$routeLang = '&lang=' . $first;;
//			}
//		} else {
//			$routeLang = '';
//		}

		$menuitem = (int) $app->input->get('current_menuitem');

		$this->setMessage(Text::_('COM_ICAGENDA_MANAGER_EVENT_SAVE_SUCCESS'));

		if ($langTag != $currentLanguage && $langTag !== '*') {
			$this->setRedirect(Route::_('index.php?option=com_icagenda&view=events&Itemid=' . $menuitem));
		} else {
			$this->setRedirect(Route::_($this->getReturnPage(), false));
		}

//		$this->setRedirect(Route::_($this->getReturnPage() . $routeLang, false));

		// Flush the data from the session.
		$app->setUserState('com_icagenda.edit.event.data', null);

		return $result;
	}

	/**
	 * Method to get a model object, loading it if required.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  object  The model.
	 *
	 * @since   1.5
	 */
	public function getModel($name = 'Manager', $prefix = 'Site', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	/**
	 * Get the return URL.
	 *
	 * If a "return" variable has been passed in the request
	 *
	 * @return  string  The return URL.
	 */
	protected function getReturnPage()
	{
		$return = $this->input->get('return', null, 'base64');

		if (empty($return) || !Uri::isInternal(base64_decode($return))) {
			return Uri::base();
		} else {
			return base64_decode($return);
		}
	}
}