hab heute das Event-Modul angepasst.
In unserem Spiel gibt es Events, welche oftmals über mehrere Tage laufen.
Und ich wollte auch das man sich noch während des laufenden Events eintragen / anmelden kann.
Zu den
- kommenden Events (upcoming)
- gelaufenen Events (past)
hab ich
- laufende Events (enduring)
..hinzugefügt.
In diesem Tutorial beschreibe ich Euch wie Ihr das ebenfalls bewerkstelligen könnt.
Grundwissen in Handhabung von FTP Programm / besser noch Texteditor wie PSPad,
sowie Grundkenntnisse Programmierung setze ich voraus.
Schritt 1
Zu ändernde Datei:
/application/modules/events/views/show/event.php
Zeile 58
<?php if ($this->getUser() AND $event->getStart() > new \Ilch\Date()): ?>
ändern in:
<?php if ($this->getUser() AND $event->getEnd() > new \Ilch\Date()): ?>
Damit haben wir schon erreicht das man sich noch während eines laufenden Events eintragen kann.
Schritt 2
Folgenden Ordner öffnen:
/application/modules/events/views/show/
Neue (leere) Datei anlegen mit folgendem Namen: enduring.php
Folgenden Code in die leere Datei einfügen und danach speichern:
<?php $entrantsMapper = $this->get('entrantsMapper'); ?> <?php include APPLICATION_PATH.'/modules/events/views/index/navi.php'; ?> <h1><?=$this->getTrans('menuEventEnduring') ?></h1> <div class="row"> <div class="col-lg-12"> <ul class="event-list"> <?php if ($this->get('eventListEnduring') != ''): ?> <?php foreach ($this->get('eventListEnduring') as $eventlist): ?> <?php $eventEntrants = $entrantsMapper->getEventEntrantsById($eventlist->getId()) ?> <?php $date = new \Ilch\Date($eventlist->getStart()); ?> <?php $agree = 0; $maybe = 0; ?> <?php if (is_in_array($this->get('readAccess'), explode(',', $eventlist->getReadAccess())) OR $this->getUser() AND $this->getUser()->hasAccess('module_events')): ?> <li> <time> <span class="day"><?=$date->format("j", true) ?></span> <span class="month"><?=$this->getTrans($date->format('M', true)) ?></span> </time> <div class="info"> <h2 class="title"><a href="<?=$this->getUrl('events/show/event/id/' . $eventlist->getId()) ?>"><?=$this->escape($eventlist->getTitle()) ?></a></h2> <p class="desc"> <?php $place = explode(', ', $this->escape($eventlist->getPlace()), 2); ?> <?=$place[0] ?> <?php if (!empty($place[1])): ?> <br /><span class="text-muted"><?=$place[1] ?></span> <?php endif; ?> </p> <?php if ($eventEntrants != ''): ?> <?php foreach ($eventEntrants as $eventEntrantsUser): ?> <?php if ($eventEntrantsUser->getStatus() == 1): ?> <?php $agree++; ?> <?php elseif ($eventEntrantsUser->getStatus() == 2): ?> <?php $maybe++; ?> <?php endif; ?> <?php endforeach; ?> <?php endif; ?> <ul> <?php if ($eventlist->getUserLimit() > 0): ?> <li style="width:25%;"><?=$this->getTrans('guest') ?></li> <li style="width:25%;"><?=$agree ?> <i class="fa fa-check"></i></li> <li style="width:25%;"><?=$maybe ?> <i class="fa fa-question"></i></li> <li style="width:25%;"><?=$eventlist->getUserLimit() ?> <i class="fa fa-users"></i></li> <?php else: ?> <li style="width:33%;"><?=$this->getTrans('guest') ?></li> <li style="width:33%;"><?=$agree ?> <i class="fa fa-check"></i></li> <li style="width:33%;"><?=$maybe ?> <i class="fa fa-question"></i></li> <?php endif; ?> </ul> </div> </li> <?php endif; ?> <?php endforeach; ?> <?php else: ?> <?=$this->getTrans('noEvent') ?> <?php endif; ?> </ul> </div> </div>
Schritt 3
Zu ändernde Datei:
/application/modules/events/translations/de.php
ca. Zeile 29 (genaue Zeilenzahl dabei nicht so wichtig) neue Zeile mit folgendem Code einfügen:
'menuEventEnduring' => 'Laufende Events',
Bemerkung: Du kannst es selbstverständlich auch "Laufende Events" oder etwas anderes Deiner Wahl nennen - Eintrag erscheint später direkt in der Eventliste über den laufenden Events als Überschrift.
ca. Zeile 50 (genaue Zeilenzahl dabei nicht so wichtig) neue Zeile mit folgendem Code einfügen:
'naviEventsEnduring' => 'Laufende',
Danach Datei speichern
Bemerkung: Du kannst dies ebenfalls benennen wie Du möchtest - erscheint später oben im Eventmenü.
Die gleiche Aktion (2 Einträge) führst Du auch in der en.php und, falls Du weitere hast, auch weiteren Sprachdateien durch - natürlich in der jeweiligen Sprache, z.B. 'Enduring Events' und 'Enduring' für die en.php
Schritt 4
Zu ändernde Datei:
/application/modules/events/controllers/Index.php
ca. Zeile 31 - suche folgenden Code:
$upcomingLimit = 5;
Nach dieser Codezeile machst du einen Zeilenumbruch und fügst folgenden Code ein:
$enduringLimit = 5;
ca. Zeile 49 - suche folgenden Code:
->set('eventListUpcoming', $eventMapper->getEventListUpcoming($upcomingLimit))
Nach dieser Codezeile machst du einen Zeilenumbruch und fügst folgenden Code ein:
->set('eventListEnduring', $eventMapper->getEventListEnduring($enduringLimit))
Danach Datei speichern
Schritt 5
Zu ändernde Datei:
/application/modules/events/controllers/Show.php
ca. Zeile 150 - hier sollte eine Leerzeile sein - füge folgenden Code ein:
public function enduringAction() { $eventMapper = new EventMapper(); $entrantsMapper = new EntrantsMapper(); $userMapper = new UserMapper; $this->getLayout()->getTitle() ->add($this->getTranslator()->trans('menuEvents')) ->add($this->getTranslator()->trans('naviEventsEnduring')); $this->getLayout()->getHmenu() ->add($this->getTranslator()->trans('menuEvents'), ['controller' => 'index', 'action' => 'index']) ->add($this->getTranslator()->trans('naviEventsEnduring'), ['action' => 'enduring']); $user = null; if ($this->getUser()) { $user = $userMapper->getUserById($this->getUser()->getId()); } $readAccess = [3]; if ($user) { foreach ($user->getGroups() as $us) { $readAccess[] = $us->getId(); } } $this->getView()->set('entrantsMapper', $entrantsMapper) ->set('eventListEnduring', $eventMapper->getEventListEnduring()) ->set('readAccess', $readAccess); }
Danach Datei speichern
Schritt 6
Zu ändernde Datei:
/application/modules/events/mappers/Events.php
Öffne die Datei und lösche den kompletten Inhalt, danach folgenden Code einfügen
<?php /** * @copyright Ilch 2.0 * @package ilch */ namespace Modules\Events\Mappers; use Modules\Events\Models\Events as EventModel; use Modules\Events\Mappers\Events as EventMapper; class Events extends \Ilch\Mapper { /** * Gets the Event entries. * * @param array $where * * @return EventModel[]|array */ public function getEntries($where = []) { $entryArray = $this->db()->select('*') ->from('events') ->where($where) ->order(['start' => 'ASC']) ->execute() ->fetchRows(); if (empty($entryArray)) { return null; } $entry = []; foreach ($entryArray as $entries) { $entryModel = new EventModel(); $entryModel->setId($entries['id']) ->setUserId($entries['user_id']) ->setStart($entries['start']) ->setEnd($entries['end']) ->setTitle($entries['title']) ->setPlace($entries['place']) ->setWebsite($entries['website']) ->setLatLong($entries['lat_long']) ->setImage($entries['image']) ->setText($entries['text']) ->setCurrency($entries['currency']) ->setPrice($entries['price']) ->setPriceArt($entries['price_art']) ->setShow($entries['show']) ->setUserLimit($entries['user_limit']) ->setReadAccess($entries['read_access']); $entry[] = $entryModel; } return $entry; } /** * Gets event. * * @param int $id * * @return EventModel|null */ public function getEventById($id) { $eventRow = $this->db()->select('*') ->from('events') ->where(['id' => $id]) ->execute() ->fetchAssoc(); if (empty($eventRow)) { return null; } $eventModel = new EventModel(); $eventModel->setId($eventRow['id']) ->setUserId($eventRow['user_id']) ->setStart($eventRow['start']) ->setEnd($eventRow['end']) ->setTitle($eventRow['title']) ->setPlace($eventRow['place']) ->setWebsite($eventRow['website']) ->setLatLong($eventRow['lat_long']) ->setImage($eventRow['image']) ->setText($eventRow['text']) ->setCurrency($eventRow['currency']) ->setPrice($eventRow['price']) ->setPriceArt($eventRow['price_art']) ->setShow($eventRow['show']) ->setUserLimit($eventRow['user_limit']) ->setReadAccess($eventRow['read_access']); return $eventModel; } /** * @param null $limit * @return EventMapper[]|array * @throws \Ilch\Database\Exception */ public function getEventListUpcoming($limit = null) { $eventMapper = new EventMapper(); $sql = 'SELECT * FROM `[prefix]_events` WHERE start > CURDATE() ORDER BY start ASC'; if ($limit !== null) { $sql .= ' LIMIT '.$limit; } $rows = $this->db()->queryArray($sql); if (empty($rows)) { return null; } $events = []; foreach ($rows as $row) { $events[] = $eventMapper->getEventById($row['id']); } return $events; } /** * @param null $limit * @return EventMapper[]|array * @throws \Ilch\Database\Exception */ public function getEventListEnduring($limit = null) { $eventMapper = new EventMapper(); $sql = 'SELECT * FROM `[prefix]_events` WHERE end >= CURDATE() AND start <= CURDATE() ORDER BY start ASC'; if ($limit !== null) { $sql .= ' LIMIT '.$limit; } $rows = $this->db()->queryArray($sql); if (empty($rows)) { return null; } $events = []; foreach ($rows as $row) { $events[] = $eventMapper->getEventById($row['id']); } return $events; } /** * @return EventMapper[]|array */ public function getEventListParticipation($userId) { $eventMapper = new EventMapper(); $entryRow = $this->db()->select('*') ->from('events') ->where(['user_id' => $userId]) ->execute() ->fetchRows(); if (empty($entryRow)) { return null; } $events = []; foreach ($entryRow as $row) { $events[] = $eventMapper->getEventById($row['id']); } return $events; } /** * @param null $limit * @return EventMapper[]|array * @throws \Ilch\Database\Exception */ public function getEventListPast($limit = null) { $eventMapper = new EventMapper(); $sql = 'SELECT * FROM `[prefix]_events` WHERE start < CURDATE() AND end < CURDATE() ORDER BY start DESC'; if ($limit !== null) { $sql .= ' LIMIT '.$limit; } $rows = $this->db()->queryArray($sql); if (empty($rows)) { return null; } $events = []; foreach ($rows as $row) { $events[] = $eventMapper->getEventById($row['id']); } return $events; } public function existsTable($table) { $module = $this->db()->ifTableExists('[prefix]_'.$table); return $module; } /** * Gets the Events by start and end. * * @param int $start * @param int $end * * @return EventModel[]|array * @throws \Ilch\Database\Exception */ public function getEntriesForJson($start, $end) { if ($start && $end) { $start = new \Ilch\Date($start); $end = new \Ilch\Date($end); $sql = sprintf("SELECT * FROM `[prefix]_events` WHERE start >= '%s' AND end <= '%s' AND `show` = 1 ORDER BY start ASC;", $start, $end); } else { return null; } $entryArray = $this->db()->queryArray($sql); if (empty($entryArray)) { return null; } $entry = []; foreach ($entryArray as $entries) { $entryModel = new EventModel(); $entryModel->setId($entries['id']) ->setStart($entries['start']) ->setEnd($entries['end']) ->setTitle($entries['title']) ->setShow($entries['show']) ->setReadAccess($entries['read_access']); $entry[] = $entryModel; } return $entry; } /** * Get latitude and longitude for Google Maps by address * * @param string $address * @param string $googleMapsKey * * @return string $latlongitude */ public function getLatLongFromAddress($address, $googleMapsKey) { $prepAddr = str_replace(' ', '+', $address); $geocode = url_get_contents('https://maps.googleapis.com/maps/api/geocode/json?address='.$prepAddr.'&key='.$googleMapsKey); $output = json_decode($geocode); $latitude = $output->results[0]->geometry->location->lat; $longitude = $output->results[0]->geometry->location->lng; $latlongitude = $latitude.','.$longitude; return $latlongitude; } /** * Inserts or updates event model. * * @param EventModel $event */ public function save(EventModel $event) { $fields = [ 'user_id' => $event->getUserId(), 'start' => $event->getStart(), 'end' => $event->getEnd(), 'title' => $event->getTitle(), 'place' => $event->getPlace(), 'website' => $event->getWebsite(), 'lat_long' => $event->getLatLong(), 'image' => $event->getImage(), 'text' => $event->getText(), 'currency' => $event->getCurrency(), 'price' => $event->getPrice(), 'price_art' => $event->getPriceArt(), 'show' => $event->getShow(), 'user_limit' => $event->getUserLimit(), 'read_access' => $event->getReadAccess() ]; if ($event->getId()) { $this->db()->update('events') ->values($fields) ->where(['id' => $event->getId()]) ->execute(); } else { $this->db()->insert('events') ->values($fields) ->execute(); } } /** * Deletes event with given id. * * @param int $id */ public function delete($id) { $imageRow = $this->db()->select('*') ->from('events') ->where(['id' => $id]) ->execute() ->fetchAssoc(); if (file_exists($imageRow['image'])) { unlink($imageRow['image']); } $this->db()->delete('events') ->where(['id' => $id]) ->execute(); $this->db()->delete('events_entrants') ->where(['event_id' => $id]) ->execute(); $this->db()->delete('comments') ->where(['key' => 'events/show/event/id/'.$id]) ->execute(); } /** * Delete/Unlink Image by id. * * @param int $id */ public function delImageById($id) { $imageRow = $this->db()->select('*') ->from('events') ->where(['id' => $id]) ->execute() ->fetchAssoc(); if (file_exists($imageRow['image'])) { unlink($imageRow['image']); } $this->db()->update('events') ->values(['image' => '']) ->where(['id' => $id]) ->execute(); } }
Danach Datei speichern
Schritt 7
Zu ändernde Datei:
/application/modules/events/views/index/navi.php
ca. Zeile 23 - suche folgenden Code:
<li <?php if ($this->getRequest()->getActionName() == 'upcoming') { echo 'class="active"'; } ?>><a href="<?=$this->getUrl(['controller' => 'show', 'action' => 'upcoming']); ?>"><i class="fa fa-history fa-flip-horizontal"></i> <?=$this->getTrans('naviEventsUpcoming') ?></a></li>
Nach dieser Codezeile machst du einen Zeilenumbruch und fügst folgenden Code ein:
<li <?php if ($this->getRequest()->getActionName() == 'enduring') { echo 'class="active"'; } ?>><a href="<?=$this->getUrl(['controller' => 'show', 'action' => 'enduring']); ?>"><i class="glyphicon glyphicon-hourglass"></i> <?=$this->getTrans('naviEventsEnduring') ?></a></li>
Danach Datei speichern
Danach erscheinen die Laufenden Events auch in der Navigation, sieht dann so aus:
Ich hoffe, ich hab nichts vergessen, war zu faul ein Changelog anzulegen weil es schnell gehn musste.
Die Änderungen macht ihr auf eigene Gefahr,
übernehme keine Haftung für Richtigkeit, Funktionalität oder etwaige Schäden.
Lasst mich wissen wenn ihr es "verbaut" habt und Freude daran habt.
LG
kugelschubs
LEGENDS NEVER DIE - DESERT OPERATIONS ALLIANZ
Zuletzt modifiziert von kugelschubs-neu am 14.10.2018 - 11:57:03