PageRenderTime 28ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/events/classes/view/event/edit.php

https://github.com/anqh/anqh
PHP | 484 lines | 372 code | 64 blank | 48 comment | 19 complexity | 1f2813400f3f703baa99fa313398f643 MD5 | raw file
  1. <?php defined('SYSPATH') or die('No direct access allowed.');
  2. /**
  3. * Event edit form.
  4. *
  5. * @package Events
  6. * @author Antti Qvickström
  7. * @copyright (c) 2012-2014 Antti Qvickström
  8. * @license http://www.opensource.org/licenses/mit-license.php MIT license
  9. */
  10. class View_Event_Edit extends View_Article {
  11. /** @var string URL for cancel action */
  12. public $cancel;
  13. /** @var Model_Event */
  14. public $event;
  15. /** @var array */
  16. public $event_errors;
  17. /** @var string */
  18. public $flyer_error;
  19. /** @var Model_Venue */
  20. public $venue;
  21. /** @var array */
  22. public $venue_errors;
  23. /**
  24. * Create new view.
  25. *
  26. * @param Model_Event $event
  27. */
  28. public function __construct(Model_Event $event) {
  29. parent::__construct();
  30. $this->event = $event;
  31. }
  32. /**
  33. * Render content.
  34. *
  35. * @return string
  36. */
  37. public function content() {
  38. ob_start();
  39. ?>
  40. <div id="preview"></div>
  41. <?= Form::open(null, array('id' => 'form-event', 'class' => 'row')) ?>
  42. <div class="col-md-8">
  43. <?php if ($this->event_errors || $this->venue_errors): ?>
  44. <div class="alert alert-danger">
  45. <strong><?= __('Error happens!') ?></strong>
  46. <ul class="">
  47. <?php foreach ((array)$this->event_errors as $error): ?>
  48. <li><?= $error ?></li>
  49. <?php endforeach; ?>
  50. <?php foreach ((array)$this->venue_errors as $error): ?>
  51. <li><?= __('Venue') ?>: <?= $error ?></li>
  52. <?php endforeach; ?>
  53. </ul>
  54. </div>
  55. <?php endif; ?>
  56. <fieldset id="fields-primary">
  57. <?= Form::input_wrap(
  58. 'name',
  59. $this->event->name,
  60. array('class' => 'input-lg'),
  61. __('Name'),
  62. Arr::get($this->event_errors, 'name'),
  63. __("Please don't use dates in the name, looks nasty everywhere as the date is usually shown automagically.")
  64. ) ?>
  65. <?= Form::textarea_wrap(
  66. 'info',
  67. $this->event->info,
  68. array('class' => 'input-lg', 'rows' => 20),
  69. true,
  70. __('Information'),
  71. Arr::get($this->event_errors, 'info'),
  72. __('Remember, only the first few rows are visible in the calendar view.'),
  73. true
  74. ) ?>
  75. </fieldset>
  76. <fieldset>
  77. <?= Form::button('save', __('Save event'), array('type' => 'submit', 'class' => 'btn btn-success btn-lg')) ?>
  78. <?= Form::button('preview', __('Preview'), array(
  79. 'class' => 'btn btn-default btn-lg',
  80. 'data-content-class' => '*',
  81. 'data-prepend' => '#preview',
  82. )) ?>
  83. <?= $this->cancel ? HTML::anchor($this->cancel, __('Cancel'), array('class' => 'cancel')) : '' ?>
  84. <?= Form::csrf() ?>
  85. <?= Form::hidden('latitude', $this->venue->latitude, array('data-geo' => 'lat')) ?>
  86. <?= Form::hidden('longitude', $this->venue->longitude, array('data-geo' => 'lng')) ?>
  87. <?= Form::hidden('city', $this->event->city_name, array('data-geo' => 'locality')) ?>
  88. <?= Form::hidden('venue_id', $this->venue->id) ?>
  89. <?= Form::hidden('foursquare_id', $this->venue->foursquare_id) ?>
  90. </fieldset>
  91. </div>
  92. <div class="col-md-4">
  93. <fieldset id="fields-when" class="row form-inline">
  94. <div class="col-md-3">
  95. <?= Form::input_wrap(
  96. 'stamp_begin[date]',
  97. is_numeric($this->event->stamp_begin) ? Date::format('DMYYYY', $this->event->stamp_begin) : $this->event->stamp_begin,
  98. array('class' => 'date', 'maxlength' => 10, 'size' => 7, 'placeholder' => 'd.m.yyyy'),
  99. __('From'),
  100. Arr::Get($this->event_errors, 'stamp_begin')
  101. ) ?>
  102. </div>
  103. <div class="col-md-3">
  104. <?= Form::select_wrap(
  105. 'stamp_begin[time]',
  106. array_reverse(Date::hours_minutes(30, true)),
  107. is_numeric($this->event->stamp_begin) ? Date::format('HHMM', $this->event->stamp_begin) : (empty($this->event->stamp_begin) ? '22:00' : $this->event->stamp_begin),
  108. array('class' => 'time'),
  109. '&nbsp;',
  110. Arr::get($this->event_errors, 'stamp_begin')
  111. ) ?>
  112. </div>
  113. <div class="col-md-3">
  114. <?= Form::select_wrap(
  115. 'stamp_end[time]',
  116. Date::hours_minutes(30, true),
  117. is_numeric($this->event->stamp_end) ? Date::format('HHMM', $this->event->stamp_end) : (empty($this->event->stamp_end) ? '04:00' : $this->event->stamp_end),
  118. array('class' => 'time'),
  119. __('To'),
  120. Arr::get($this->event_errors, 'stamp_end')
  121. ) ?>
  122. </div>
  123. <div class="col-md-3">
  124. <?= Form::input_wrap(
  125. 'stamp_end[date]',
  126. is_numeric($this->event->stamp_end) ? Date::format('DMYYYY', $this->event->stamp_end) : $this->event->stamp_end,
  127. array('class' => 'date', 'maxlength' => 10, 'size' => 7, 'placeholder' => 'd.m.yyyy'),
  128. '&nbsp;',
  129. Arr::Get($this->event_errors, 'stamp_end')
  130. ) ?>
  131. </div>
  132. </fieldset>
  133. <br>
  134. <fieldset id="fields-venue" class="row">
  135. <div class="col-md-12">
  136. <?= Form::input_wrap(
  137. 'city_name',
  138. $this->event->city_name,
  139. null,
  140. __('City'),
  141. Arr::get($this->event_errors, 'city_name')
  142. ) ?>
  143. </div>
  144. <div class="col-md-7">
  145. <?= Form::input_wrap(
  146. 'venue_name',
  147. $this->event->venue_name,
  148. (bool)$this->event->venue_hidden ? array('disabled') : null,
  149. __('Venue'),
  150. Arr::get($this->event_errors, 'venue_name')
  151. ) ?>
  152. </div>
  153. <div class="col-md-5">
  154. <br>
  155. <?= Form::checkbox_wrap(
  156. 'venue_hidden',
  157. 'true',
  158. (bool)$this->event->venue_hidden,
  159. array('id' => 'field-ug'),
  160. __('Underground')
  161. ) ?>
  162. </div>
  163. <div class="col-md-12 venue-placeholder hidden">
  164. <label><?= __('Venue') ?></label>
  165. <p>
  166. <span class="venue-name"><?= $this->event->venue_name ?></span>,
  167. <span class="venue-city"><?= $this->event->city_name ?></span>
  168. <a href="#venue"><?= __('Change') ?></a>
  169. </p>
  170. </div>
  171. </fieldset>
  172. <div id="map" class="well"></div>
  173. <fieldset>
  174. <?php if (!$this->event->flyer_id) echo
  175. Form::input_wrap(
  176. 'flyer',
  177. $this->event->flyer_url,
  178. array('type' => 'url', 'placeholder' => 'http://'),
  179. __('Flyer'),
  180. $this->flyer_error,
  181. __('If you have the flyer only locally you can upload it after saving the event.')
  182. ) ?>
  183. <?= Form::input_wrap(
  184. 'url',
  185. $this->event->url,
  186. array('type' => 'url', 'placeholder' => 'http://'),
  187. __('Homepage'),
  188. Arr::get($this->event_errors, 'url')
  189. ) ?>
  190. </fieldset>
  191. <fieldset id="fields-tickets" class="row">
  192. <div class="col-md-4">
  193. <?= Form::input_wrap(
  194. 'price',
  195. $this->event->price,
  196. $this->event->price === '0.00' ? array('disabled', 'type' => 'number', 'min' => 0, 'step' => 0.5) : array('type' => 'number', 'min' => 0, 'step' => 0.5),
  197. __('Tickets'),
  198. Arr::get($this->event_errors, 'tickets'),
  199. null,
  200. '&euro;'
  201. ) ?>
  202. </div>
  203. <div class="col-md-8">
  204. <br>
  205. <?= Form::checkbox_wrap(
  206. 'free',
  207. 'true',
  208. $this->event->price === '0.00',
  209. array('id' => 'field-free'),
  210. __('Free entry')
  211. ) ?>
  212. </div>
  213. <div class="col-md-12">
  214. <?= Form::input_wrap(
  215. 'ticket_url',
  216. $this->event->ticket_url,
  217. array('placeholder' => 'http://'),
  218. __('Buy tickets from'),
  219. Arr::get($this->event_errors, 'ticket_url')
  220. ) ?>
  221. </div>
  222. <div class="col-md-5">
  223. <?= Form::input_wrap(
  224. 'age',
  225. $this->event->age,
  226. array('type' => 'number', 'min' => 0, 'max' => 50, 'maxlength' => 3),
  227. __('Age limit'),
  228. Arr::get($this->event_errors, 'age'),
  229. null,
  230. __('years')
  231. ) ?>
  232. </div>
  233. </fieldset>
  234. <fieldset id="fields-music">
  235. <?= Form::checkboxes_wrap(
  236. 'tag',
  237. $this->tags(),
  238. $this->event->tags(),
  239. array('class' => 'block-grid three-up'),
  240. __('Music'),
  241. $this->event_errors
  242. ) ?>
  243. </fieldset>
  244. </div>
  245. <?php
  246. echo Form::close();
  247. echo $this->javascript();
  248. return ob_get_clean();
  249. }
  250. /**
  251. * Get JavaScripts.
  252. *
  253. * @return string
  254. */
  255. public function javascript() {
  256. // Date picker options
  257. $datepicker = array(
  258. 'changeMonth' => true,
  259. 'changeYear' => true,
  260. 'dateFormat' => 'd.m.yy',
  261. 'dayNames' => array(
  262. __('Sunday'), __('Monday'), __('Tuesday'), __('Wednesday'), __('Thursday'), __('Friday'), __('Saturday')
  263. ),
  264. 'dayNamesMin' => array(
  265. __('Su'), __('Mo'), __('Tu'), __('We'), __('Th'), __('Fr'), __('Sa')
  266. ),
  267. 'firstDay' => 1,
  268. 'monthNames' => array(
  269. __('January'), __('February'), __('March'), __('April'), __('May'), __('June'),
  270. __('July'), __('August'), __('September'), __('October'), __('November'), __('December')
  271. ),
  272. 'monthNamesShort' => array(
  273. __('Jan'), __('Feb'), __('Mar'), __('Apr'), __('May'), __('Jun'),
  274. __('Jul'), __('Aug'), __('Sep'), __('Oct'), __('Nov'), __('Dec')
  275. ),
  276. 'nextText' => '&#9658;',
  277. 'prevText' => '&#9668;',
  278. 'showWeek' => true,
  279. 'showOtherMonths' => true,
  280. 'weekHeader' => __('Wk'),
  281. );
  282. $venues = Model_Venue::factory()->find_all_autocomplete();
  283. // Venues, Maps and tickets
  284. ob_start();
  285. ?>
  286. <script>
  287. head.ready('anqh', function() {
  288. // Tickets
  289. $('#field-free input').on('click', function() {
  290. console.log($(this).is(':checked'));
  291. if ($(this).is(':checked')) {
  292. $('input[name=price]').attr('disabled', 'disabled');
  293. } else {
  294. $('input[name=price]').removeAttr('disabled');
  295. }
  296. });
  297. // Venue
  298. $('#field-ug input').on('click', function() {
  299. console.log(this.checked);
  300. if ($(this).is(':checked')) {
  301. $('input[name=venue_name]').attr('disabled', 'disabled');
  302. } else {
  303. $('input[name=venue_name]').removeAttr('disabled');
  304. }
  305. });
  306. // Datepicker
  307. var pickerOptions = <?= json_encode($datepicker) ?>
  308. , $dateBegin = $('input[name="stamp_begin[date]"]')
  309. , $dateEnd = $('input[name="stamp_end[date]"]');
  310. $dateEnd.datepicker(pickerOptions);
  311. $dateBegin.datepicker($.extend(pickerOptions, {
  312. onClose: function(dateText, inst) {
  313. var startDate = $dateBegin.datepicker('getDate');
  314. startDate.setDate(startDate.getDate() + 1);
  315. $dateEnd.datepicker('setDate', startDate);
  316. }
  317. }));
  318. // City autocomplete
  319. /* $('input[name=city_name]').placecomplete({
  320. requestParams: {
  321. types: [ '(cities)' ]
  322. }
  323. });*/
  324. var $city = $('input[name=city_name]');
  325. $city.geocomplete({
  326. map: '#map',
  327. details: '#form-event',
  328. detailsAttribute: 'data-geo',
  329. location: <?= $this->venue->latitude ? ('[ ' . $this->venue->latitude . ', ' . $this->venue->longitude . ' ]') : ("'" . ($this->event->city_name ? $this->event->city_name : 'Helsinki') . "'") ?>,
  330. types: [ '(cities)' ]
  331. });
  332. // Venue autocomplete
  333. function toggleVenue(toggle) {
  334. $('#fields-venue div').toggleClass('hidden', toggle);
  335. $('#fields-venue .venue-placeholder').toggleClass('hidden', !toggle);
  336. }
  337. var $latitude = $('input[name=latitude]')
  338. , $longitude = $('input[name=longitude]');
  339. var venues = <?= json_encode($venues) ?>;
  340. $('input[name=venue_name]')
  341. .on('change', function() {
  342. $('input[name=venue_id]').val('');
  343. })
  344. .on('typeahead:selected', function(event, selection, name) {
  345. var map = $city.geocomplete('map')
  346. , marker = $city.geocomplete('marker');
  347. // Update form
  348. if (selection.foursquare_id) {
  349. $('input[name=venue_id]').val('');
  350. $('input[name=foursquare_id]').val(selection.foursquare_id);
  351. } else {
  352. $('input[name=venue_id]').val(selection.id);
  353. $('input[name=foursquare_id]').val('');
  354. }
  355. if (selection.latitude && selection.longitude) {
  356. $latitude.val(selection.latitude);
  357. $longitude.val(selection.longitude);
  358. var center = new google.maps.LatLng(selection.latitude, selection.longitude);
  359. map.setCenter(center);
  360. marker.setPosition(center);
  361. } else {
  362. $city.geocomplete('find', selection.city);
  363. }
  364. $('input[name=city_name], input[name=city]').val(selection.city);
  365. // Update label
  366. $('#fields-venue .venue-name').text(selection.value);
  367. $('#fields-venue .venue-city').text(selection.city || '');
  368. toggleVenue(true);
  369. })
  370. .typeahead([
  371. {
  372. name: 'local',
  373. header: '<header class="dropdown-header"><?= __('Existing') ?></header>',
  374. local: venues
  375. },
  376. {
  377. name: 'foursquare',
  378. header: '<header class="dropdown-header"><i class="fa fa-foursquare"></i> <?= __('Foursquare') ?></header>',
  379. remote: {
  380. url: Anqh.APIURL + '/v1/venues/foursquare',
  381. dataType: 'jsonp',
  382. replace: function(url, uriEncodedQuery) {
  383. return url += '?method=venues&ll=' + $latitude.val() + ',' + $longitude.val() + '&query=' + uriEncodedQuery;
  384. },
  385. filter: function(parsedResponse) {
  386. return parsedResponse.venues || [];
  387. }
  388. }
  389. }
  390. ]);
  391. $('.venue-placeholder a').on('click', function() {
  392. toggleVenue(false);
  393. return false;
  394. });
  395. <?php if (!$this->venue_errors && $this->event->venue_name && $this->event->city_name): ?>
  396. toggleVenue(true);
  397. <?php endif; ?>
  398. });
  399. </script>
  400. <?php
  401. return ob_get_clean();
  402. }
  403. /**
  404. * Get available tags.
  405. *
  406. * @return array
  407. */
  408. public function tags() {
  409. $tags = array();
  410. $tag_group = new Model_Tag_Group('Music');
  411. if ($tag_group->loaded() && count($tag_group->tags())) {
  412. foreach ($tag_group->tags() as $tag) {
  413. $tags[$tag->id()] = $tag->name();
  414. }
  415. }
  416. return $tags;
  417. }
  418. }