ilch Forum » Ilch CMS 2.X » Module und Modifikationen » Tutorial - Modifikation des Event Moduls

Geschlossen
  1. #1
    User Pic
    kugelschubs-neu Mitglied
    Registriert seit
    22.09.2018
    Beiträge
    8
    Beitragswertungen
    1 Beitragspunkte
    Hallo liebe ilch-Gemeinde,

    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.

    gesperrtes Bild

    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.

    gesperrtes Bild




    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>&nbsp; <?=$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>&nbsp; <?=$this->getTrans('naviEventsEnduring') ?></a></li>


    Danach Datei speichern

    Danach erscheinen die Laufenden Events auch in der Navigation, sieht dann so aus:
    gesperrtes Bild





    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
    1 Mitglieder finden den Beitrag gut.
  2. #2
    User Pic
    kugelschubs-neu Mitglied
    Registriert seit
    22.09.2018
    Beiträge
    8
    Beitragswertungen
    1 Beitragspunkte
    Hab noch was vergessen.

    Wer in der Eventliste den Hintergrund des Datums ändern möchte (war vorher so ein komisches Rosa glaub ich),
    der kann dies hier tun:


    Zu ändernde Datei:
    /application/modules/events/static/css/events.css

    ca. Zeile 17, suche:
    .event-list > li > time


    darunter, ca. Zeile 21, findest Du background-color.
    Hier kannst Du Deine gewünschte Hintergrundfarbe eintragen,
    alternativ natürlich auch mit einem Hex-Wert, muss nicht rgb Wert sein.

    Oder, wie ich es gemacht habe, einen CSS Farbverlauf, siehe meinen Code:
    .event-list > li > time {
        display: inline-block;
        width: 100%;
        color: rgb(255, 255, 255);
        background: #000000; /* Alte Browser */
        background: -moz-linear-gradient(top, #000000 0%, #c40000 100%); /* Alte FF */
        background: -webkit-linear-gradient(top, #000000 0%,#c40000 100%); /* Alte Chrome + Safari */
        background: linear-gradient(to bottom, #000000 0%,#c40000 100%); /* Moderne Browser */
        filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#000000', endColorstr='#c40000',GradientType=0 ); /* IE6-9 */
        padding: 5px;
        text-align: center;
        text-transform: uppercase;
    }



    Zuletzt modifiziert von kugelschubs-neu am 13.10.2018 - 21:58:21
    0 Mitglieder finden den Beitrag gut.
  3. #3
    User Pic
    Siggi Hall Of Fame
    Registriert seit
    08.02.2007
    Beiträge
    6.558
    Beitragswertungen
    327 Beitragspunkte
    Hast du den eine Kopie vom Modul angelegt? nicht das es durch ein Update ausersehen überspielt wird.

    Danke fürs Tutorial das Hilft anderen Users bestimmt
    0 Mitglieder finden den Beitrag gut.
  4. #4
    User Pic
    kugelschubs-neu Mitglied
    Registriert seit
    22.09.2018
    Beiträge
    8
    Beitragswertungen
    1 Beitragspunkte
    ZitatZitat geschrieben von Siggi
    Hast du den eine Kopie vom Modul angelegt? nicht das es durch ein Update ausersehen überspielt wird.

    Danke fürs Tutorial das Hilft anderen Users bestimmt


    Hallo Siggi,

    hab mir gerade ein Backup des Modulordners angelegt.

    Vielleicht erwägt Ihr ja meine Änderungen ins nächste Update zu übernehmen?

    LG

    Peter alias kugelschubs
    0 Mitglieder finden den Beitrag gut.
  5. #5
    User Pic
    Siggi Hall Of Fame
    Registriert seit
    08.02.2007
    Beiträge
    6.558
    Beitragswertungen
    327 Beitragspunkte
    Ich hab es vorhin nur grob überflogen aber werde es mir morgen mal genau anschauen
    0 Mitglieder finden den Beitrag gut.
  6. #6
    User Pic
    kugelschubs-neu Mitglied
    Registriert seit
    22.09.2018
    Beiträge
    8
    Beitragswertungen
    1 Beitragspunkte
    ZitatZitat geschrieben von Siggi
    Ich hab es vorhin nur grob überflogen aber werde es mir morgen mal genau anschauen


    und?
    ist es würdig für das nächste Update? lachen
    0 Mitglieder finden den Beitrag gut.
Geschlossen

Zurück zu Module und Modifikationen

Optionen: Bei einer Antwort zu diesem Thema eine eMail erhalten