PageRenderTime 50ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/src/modules/PostCalendar/lib/PostCalendar/Controller/Event.php

https://github.com/espaan/PostCalendar
PHP | 245 lines | 161 code | 27 blank | 57 comment | 32 complexity | 272c7abb3718a2a8aca627af19fa38d4 MD5 | raw file
  1. <?php
  2. /**
  3. * @package PostCalendar
  4. * @copyright Copyright (c) 2002, The PostCalendar Team
  5. * @copyright Copyright (c) 2009-2012, Craig Heydenburg, Sound Web Development
  6. * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
  7. */
  8. use PostCalendar_Entity_CalendarEvent as CalendarEvent;
  9. class PostCalendar_Controller_Event extends Zikula_AbstractController
  10. {
  11. public function postInitialize()
  12. {
  13. $this->view->setCaching(false);
  14. }
  15. /**
  16. * This is a user form 'are you sure' display
  17. * to delete an event
  18. */
  19. public function delete()
  20. {
  21. $this->throwForbiddenUnless(SecurityUtil::checkPermission('PostCalendar::', '::', ACCESS_ADD), LogUtil::getErrorMsgPermission());
  22. $eid = $this->request->query->get('eid'); // seems like this should be handled by the eventHandler
  23. $render = FormUtil::newForm('PostCalendar', $this);
  24. // get the event from the DB
  25. $event = $this->entityManager->getRepository('PostCalendar_Entity_CalendarEvent')->find($eid)->getOldArray();
  26. $event = ModUtil::apiFunc('PostCalendar', 'event', 'formateventarrayfordisplay', array('event' => $event));
  27. $render->assign('loaded_event', $event);
  28. return $render->execute('event/deleteeventconfirm.tpl', new PostCalendar_Form_Handler_EditHandler());
  29. }
  30. /**
  31. * edit an event
  32. */
  33. public function edit($args)
  34. {
  35. $args['eid'] = $this->request->query->get('eid');
  36. return $this->create($args);
  37. }
  38. /**
  39. * copy an event
  40. */
  41. public function copy($args)
  42. {
  43. $args['eid'] = $this->request->query->get('eid');
  44. return $this->create($args);
  45. }
  46. /**
  47. * @desc create an event
  48. *
  49. * This form can be loaded in nine states:
  50. * new event (first pass): no previous values, need defaults
  51. * $func=new, data_loaded=false, form_action=NULL
  52. * new event preview (subsequent pass): loaded form values refilled into form w/preview (also triggered if form does not validate - e.g. abort=true)
  53. * $func=new, data_loaded=true, form_action=preview
  54. * new event submit (subsequent pass): loaded form values - write to DB
  55. * $func=new, data_loaded=true, form_action=save
  56. * edit existing event (first pass): load existing values from DB and fill into form
  57. * $func=edit, data_loaded=true, form_action=NULL
  58. * edit event preview (subsequent pass): loaded form values refilled into form w/preview (also triggered if form does not validate - e.g. abort=true)
  59. * $func=edit, data_loaded=true, form_action=preview
  60. * edit event save (subsequent pass): loaded form values - write to DB
  61. * see same for 'new'
  62. * copy existing event (first pass): load existing values from DB and fill into to form
  63. * $func=copy, data_loaded=true, form_action=NULL
  64. * copy becomes 'new' after first pass - see new event preview and new event submit above
  65. *
  66. * expected $args = 'eid'
  67. **/
  68. public function create($args)
  69. {
  70. // We need at least ADD permission to submit an event
  71. $this->throwForbiddenUnless(SecurityUtil::checkPermission('PostCalendar::', '::', ACCESS_ADD), LogUtil::getErrorMsgPermission());
  72. // these items come on brand new view of this function
  73. $func = $this->request->query->get('func', 'create');
  74. $date = $this->request->query->get('date');
  75. $date = PostCalendar_Util::getDate(array(
  76. 'date' => $date));
  77. // these items come on submission of form
  78. $submitted_event = $this->request->request->get('postcalendar_events', NULL);
  79. // process checkboxes
  80. $submitted_event['alldayevent'] = (isset($submitted_event['alldayevent'])) ? $submitted_event['alldayevent'] : 0;
  81. $submitted_event['html_or_text'] = (isset($submitted_event['html_or_text'])) ? $submitted_event['html_or_text'] : 0;
  82. $submitted_event['recurrtype'] = (isset($submitted_event['recurrtype'])) ? $submitted_event['recurrtype'] : CalendarEvent::RECURRTYPE_NONE;
  83. $submitted_event['hasexceptions'] = (isset($submitted_event['hasexceptions'])) ? $submitted_event['hasexceptions'] : 0;
  84. $is_update = $this->request->request->get('is_update', false);
  85. $form_action = $this->request->request->get('form_action', NULL);
  86. // compensate for translation of input values
  87. if (isset($form_action)) {
  88. $formactionarraymap = array(
  89. $this->__('Save') => 'save',
  90. $this->__('Save and Add') => 'save and add',
  91. $this->__('Preview') => 'preview');
  92. $form_action = $formactionarraymap[$form_action];
  93. }
  94. $addtrigger = false;
  95. if ($form_action == 'save and add') {
  96. $form_action = 'save';
  97. $addtrigger = true;
  98. }
  99. // VALIDATE form data if form action is preview or save
  100. $abort = false;
  101. if (($form_action == 'preview') || ($form_action == 'save')) {
  102. // make DateTime objects from form data
  103. $submitted_event['eventStart'] = DateTime::createFromFormat("Y-m-d G:i", $submitted_event['eventstart_date'] . " " . $submitted_event['eventstart_time']);
  104. $submitted_event['eventEnd'] = DateTime::createFromFormat("Y-m-d G:i", $submitted_event['eventend_date'] . " " . $submitted_event['eventend_time']);
  105. $submitted_event['endDate'] = DateTime::createFromFormat('Y-m-d', $submitted_event['enddate']);
  106. unset($submitted_event['eventstart_date'], $submitted_event['eventstart_time'], $submitted_event['eventend_date'], $submitted_event['eventend_time'], $submitted_event['enddate']);
  107. $abort = ModUtil::apiFunc('PostCalendar', 'event', 'validateformdata', $submitted_event);
  108. // check hooked modules for validation
  109. $hook = new Zikula_ValidationHook('postcalendar.ui_hooks.events.validate_edit', new Zikula_Hook_ValidationProviders());
  110. $hookvalidators = $this->notifyHooks($hook)->getValidators();
  111. $abort = $abort || $hookvalidators->hasErrors() ? true : false;
  112. if ($hookvalidators->hasErrors()) {
  113. LogUtil::registerError($this->__('Error! Hooked content does not validate.'));
  114. }
  115. }
  116. if ($func == 'create') { // triggered on form_action=preview && on brand new load
  117. $eventdata = array();
  118. // wrap all the data into array for passing to save and preview functions
  119. if ((isset($submitted_event['data_loaded'])) && (!empty($submitted_event['data_loaded']))) {
  120. $eventdata = $submitted_event; // data loaded on preview and processing of new event, but not on initial pageload
  121. }
  122. $eventdata['is_update'] = $is_update;
  123. $eventdata['data_loaded'] = true;
  124. } else { // func=edit or func=copy (we are editing an existing event or copying an existing event)
  125. if ((isset($submitted_event['data_loaded'])) && ($submitted_event['data_loaded'])) {
  126. $eventdata = $submitted_event; // reloaded event when editing
  127. } else {
  128. // here were need to format the DB data to be able to load it into the form
  129. $eid = $args['eid'];
  130. $eventdata = $this->entityManager
  131. ->getRepository('PostCalendar_Entity_CalendarEvent')
  132. ->findOneBy(array('eid' => $eid))
  133. ->getOldArray();
  134. $eventdata = ModUtil::apiFunc('PostCalendar', 'event', 'formateventarrayfordisplay', array('event' => $eventdata));
  135. }
  136. // need to check each of these below to see if truly needed CAH 11/14/09
  137. $eventdata['date'] = $date->format('Y-m-d');
  138. $eventdata['is_update'] = true;
  139. $eventdata['data_loaded'] = true;
  140. }
  141. if ($func == 'copy') {
  142. // reset some default values that are different from 'edit'
  143. $form_action = '';
  144. $func = "create"; // change function so data is processed as 'new' in subsequent pass
  145. unset($args['eid']);
  146. unset($eventdata['eid']);
  147. $eventdata['is_update'] = false;
  148. $eventdata['informant'] = UserUtil::getVar('uid');
  149. }
  150. if ($abort) {
  151. $form_action = 'preview'; // data not sufficient for save. force preview and correct.
  152. }
  153. // Preview the event
  154. if ($form_action == 'preview') {
  155. $eventdata['preview'] = true;
  156. // format the data for editing
  157. $eventdata = ModUtil::apiFunc('PostCalendar', 'event', 'formateventarrayforDB', $eventdata);
  158. // reformat the category information
  159. foreach ($eventdata['categories'] as $name => $id) {
  160. $categories[$name] = CategoryUtil::getCategoryByID($id);
  161. }
  162. unset($eventdata['categories']);
  163. $eventdata['categories'] = $categories;
  164. // format the data for preview
  165. $eventdata = ModUtil::apiFunc('PostCalendar', 'event', 'formateventarrayfordisplay', array('event' => $eventdata));
  166. } else {
  167. $eventdata['preview'] = "";
  168. }
  169. // Enter the event into the DB
  170. if ($form_action == 'save') {
  171. $this->checkCsrfToken();
  172. $eventdata = ModUtil::apiFunc('PostCalendar', 'event', 'formateventarrayforDB', $eventdata);
  173. if (!$eid = ModUtil::apiFunc('PostCalendar', 'event', 'writeEvent', array(
  174. 'eventdata' => $eventdata))) {
  175. LogUtil::registerError($this->__('Error! Submission failed.'));
  176. } else {
  177. $url = new Zikula_ModUrl('PostCalendar', 'user', 'display', ZLanguage::getLanguageCode(), array('viewtype' => 'event', 'eid' => $eid));
  178. $this->notifyHooks(new Zikula_ProcessHook('postcalendar.ui_hooks.events.process_edit', $eid, $url));
  179. $this->view->clear_cache();
  180. $dateFormat = $this->getVar('pcDateFormats');
  181. if ($is_update) {
  182. LogUtil::registerStatus($this->__f('Done! Updated the event. (event date: %s)', $submitted_event['eventStart']->format($dateFormat['date'])));
  183. } else {
  184. LogUtil::registerStatus($this->__f('Done! Submitted the event. (event date: %s)', $submitted_event['eventStart']->format($dateFormat['date'])));
  185. }
  186. if ((int)$eventdata['eventstatus'] === (int)CalendarEvent::QUEUED) {
  187. LogUtil::registerStatus($this->__('The event has been queued for administrator approval.'));
  188. ModUtil::apiFunc('PostCalendar', 'admin', 'notify', array(
  189. 'eid' => $eid,
  190. 'is_update' => $is_update)); //notify admin
  191. }
  192. }
  193. if ($addtrigger) {
  194. System::redirect(ModUtil::url('PostCalendar', 'event', 'create'));
  195. } else {
  196. System::redirect(ModUtil::url('PostCalendar', 'user', 'display', array(
  197. 'viewtype' => $this->getVar('pcDefaultView'),
  198. 'date' => $submitted_event['eventStart']->format('Ymd'))));
  199. }
  200. return true;
  201. }
  202. $submitformelements = ModUtil::apiFunc('PostCalendar', 'event', 'buildSubmitForm', array(
  203. 'eventdata' => $eventdata,
  204. 'date' => $date)); //sets defaults or builds selected values
  205. foreach ($submitformelements as $var => $val) {
  206. $this->view->assign($var, $val);
  207. }
  208. // assign function in case we were editing
  209. $this->view->assign('func', $func);
  210. $navBar = new PostCalendar_CalendarView_Navigation($this->view, $date, null, null, null, array(
  211. 'filter' => false,
  212. 'jumpdate' => false,
  213. 'navbar' => true,
  214. 'navbartype' => $this->getVar('pcNavBarType')));
  215. $this->view->assign('navBar', $navBar->render());
  216. return $this->view->fetch("event/submit.tpl");
  217. }
  218. } // end class def