ilch Forum » Ilch CMS 2.X » Module und Modifikationen » Hilfe bei Modulen - PHP-OOP Model-View

Geschlossen
  1. #1
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    Guten Abend liebe Community und Dev´s,

    Da nun Ilch den Release geschafft hat ^^ und ich meinen Discord Usern ein neues Feature zur Verfügung stellen will, habe ich einen Discordbot geschrieben der beim erstellen eines Forumposts automatisch benachrichtigt wird und URL und Bla bla bla in Discord postet. Funzt auch soweit.

    Da ich aber kein Egoist bin, dachte ich mir ich versuchs mal massentauglich zu machen. Ich bin schwer auf Kriegsfuß mit diesem Model-View krams ^^. Ich blick zwar so einigermaßen durch, aber an einigen Ecken klemmts gewaltig. Es soll hierbei nur eine Administrationsmöglichkeit für 2 Textfelder entstehen.

    An sich ist es nix großartiges. (Denke ich zwinker )
    Puhh wo fang ich an.

    Ich habe schon:


    discordnotifier/config/config.php (ModulInstallation OK, Initialer-DB-Eintrag OK, ModulLöschen OK)
    |------------/controllers/admin/index.php (Er überprüft zumindest die Textfelder schonmal xD)
    |------------/mappers/Discordnotifier.php (Ist mir nen Rätsel. Wichtig für DB und einlesen der Vars?)
    |------------/models/Discordnotifier.php (Naja is ja wie bei Java, getter und setter kennt man ja, funzt))
    |------------/views/admin/index/index.php (Nich grade Designpreis wert aber es erscheint was ^^)

    So. Ich habe als Vorlage vorhandene Datein genutzt und angepasst um überhaupt erstmal klarzukommen.
    Es sieht nach blanken Chaos aus denke ich ^^.
    Wenn ihr Zeit und lust habt einmal drüber zu schauen wäre ich euch echt dankbar.

    <?php
    /**
     * @copyright Ilch 2.0
     * @package ilch
     */
    
    namespace Modules\Discordnotifier\Config;
    
    class Config extends \Ilch\Config\Install
    {
        public $config = [
            'key' => 'discordnotifier',
            'version' => '1.0',
            'icon_small' => 'fa-paper-plane',
            'author' => 'Raptusguru',
            'link' => 'http://www.underground-community.com',
            'languages' => [
                'de_DE' => [
                    'name' => 'Discordnotifier',
                    'description' => 'Der Discordnotifier postet neue Forenbeiträge, neue Forenthemen und neue Artikel in einen von euch angegebenen Discordchannel auf eurem Discord. Hierzu muss mein Bot User auf eurem Discord eingerichtet werden und eine JavaAnwendung auf einem Rechner laufen (am besten mit fester IP).',
                ],
                'en_EN' => [
                    'name' => 'Discordnotifier',
                    'description' => 'Discordnotifier.',
                ],
            ],
            'ilchCore' => '2.0.2',
            'phpVersion' => '5.6'
        ];
    
        public function install()
        {
            $this->db()->queryMulti($this->getInstallSql());
        }
    
        public function uninstall()
        {
            $this->db()->queryMulti('DROP TABLE `[prefix]_discordnotifier`');
        }
    
        public function getInstallSql()
        {
            return 'CREATE TABLE IF NOT EXISTS `[prefix]_discordnotifier` (
                      `id` INT(11) NOT NULL AUTO_INCREMENT,
                      `destinationAdress` VARCHAR(255) NOT NULL,
                      `urlToPage` VARCHAR(255) NOT NULL,
                      PRIMARY KEY (`id`)
                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;
    
                    INSERT INTO `[prefix]_discordnotifier` (`id`, `destinationAdress`, `urlToPage`) VALUES
                    (1, "**IP zum System wo Discordnotifier läuft**", "**Die URL von deiner Seite hier**");';
        }
    
        public function getUpdate($installedVersion)
        {
    
        }
    }


    <?php
    /**
     * @copyright Ilch 2.0
     * @package ilch
     */
    
    namespace Modules\Discordnotifier\Controllers\Admin;
    
    use Ilch\Validation;
    
    class Index extends \Ilch\Controller\Admin
    {
        public function init()
        {
            $items = [
                [
                    'name' => 'manage',
                    'active' => true,
                    'icon' => 'fa fa-th-list',
                    'url' => $this->getLayout()->getUrl(['controller' => 'index', 'action' => 'index'])
                ]
            ];
    
            $this->getLayout()->addMenu
            (
                'menuDiscordnotifier',
                $items
            );
    		
        }
    
        public function indexAction()
        {
            if ($this->getRequest()->isPost()) {
                $validation = Validation::create($this->getRequest()->getPost(), [
                    'destinationURL' => 'required',
                    'ownURL' => 'required'
                ]);
    
                if ($validation->isValid()) {
                    $this->getConfig()->set('destinationAdress', $this->getRequest()->getPost('destinationURL'));
                    $this->getConfig()->set('urlToPage', $this->getRequest()->getPost('ownURL'));
    
                    $this->redirect()
                        ->withMessage('saveSuccess')
                        ->to(['action' => 'index']);
                } else {
                    $this->addMessage($validation->getErrorBag()->getErrorMessages(), 'danger', true);
                    $this->redirect()
                        ->withErrors($validation->getErrorBag())
                        ->to(['action' => 'index']);
                }
            }
    
            $this->getView()->set('destinationURL', $this->getConfig()->get('destinationAdress'));
            $this->getView()->set('ownURL', $this->getConfig()->get('urlToPage'));
        }
    }


    Hier hab ich als vorlage den Imprintmapper. Sah am brauchbarsten aus frech
    <?php
    /**
     * @copyright Ilch 2.0
     * @package ilch
     */
    
    namespace Modules\Discordnotifier\Mappers;
    
    use Modules\Discordnotifier\Models\Discordnotifier as DiscordnotifierModel;
    
    class Discordnotifier extends \Ilch\Mapper
    {
        /**
         * Gets the Discordnotifier.
         *
         * @param array $where
         * @return DiscordnotifierModel[]|array
         */
        public function getImprint($where = [])
        {
            $entryArray = $this->db()->select('*')
                ->from('imprint')
                ->where($where)
                ->order(['id' => 'DESC'])
                ->execute()
                ->fetchRows();
    
            if (empty($entryArray)) {
                return [];
            }
    
            $imprint = [];
            foreach ($entryArray as $entries) {
                $entryModel = new ImprintModel();
                $entryModel->setId($entries['id']);
                $entryModel->setParagraph($entries['paragraph']);
                $entryModel->setCompany($entries['company']);
                $entryModel->setName($entries['name']);
                $entryModel->setAddress($entries['address']);
                $entryModel->setAddressAdd($entries['addressadd']);
                $entryModel->setCity($entries['city']);
                $entryModel->setPhone($entries['phone']);
                $entryModel->setFax($entries['fax']);
                $entryModel->setEmail($entries['email']);
                $entryModel->setRegistration($entries['registration']);
                $entryModel->setCommercialRegister($entries['commercialregister']);
                $entryModel->setVatId($entries['vatid']);
                $entryModel->setOther($entries['other']);
                $entryModel->setDisclaimer($entries['disclaimer']);
                $imprint[] = $entryModel;
            }
    
            return $imprint;
        }
    
        /**
         * Gets imprint.
         *
         * @param integer $id
         * @return ImprintModel|null
         */
        public function getImprintById($id)
        {
            $imprint = $this->getImprint(['id' => $id]);
    
            return reset($imprint);
        }
    
        /**
         * Updates imprint model.
         *
         * @param ImprintModel $imprint
         */
        public function save(ImprintModel $imprint)
        {
            $this->db()->update('imprint')
                ->values
                (
                    [
                        'paragraph' => $imprint->getParagraph(),
                        'company' => $imprint->getCompany(),
                        'name' => $imprint->getName(),
                        'address' => $imprint->getAddress(),
                        'addressadd' => $imprint->getAddressAdd(),
                        'city' => $imprint->getCity(),
                        'phone' => $imprint->getPhone(),
                        'fax' => $imprint->getFax(),
                        'email' => $imprint->getEmail(),
                        'registration' => $imprint->getRegistration(),
                        'commercialregister' => $imprint->getCommercialRegister(),
                        'vatid' => $imprint->getVatId(),
                        'other' => $imprint->getOther(),
                        'disclaimer' => $imprint->getDisclaimer()
                    ]
                )
                ->where(['id' => $imprint->getId()])
                ->execute();
        }
    
        /**
         * Sets the config for given key/vale.
         *
         * @param string         $key
         * @param string|integer $value
         * @param integer        $autoload
         */
        public function set($key, $value, $id)
        {
            $this->db()->update('imprint')
                ->values
                (
                    [
                        $key => $value,
                    ]
                )
                ->where(['id' => $id])
                ->execute();
        }
    }


    Denke das Model passt so.
    <?php
    /**
     * @copyright Ilch 2.0
     * @package ilch
     */
    
    namespace Modules\Discordnotifier\Models;
    
    class Discordnotifier extends \Ilch\Model
    {
        /**
         * The destinationURL of Discordnotifier.
         *
         * @var string
         */
        protected $destinationURL;
    
        /**
         * The ownURL of Discordnotifier.
         *
         * @var string
         */
        protected $ownURL;
    
        
        /**
         * Gets the destinationURL of Discordnotifier.
         *
         * @return string
         */
        public function getDestinationURL()
        {
            return $this->destinationURL;
        }
    
        /**
         * Sets the destinationURL of Discordnotifier.
         *
         * @param string $destinationURL
         * @return this
         */
        public function setDestinationURL($destinationURL)
        {
            $this->destinationURL = (string)$destinationURL;
    
            return $this;
        }
    
        /**
         * Gets the ownURL of Discordnotifier.
         *
         * @return string
         */
        public function getOwnURL()
        {
            return $this->ownURL;
        }
    
        /**
         * Sets the ownURL of Discordnotifier.
         *
         * @param string $ownURL
         * @return this
         */
        public function setOwnURL($ownURL)
        {
            $this->ownURL = (string)$ownURL;
    
            return $this;
        }
    
       
    }


    Sag ja wird kein Designpreis gewinnen ^^.
    <h1><?=$this->getTrans('manage') ?></h1>
    <form class="form-horizontal" method="POST" action="">
        <?=$this->getTokenField() ?>
        <div class="form-group <?=$this->validation()->hasError('siteDiscordnotifier') ? 'has-error' : '' ?>">
            <div class="col-lg-2 control-label">
                <?=$this->getTrans('siteDiscordnotifier') ?>:
            </div>
            <div class="col-lg-4">
    			<div class="form-group">
    				<label for="destinationURL" class="col-lg-3 control-label">
    					Ziel Adresse des System worauf Discord Notifier läuft
    				</label>
    				<div class="col-lg-6">
    					<input type="text" class="form-control" id="destinationURL" name="destinationURL" />
    				</div>
    			</div>
    			<div class="form-group">
    				<label for="ownURL" class="col-lg-3 control-label">
    					Die eigene Homepage URL
    				</label>
    				<div class="col-lg-6">
    					<input type="text" class="form-control" id="ownURL" name="ownURL" />
    				</div>
    			</div>
            </div>
        </div>
        <?=$this->getSaveBar() ?>
    </form>


    Abschließend nochmal:
    Modulinstallation/Deinstallation funzt. Modul wird unter Module dann angezeigt, Seite lässt sich aufrufen.
    Textfelder sollten gefüllt sein mit InitialWerten der Installation, das ist aber nicht der fall. Ich kann etwas eintragen und auf Speichern drücken, bekomme auch Erfolgreich angezeigt, aber es hat sich nichts geändert in der Datenbank. Das ist die momentane Situation ^^.
    Danke für eure Hilfe
    MFG Raptus


    verwendete ilch Version: 2.x
    1 Mitglieder finden den Beitrag gut.
  2. #2
    User Pic
    blackcoder Entwickler
    Registriert seit
    22.05.2014
    Beiträge
    2.296
    Beitragswertungen
    360 Beitragspunkte
    Moin Raptusguru,

    erst mal danke für das Veröffentlichen deines Moduls.
    Ich schaue mir dein Modul mal an und schreibe eventuelle Änderungen anschließend hier im Thema. lächeln

    Gruß
    blackcoder
    0 Mitglieder finden den Beitrag gut.
  3. #3
    User Pic
    blackcoder Entwickler
    Registriert seit
    22.05.2014
    Beiträge
    2.296
    Beitragswertungen
    360 Beitragspunkte
    Änderungen:

    Aktuell scheinst du noch keinen Mapper und kein Model zu benötigen. Diese habe ich mal entfernt.
    In der config.php habe ich [prefix]_config genutzt für die beiden Einstellungen, die Beschreibung für Englisch eingefügt, ilchCore auf 2.0.0 gesetzt, weil dein Modul ja auch schon mit 2.0.0 laufen würde.

    Die View habe ich so abgeändert, dass sie multilingual ist und halt die Einstellungen angezeigt werden.

    Im Controller das Menü geändert, bei den Validatoren "url" hinzugefügt und den Controller so angepasst, dass er mit der View zusammenarbeitet.

    Den Ordner "translations" mit de.php und en.php hinzugefügt.

    Hoffe das hilft dir weiter. lächeln

    -gelöscht-


    Zum Thema Mapper:
    Wenn du jetzt z.B. eine Tabelle benötigen würdest, dann würdest du im Mapper Funktionen schreiben mit denen du die Tabellen in der Datenbank abfragen und Änderungen speichern könntest.

    Beispiel:
    Tabelle Costumers
    id
    firstName
    lastName

    Im Mapper würden sich dann Funktionen anbieten wie getCostumerById($id), getCostumerByFirstName($firstName), getCostumerByLastName($lastName) und save($costumer).

    Der Funktion save() übergibst du einen Kunden als Model costumer.
    Die anderen Funktionen geben als Rückgabewert ein Model costumer.

    Das Model costumer hätte dann getter/setter für firstName und lastName und z.B. einen getter für id.

    Mit diesem Model (Kunden) kannst du dann in deinem Modul arbeiten (als Parameter übergeben usw.).


    Zuletzt modifiziert von blackcoder am 18.03.2019 - 22:28:45
    1 Mitglieder finden den Beitrag gut.
  4. #4
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    Hey, guten Morgen und vielen Dank.

    Hab ich gleich mal rübergeschoben und installiert. Datenbank einträge werden gemacht.
    Unter Module ist Discordnotifier auch zu finden, jedoch wenn ich draufklicke dann kommt das hier:

    Im Browser Adressfeld steht: http://underground-community.com/index.php/admin/error/index/index/error/Controller/errorText/index

    und Mozilla sagt: Fehler: Umleitungsfehler

    Die aufgerufene Website leitet die Anfrage so um, dass sie nie beendet werden kann.

    Dieses Problem kann manchmal auftreten, wenn Cookies deaktiviert oder abgelehnt werden.

    Hab mal drüber geguckt warum das so ist aber ersichtlich ist mir da jetzt nix ^^. Wo is der Hase versteckt? xD
    MFG
    0 Mitglieder finden den Beitrag gut.
  5. #5
    User Pic
    blackcoder Entwickler
    Registriert seit
    22.05.2014
    Beiträge
    2.296
    Beitragswertungen
    360 Beitragspunkte
    Benenne mal den Controller von index.php um in Index.php. Fehler weg?
    1 Mitglieder finden den Beitrag gut.
  6. #6
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    Ha ^^, supi. Danke funzt.

    Jetz noch ne frage.

    Kann man ohne das ich den Controller vom Forum für Newpost.php modifizieren muss irgendwie gleichzeit beim Posten eines Beitrags mein Modul anschubsen? Oder von meinem Modul heraus? Eher schwieriger denke ich.
    Ich wollte auch nich alle X Sekunden abfragen ob sich in der Datenbank was geändert hat.
    Es sollte schon in echtzeit passieren.
    Der nachteil einer modifizierten Newpost.php ist dann dass bei nem Update dieser ja alles wieder futsch ist.

    Die andere Frage ist wie ich innerhalb des Forum Controllers Newpost.php an die Datenbankeinträge des Discordnotifier komme, da ich in der Newpost.php mit cURL arbeite um den Bot zu benachrichtigen, dazu brauch ich die 2 Datenbank einträge. Und ich glaube da brauch ich dann nen Mapper oder?

    MFG ^^
    0 Mitglieder finden den Beitrag gut.
  7. #7
    User Pic
    blackcoder Entwickler
    Registriert seit
    22.05.2014
    Beiträge
    2.296
    Beitragswertungen
    360 Beitragspunkte
    Soweit ich weiß haben wir da noch nichts implementiert (Ereignisse/Events).

    ZitatZitat geschrieben von Raptusguru
    Die andere Frage ist wie ich innerhalb des Forum Controllers Newpost.php an die Datenbankeinträge des Discordnotifier komme, da ich in der Newpost.php mit cURL arbeite um den Bot zu benachrichtigen, dazu brauch ich die 2 Datenbank einträge.

    Das kann man im Controller vom Forum genauso machen wie im Controller von Discordnotifier.
    $this->getConfig()->get('discordnotifier_destinationAdress')
    $this->getConfig()->get('discordnotifier_urlToPage')
    1 Mitglieder finden den Beitrag gut.
  8. #8
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    Supi ^^. Alles bestens xD. Ich danke dir erstmal. Ich bastel nochn bissl am Java rum und dann werd ich mich evtl nochmal melden. Es müsste dann noch eine Sektion erstellt werden auf Ilch um 2.0 Module anbieten zu können bzw downloaden zu können ^^. MFG
    0 Mitglieder finden den Beitrag gut.
  9. #9
    User Pic
    blackcoder Entwickler
    Registriert seit
    22.05.2014
    Beiträge
    2.296
    Beitragswertungen
    360 Beitragspunkte
    Ja, da ist auch schon etwas in Planung. Die Module sollen eingereicht werden können und stehen dann nach einer Prüfung wie alle anderen Module von Ilch 2 in Ilch selber zur Verfügung.
    1 Mitglieder finden den Beitrag gut.
  10. #10
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    OK, Ich hab soweit denke ich alles fertig, dass es in den Test kann.

    Eins hab ich aber noch ^^
    Szenario:
    Hab den Discordnotifier in /module hochgeladen.
    Gehe in Adminbereich unter Module auf Übersicht und gehe auf nicht installierte Module.
    Klicke bei Discordnotifier auf installieren...
    Und hier würde ich gerne, dass im Installationsvorgang diese original Dateien

    ..[**ROOT-Directory**]../application/modules/article/controllers/admin/index.php
    ..[**ROOT-Directory**]../application/modules/forum/controllers/Newpost.php
    ..[**ROOT-Directory**]../application/modules/article/controllers/Newtopic.php

    in eine Art Backupordner kopiert werden und die neuen

    ..[**ROOT-Directory**]../application/modules/discordnotifier/mods/article/index.php [Modifiziert]
    ..[**ROOT-Directory**]../application/modules/discordnotifier/mods/forum/Newpost.php [Modifiziert]
    ..[**ROOT-Directory**]../application/modules/discordnotifier/mods/forum/Newtopic.php [Modifiziert]

    an die stelle der alten kopiert werden.

    Das selbe dann beim deinstallieren bloß andersrum xD Dass das Backup der Dateien wieder zurückgespielt wird.

    jetz ist meine Frage wie ist denn jetz die Pfadangabe korrekt?
    Wo befinde ich mich denn während der Installation in welchem Ordner? In dem discordnotifier/config/ oder ganz oben bei der index.php?

    Wenn ich jetzt aus der discordnotifier/config/config.php bei install() mit nem copy("","") arbeite, wie muss ich denn den Pfad angeben? Bekomme immer Fehlermeldungen, ich hasse pfade ^^.
    Wäre Nett wenn du mir das nochmal verraten würdest xD
    MFG Raptus
    0 Mitglieder finden den Beitrag gut.
  11. #11
    User Pic
    blackcoder Entwickler
    Registriert seit
    22.05.2014
    Beiträge
    2.296
    Beitragswertungen
    360 Beitragspunkte
    Das ist meiner Meinung nach keine Lösung, die man in der Praxis umsetzen kann, weil dies die Update-Funktion unmöglich macht.

    Die oben bereits erwähnten Ereignisse/Events wären eine Lösung, die so etwas ermöglichen würde, ohne das jedes Modul irgendwelche Änderungen an anderen Modulen benötigt. Bis dahin wird man das leider nicht für alle verfügbar machen können und wenn du das so nutzt, müsstest du sämtliche Änderungen am Artikel- und Forum-Modul in deinen Varianten einpflegen.
    0 Mitglieder finden den Beitrag gut.
  12. #12
    User Pic
    blackcoder Entwickler
    Registriert seit
    22.05.2014
    Beiträge
    2.296
    Beitragswertungen
    360 Beitragspunkte
    Könntest du den aktuellen Entwicklungsstand von deinem Modul zur Verfügung stellen, damit ich testen kann ob es sich leicht mit Ereignissen/Events umsetzen lässt? Die Änderungen an den drei Dateien wären dann wahrscheinlich gar nicht mehr nötig. Danke. lächeln

    Noch unter Vorbehalt:
    redmine.ilch2.de/projects/dev2/wiki/Events

    Gruß
    blackcoder
    0 Mitglieder finden den Beitrag gut.
  13. #13
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    Hey supi, das ging ja jetzt flott ^^. So schnell hab ich damit nicht gerechnet.

    Die aktuelle Version findest du bei mir auf der Homepage in der Downloadsektion
    underground-community.com/index.php/forum/showposts/index/topicid/6

    Hier der Link zum Forum wo der Download verlinkt ist.
    Ich bin gerade bei meineem Frauchen und erst morgen wieder zuhause. Solltest du fragen haben bin ich aber hier erreichbar . Mfg Raptus
    0 Mitglieder finden den Beitrag gut.
  14. #14
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    Achso, was ich noch sagen wollte:
    Der Bot wird zur Zeit per GET mit 3 parametern benachrichtigt bei nem Forumpost/Forumtopic.
    Einmal um was es sich handelt z.b. "forumpost"
    der zweite ist der komplette Link zum post und der dritte ist welches forum-topic- und title.
    Bei den article wird zudem noch die Bild url übergeben.
    Kann man alles sehen in den dateien beginnend mit /*NEW STUFF*/ UND /*END STUFF*/.
    mfg
    0 Mitglieder finden den Beitrag gut.
  15. #15
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    OK, dank deinen Events ^^ und deiner erklärung hab ich das nun hinbekommen, dass bei neuem Post nen Event abgefeuert wird und auch in meinem Modul ankommt.
    Jedoch musste ich in der Newpost.php

    (Wie in deiner Erklärung)
    trigger('Forum_NewPostEvent', new Event('Forum_NewPostEvent', ['postModel' => $postModel]));


    einfügen. Wird das denn später standardmäßig drinne sein in der Newpost.php und Newtopic usw?

    MFG Raptus

    edit: wenn ich auf das Event (public function newForumPost($event)) zugreifen will mit:

    var_dump($event->arguments->postModel->getTopic_id);


    bekomme ich folgende Meldung:

    Fatal error: Uncaught Error: Cannot access protected property Ilch\Event::$arguments in C:\xampp\htdocs\ilch\application\modules\discordnotifier\events\Forumlistener.php:10 Stack trace: #0 C:\xampp\htdocs\ilch\vendor\sphido\events\src\events.php(91): Modules\Discordnotifier\Events\Forumlistener->newForumPost(Object(Ilch\Event)) #1 C:\xampp\htdocs\ilch\application\modules\forum\controllers\Newpost.php(62): trigger('Forum_NewPostEv...', Object(Ilch\Event)) #2 C:\xampp\htdocs\ilch\application\libraries\Ilch\Page.php(245): Modules\Forum\Controllers\Newpost->indexAction() #3 C:\xampp\htdocs\ilch\application\libraries\Ilch\Page.php(134): Ilch\Page->loadController() #4 C:\xampp\htdocs\ilch\index.php(53): Ilch\Page->loadPage() #5 {main} thrown in C:\xampp\htdocs\ilch\application\modules\discordnotifier\events\Forumlistener.php on line 10


    wie erhalte ich zugriff? Oder mach ich was komplett falsch? ^^.
    Jedoch bekomme ich mit nur var_dump($event) den ganzen Inhalt angezeigt:

    object(Ilch\Event)#78 (2) { ["name":protected]=> string(18) "Forum_NewPostEvent" ["arguments":protected]=> array(1) { ["postModel"]=> object(Modules\Forum\Models\ForumPost)#65 (15) { ["id":protected]=> NULL ["topic_id":protected]=> string(1) "4" ["topic_title":protected]=> NULL ["text":protected]=> string(6) "asdasd" ["cat":protected]=> NULL ["visits":protected]=> NULL ["forum_id":protected]=> int(2) ["read":protected]=> NULL ["page":protected]=> NULL ["avatar":protected]=> NULL ["signature":protected]=> NULL ["user_id":protected]=> int(1) ["date_created":protected]=> object(Ilch\Date)#75 (7) { ["timeZone":"Ilch\Date":private]=> object(DateTimeZone)#66 (2) { ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" } ["timeZoneLocal":"Ilch\Date":private]=> object(DateTimeZone)#67 (2) { ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Berlin" } ["defaultFormat":"Ilch\Date":private]=> string(11) "Y-m-d H:i:s" ["dbFormat":"Ilch\Date":private]=> string(11) "Y-m-d H:i:s" ["date"]=> string(26) "2017-08-16 16:50:09.504415" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" } ["autor":protected]=> NULL ["autorallpost":protected]=> NULL } } }



    Zuletzt modifiziert von Raptusguru am 16.08.2017 - 19:36:59
    0 Mitglieder finden den Beitrag gut.
  16. #16
    User Pic
    blackcoder Entwickler
    Registriert seit
    22.05.2014
    Beiträge
    2.296
    Beitragswertungen
    360 Beitragspunkte
    Ja, es werden dann standardmäßig an interessanten Stellen Events abgefeuert.

    Es sind noch paar Änderungen an den Events geplant. Nachdem wir die umgesetzt haben, werde ich die Dokumentation aktualisieren und mal die Module durchgehen um die ersten Events einzufügen.

    Die drei Events für dein Modul sind auf jeden Fall schon vorgemerkt.
    0 Mitglieder finden den Beitrag gut.
  17. #17
    User Pic
    blackcoder Entwickler
    Registriert seit
    22.05.2014
    Beiträge
    2.296
    Beitragswertungen
    360 Beitragspunkte
    Hier ist die Events-Klasse:
    github.com/IlchCMS/Ilch-2.0/blob/master/application/libraries/Ilch/Event.php

    Was das Event "Forum_NewPostEvent" betrifft. Die Events werden noch andere Bezeichnungen kriegen und das Event Argument wird dann paar mehr Informationen enthalten. $postModel enthält aktuell nicht viel.

    Hier lokal enthält das Argument jetzt folgende Informationen:
    ['postModel' => $postModel, 'forum' => $forum, 'category' => $cat, 'topic' => $topic, 'request' => $this->getRequest()]


    Kann sich aber wie in der Doku erwähnt noch ändern.
    0 Mitglieder finden den Beitrag gut.
  18. #18
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    OK, alles klar.
    Dann werd ich nur die für mich relevanten Sachen grob fertigstellen und dann auf das Update warten ^^. Bis hier hin danke ich dir für deine Unterstützung und ich denke ich werd evtl dann nachm Update wieder hier aufkreuzen zwinker .

    Bis dann erstmal \O)
    0 Mitglieder finden den Beitrag gut.
  19. #19
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    So, nun sind ja die Events im Update dabei gewesen.

    Ich komm da soweit auch mit wie das alles funktioniert, aber ich bekomm echt ne Kriese mit dem Auslesen des Events ^^.

    Wie bekomme ich aus dem übergebenen event die Values wie $forum->getTitle() usw raus?
    Mein var_dump($event) spuckt mir alles an Daten aus und beinhaltet auf jedenfall alles was ich brauche.
    jedoch wenn ich versuche $event->arguments->forum->getTitle() auszugeben bekomme ich:

    Fatal error: Cannot access protected property Ilch\Event::$arguments in /customers/c/1/8/underground-community.com/httpd.www/application/modules/discordnotifier/events/Forum.php on line 10

    Kann mir das jemand verraten? ^^.
    Danke
    0 Mitglieder finden den Beitrag gut.
  20. #20
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Müsste dann wohl $event->getArgument('forum')->getTitle() sein. Alternativ kannst du auch alle Argumente als Array mit $event->getArguments() auslesen. Und ggf. könnte mit $event->hasArgument('forum') geprüft werden, ob ein Argument überhaupt verfügbar ist.
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    1 Mitglieder finden den Beitrag gut.
  21. #21
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    Jawoll ^^. Hat gefunzt xD.
    Ich danke dir xD.

    Na dann werd ich mich mal an den Rest machen.
    Danköö.
    0 Mitglieder finden den Beitrag gut.
  22. #22
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    OK , ich hab doch noch was ...
    am Anfang hatte in der Newpost.php meine Daten aus der Datenbank mit

    this->getConfig()->get('discordnotifier_destinationAdress');

    abgefragt.

    in meiner \events\Forum.php geht das jetzt nicht mehr so ^^.

    Fatal error: Call to undefined method Modules\Discordnotifier\Events\Forum::getConfig() in /customers/c/1/8/underground-community.com/httpd.www/application/modules/discordnotifier/events/Forum.php on line 16

    Ich hab mir mal so nen paar Mapper angeschaut ob da irgendwo nen Tip für mich liegt xD, aber da gabs auch nichts was mir weitergeholfen hätte.

    Für hilfe wäre ich wiedereinmal unendlich dankbar und ich hoffe doch dass es das dann mal war.
    PHP OOP o7 ^^
    0 Mitglieder finden den Beitrag gut.
  23. #23
    User Pic
    Siggi Hall Of Fame
    Registriert seit
    08.02.2007
    Beiträge
    6.558
    Beitragswertungen
    327 Beitragspunkte
    Wenn du es in der View brauchst dann müsstest du es mit folgendem testen.
    $config = \Ilch\Registry::get('config');


    dann kannste es abrufen
    $config->get('discordnotifier_destinationAdress')
    1 Mitglieder finden den Beitrag gut.
  24. #24
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    Jup und wieder ein dickes danke ^^.
    So aber nun gehts ans Eingemachte zwinker
    0 Mitglieder finden den Beitrag gut.
  25. #25
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    Sooo hooo hooo, vorab erstmal vielen Danke an blackcoder, Mairu und Siggi ^^ bei der hilfe mit dem neuen Kind ILCH 2.0. und dem mir neuen PHP OOP.

    Ich hätte jetzt das Modul soweit fertig. Hab Installation und Deinstallation ohne probleme getestet, wird alles sauber wieder entfernt bzw sauber installiert und funktionieren tut auch alles wie es soll ^^.

    Ich würde es toll finden wenn das nochmal jemand testet.

    Kann ich dazu nen neuen Post auf machen?

    Hier jedenfalls erstmal nen Link zu mir ins Forum wo an sich alles weitere steht:
    externer Link

    Achso und wie soll das dann laufen. Mit der Verifizierung des Moduls durch euch? PHP dateien sind ja kein problem, aber bei der JAVA-Anwendung sieht das anders aus ^^. Ich kann euch das Project exportieren falls ihr wollt oder so ^^.
    Dann wäre natürlich die Frage: Das Modul kann ja nach erfolgreicher Validierung von euch in den Modulen gefunden werden bzw wird ja dann von euch gehostet/angeboten wie auch immer. Wie ist das mit der JAVA-Anwendung? Soll ich dann in die Beschreibung nen Link zur Anwendung rein machen?
    Fragen über Fragen ^^.

    MFG
    0 Mitglieder finden den Beitrag gut.
  26. #26
    User Pic
    blackcoder Entwickler
    Registriert seit
    22.05.2014
    Beiträge
    2.296
    Beitragswertungen
    360 Beitragspunkte
    Ja, kannst ruhig ein neues Thema dafür aufmachen.

    Wir schauen uns den Ilch-Teil an. Der Java-Teil ist ja auch nicht der Teil den Ilch installieren würde.
    Ein Link zur Java-Anwendung in der Beschreibung oder bei den Einstellungen des Moduls ist kein Problem.

    Hier noch ein Vorschlag für die AfterDatabaseLoad.php (wahrscheinlich noch passKey ergänzen):
            // Early return if configuration is not completed.
            if (empty($config->get('discordnotifier_destinationAdress')) or empty($config->get('discordnotifier_urlToPage'))) {
                return;
            }
    
            if (class_exists(ArticleConfig::class)) {
                $article = new \Modules\Discordnotifier\Events\Article();
                on(ArticleConfig::EVENT_ADDARTICLE_AFTER, [$article, 'newArticle']);
            }
            
            if (class_exists(ForumConfig::class)) {
                $forum = new \Modules\Discordnotifier\Events\Forum();
                on(ForumConfig::EVENT_ADDPOST_AFTER, [$forum, 'newPost']);
                on(ForumConfig::EVENT_ADDTOPIC_AFTER, [$forum, 'newTopic']);
            }
    0 Mitglieder finden den Beitrag gut.
  27. #27
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    Ahh OK. Mach ich heute Abend. Danke für den Hinweis.^^
    0 Mitglieder finden den Beitrag gut.
  28. #28
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    Guten Morgen,

    ich verzweifel an diesem Controller, View und Mapper krams ^^.

    Ich meine ich hab son bissl was rausbekommen, aber das langt nich für das was ich vorhabe.

    Ich komme entweder an nen Punkt wo

    no valid secure token given, add function getTokenField() to formular


    erscheint.

    Oder aber meine Methode is nicht Valid..

    Kurzzeitig hatte ich mal die Ausgabe der indexAction vom Controller, aber die hat sich nun auch verabschiedet und will nicht mehr zurückkommen ^^.

    Ich poste deshalb einfach mal meine Dateien... und hoffe mich kann jemand durch diesen Jungle nen bissl durchlotsen ^^.

    Also..

    view/index/index.php (Hier hatte ich auch schon versucht mir das ganze Zeugs irgendwie im Controller verarbeiten zu lassen, aber ich habs nich hinbekommen und habe mir nun einfach alles irgendwie brauchbare aus dem Article Modul rausgerkamt und erstmal hingeklatscht, also bitte nicht schimpfen xD.
    Ich wollt ja wenigstens nur erstmal in die controller funktion reinkommen.
    <?php
    
    $adminAccess = null;
    if ($this->getUser()) {
        $adminAccess = $this->getUser()->isAdmin();
    }
    
    $isAppRequest = $this->getRequest()->getParam('app');
    
    
    if(!empty($isAppRequest) && $isAppRequest == 'mobileilch'){
    	
    	if($this->getRequest()->getParam('action') == 'article'){
    		//ARTICLES______________________________________________________________________________________________
    		$this->getRequestedArticles();
    		$articles = $this->get('articles');
    		$categoryMapper = $this->get('categoryMapper');
    		$commentMapper = $this->get('commentMapper');
    		$userMapper = $this->get('userMapper');
    		
    		
    				if ($articles != ''){
    					$displayedArticles = 0;
    
    					foreach ($articles as $article){
    						if (!is_in_array($this->get('readAccess'), explode(',', $article->getReadAccess())) && $adminAccess == false) {
    							continue;
    						}
    
    						$displayedArticles++;
    
    						$date = new \Ilch\Date($article->getDateCreated());
    						$commentsCount = $commentMapper->getCountComments(sprintf(Modules\Article\Config\Config::COMMENT_KEY_TPL, $article->getId()));
    						$image = $article->getImage();
    						$imageSource = $article->getImageSource();
    
    						$catIds = explode(",", $article->getCatId());
    						$categories = '';
    						foreach ($catIds as $catId) {
    							$articlesCats = $categoryMapper->getCategoryById($catId);
    							$categories .= '<a href="'.$this->getUrl(['controller' => 'cats', 'action' => 'show', 'id' => $catId]).'">'.$articlesCats->getName().'</a>, ';
    						}
    						
    						
    						if ($article->getTeaser()){
    						$this->escape($article->getTeaser());
    						}
    						
    						$this->escape($article->getTitle());
    						
    						if (!empty($image)){
    						$this->getBaseUrl($image);
    							if (!empty($imageSource)){
    								$this->escape($imageSource);
    							}
    						}
    						
    						$content = $article->getContent(); 
    						
    						if ($article->getAuthorId() != ''){
    							$user = $userMapper->getUserById($article->getAuthorId());
    							if ($user != ''){
    						$this->getUrl(['module' => 'user', 'controller' => 'profil', 'action' => 'index', 'user' => $user->getId()]) ?>"><?=$this->escape($user->getName());
    							}
    						}
    						
    						
    						if ($article->getKeywords() != ''){
    							$article->getKeywords();
    						}
    					}
    				}
    		//ARTICELS END__________________________________________________________________________________________
    	}
    	/*elseif(){
    		//FORUM_________________________________________________________________________________________________
    		
    		//FORUM END_____________________________________________________________________________________________
    	}
    	elseif(){
    		//GÄSTEBUCH_____________________________________________________________________________________________
    		
    		//GÄSTEBUCH END_________________________________________________________________________________________
    	}
    	*/
    	else $this->get('noRequest');
    	
    }
    else $this->get('noRequest');


    controllers/index.php
    <?php
    /**
     * @copyright Ilch 2.0
     * @package ilch
     */
    
    namespace Modules\Mobileilch\Controllers;
    
    
    //Article
    use Modules\Mobileilch\Controllers\MIArticles as MIArticleController;
    
    //Weitere wie Forum, Gästebuch usw...
    //....
    //....
    //....
    
    class Index extends \Ilch\Controller\Frontend
    {
    	
    	public function indexAction(){
    		$this->getView()->set('noRequest', 'Diese Website verwendet das Mobile ilch Plugin!!');
    	}
    
    	
        public function getRequestedArticles($action){
    		
    		$MIArticleController = new MIArticleController();
    		$MIArticleController->getArticles();
    	}
    	
    	
    }


    controllers/MIArticles
    <?php
    /**
     * @copyright Ilch 2.0
     * @package ilch
     */
    
    namespace Modules\Mobileilch\Controllers;
    
    use Modules\Article\Mappers\Article as ArticleMapper;
    use Modules\Article\Mappers\Category as CategoryMapper;
    use Modules\Comment\Mappers\Comment as CommentMapper;
    use Modules\User\Mappers\User as UserMapper;
    
    class MIArticles extends \Ilch\Controller\Frontend
    {
       public function getArticles(){
    		$articleMapper = new ArticleMapper();
            $categoryMapper = new CategoryMapper();
            $commentMapper = new CommentMapper();
            $userMapper = new UserMapper();
            $pagination = new \Ilch\Pagination();
    
           // $pagination->setRowsPerPage(!$this->getConfig()->get('article_articlesPerPage') ? $this->getConfig()->get('defaultPaginationObjects') : $this->getConfig()->get('article_articlesPerPage'));
           // $pagination->setPage($this->getRequest()->getParam('page'));
    
            $userId = null;
            if ($this->getUser()) {
                $userId = $this->getUser()->getId();
            }
            $user = $userMapper->getUserById($userId);
    
            $ids = [3];
            if ($user) {
                $ids = [];
                foreach ($user->getGroups() as $us) {
                    $ids[] = $us->getId();
                }
            }
            $readAccess = explode(',',implode(',', $ids));
    
            $this->getView()->set('categoryMapper', $categoryMapper)
                ->set('commentMapper', $commentMapper)
                ->set('userMapper', $userMapper)
                ->set('article_articleRating', \Ilch\Registry::get('config')->get('article_articleRating'))
                ->set('articles', $articleMapper->getArticles($this->locale, $pagination))
                ->set('pagination', $pagination)
                ->set('readAccess', $readAccess);
    		
       }
    }


    config/config.php
    <?php
    /**
     * @copyright Ilch 2.0
     * @package ilch
     */
    
    namespace Modules\Mobileilch\Config;
    
    class Config extends \Ilch\Config\Install
    {
        public $config = [
            'key' => 'mobileilch',
    		'version' => '0.1',
    		'author' => 'Raptusguru',
    		'link' => 'https://www.underground-community.com',
            'icon_small' => 'fa-mobile-alt',
            'languages' => [
                'de_DE' => [
                    'name' => 'Mobile ilch',
                    'description' => 'Ein Plugin welches eine notwendige API für Mobile ilch bereitstellt.',
                ],
                'en_EN' => [
                    'name' => 'Mobile ilch',
                    'description' => 'A plugin wich provides an necessary API for Mobile ilch.',
                ],
            ],
    		'ilchCore' => '2.1.0',
            'phpVersion' => '5.6'
        ];
    
        public function install()
        {
            $databaseConfig = new \Ilch\Config\Database($this->db());
        }
    
        public function getInstallSql()
        {
            return null;
    	}
    	
    	public function uninstall()
        {
    								 
        }
    
        public function getUpdate($installedVersion)
        {
    
        }
    }


    Ich würde die Artikel als JSON-Ausgabe benötigen, falls das noch ne Rolle spielt. Also ich benötige alles als JSON (Gästebuch, Forum, usw...) Aber für den Anfang wäre es tolle wenn mir jemand erklärt wie das mit den Artikeln fürs erste funktioniert, damit ich irgendwie die Logik dahinter begreife ^^.

    Vielen Dank.

    MFG Raptus ^^.
    0 Mitglieder finden den Beitrag gut.
  29. #29
    User Pic
    Siggi Hall Of Fame
    Registriert seit
    08.02.2007
    Beiträge
    6.558
    Beitragswertungen
    327 Beitragspunkte
    Die Fehlermeldung kommt bei Formularen wenn diese keinen gültigen Token enthalten.

    Einfach nach der Form einfügen
    <?=$this->getTokenField() ?>
    0 Mitglieder finden den Beitrag gut.
  30. #30
    User Pic
    Raptusguru Mitglied
    Registriert seit
    10.02.2010
    Beiträge
    148
    Beitragswertungen
    11 Beitragspunkte
    Danke für den Tipp,

    aber ich habe keine Form wo ich es einfügen könnte.

    Ich übermittel ja eigendlich nur von außerhalb des CMS per GET oder POST (POST wäre mir lieber) zwei parameter auf die reagiert werden soll.
    0 Mitglieder finden den Beitrag gut.
Geschlossen

Zurück zu Module und Modifikationen

Optionen: Bei einer Antwort zu diesem Thema eine eMail erhalten