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
1 | <?php if ( $this ->getUser() AND $event ->getStart() > new \Ilch\ Date ()): ?> |
ändern in:
1 | <?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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | <?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:
1 | '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:
1 | '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:
1 | $upcomingLimit = 5; |
Nach dieser Codezeile machst du einen Zeilenumbruch und fügst folgenden Code ein:
1 | $enduringLimit = 5; |
ca. Zeile 49 - suche folgenden Code:
1 | ->set('eventListUpcoming', $eventMapper->getEventListUpcoming($upcomingLimit)) |
Nach dieser Codezeile machst du einen Zeilenumbruch und fügst folgenden Code ein:
1 | ->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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 | <?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:
1 | <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:
1 | <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