Your IP : 216.73.216.240
<?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);
}
}
}