Contao-Camp 2024
Ergebnis 1 bis 27 von 27

Thema: getAllEvents Hook - verständliche Anleitung

  1. #1
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard getAllEvents Hook - verständliche Anleitung

    Moin zusammen,

    würde gerne mit einem getAllEvents Hook meine Eventliste einschränken.

    https://docs.contao.org/dev/referenc.../getAllEvents/
    habe ich gesehen aber ich verstehs nicht

    Würde mir gerne praktische, konkrete Beispiele dazu ansehen. Hat da jemand einen Link für mich?

    Im Prinzip muss das hier
    PHP-Code:
    <?php 
    $aliasUrl 
    = \Input::get('auto_item');
    $result = \Database::getInstance()->prepare("SELECT name FROM mm_plz WHERE alias= '" $aliasUrl "'")->execute(1);
    $PLZ $result->name
    if(
    $this->postal !== $PLZ)

      return; 
    }  
    ?>
    verarbeitet werden und die Events, mit der Postleitzahl, die in der Url übergeben wird, anzeigen ...

    Besten Dank vorab!

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.040
    Partner-ID
    10107

    Standard

    Hier wäre ein praktisches Beispiel aus einer Extension: https://github.com/inspiredminds/con...tsListener.php
    » sponsor me via GitHub or PayPal or Revolut

  3. #3
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    Hallo Spooky,

    ich habe eine recht "einfache Erweiterung"
    - erdmannfreunde/calendar_feature
    auf meine Bedürfnisse angepasst.

    Wenn ich das Paket als .zip über den C Manager hochlade kommt die Meldung

    - Die composer.json Schema-Validierung ist fehlgeschlagen. Error validating /version: The property version is required

    Ist das überhaupt der richtige Weg über den C Manager oder kann ich die Erweiterung direkt im vendor Ordner ablegen?

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.040
    Partner-ID
    10107

    Standard

    Du solltest das als Applikationsanpassung umsetzen, statt als eigenes Bundle.
    » sponsor me via GitHub or PayPal or Revolut

  5. #5
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    Das hätte nicht gereicht, da ich über eine Checkbox im Listenmodul die Eventliste filtern möchte…

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.040
    Partner-ID
    10107

    Standard

    Zitat Zitat von marcohe Beitrag anzeigen
    Das hätte nicht gereicht, da ich über eine Checkbox im Listenmodul die Eventliste filtern möchte…
    Die Checkbox fügst du über eine DCA Anpassung in contao/dca/tl_module.php hinzu.
    » sponsor me via GitHub or PayPal or Revolut

  7. #7
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Beitrag

    Zitat Zitat von Spooky Beitrag anzeigen
    Die Checkbox fügst du über eine DCA Anpassung in contao/dca/tl_module.php hinzu.
    Die DCA Anpassung liegt jetzt halt in dem Paket… Aber wenn dein Vorschlag einfacher ist mache ich das so. Geh nochmal ran u melde mich wieder.

  8. #8
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    DCA ist ist angepasst.
    Hook > EventsFeature.php liegt in src/EventListener/EventsFeature.php

    Wie muss der Pfad zur config.php heißen in der der Hook registriert wird?
    $GLOBALS['TL_HOOKS']['getAllEvents'][] = array('EventsFeature', 'getFeaturedEvents');

    Besten Dank!

  9. #9
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.040
    Partner-ID
    10107

    Standard

    Wenn du Annotations nutzt, brauchst du das nicht. Poste mal deine EventsFeature.php
    » sponsor me via GitHub or PayPal or Revolut

  10. #10
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Wenn du Annotations nutzt, brauchst du das nicht. Poste mal deine EventsFeature.php
    PHP-Code:
    <?php

    namespace App\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;
    use 
    Contao\Module;

     class 
    EventsFeature
     
    {

      public function 
    __invoke(array $events, array $calendarsint $timeStartint $timeEndModule $module): array {


             foreach (
    $arrEvents as $key=>$days)
             {
                 foreach (
    $days as $day=>$events)
                 {
                     foreach (
    $events as $arrCol=>$event)
                     {
              switch (
    $objModule->events_featured) {
                case 
    'featured_events':
                  if (
    $event['featured'] != 1) {

                    unset(
    $arrEvents[$key][$day][$arrCol]);
                  }
                  break;

                case 
    'unfeatured_events':
                  if (
    $event['featured'] == 1) {

                    unset(
    $arrEvents[$key][$day][$arrCol]);
                  }
                  break;

                case 
    'all_events':

                  break;
                      
                default:

                  break;
              }
                     }
                 }
             }

        return 
    $arrEvents;
       }
     }

  11. #11
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.040
    Partner-ID
    10107

    Standard

    Dir fehlt noch
    PHP-Code:
    /**
     * @Hook("getAllEvents")
     */ 
    Siehe zB. https://docs.contao.org/dev/referenc...vents/#example
    » sponsor me via GitHub or PayPal or Revolut

  12. #12
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Dir fehlt noch
    PHP-Code:
    /**
     * @Hook("getAllEvents")
     */ 
    Siehe zB. https://docs.contao.org/dev/referenc...vents/#example
    Damit hats mir nach dem Aufbau des Prod.Cache die Seite zerschossen

    Code:
    [2022-06-11 20:04:16] request.CRITICAL: Uncaught PHP Exception TypeError: "Return value of App\EventListener\EventsFeature::__invoke() must be of the type array, null returned" at /www/.../src/EventListener/EventsFeature.php line 51 {"exception":"[object] (TypeError(code: 0): Return value of App\\EventListener\\EventsFeature::__invoke() must be of the type array, null returned at /www/.../src/EventListener/EventsFeature.php:51)"} []
    Geändert von marcohe (11.06.2022 um 19:32 Uhr)

  13. #13
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.040
    Partner-ID
    10107

    Standard

    Ja, weil der Hook jetzt funktioniert . Dein Return passt aber noch nicht, wie die Fehlermeldung schon sagt.
    » sponsor me via GitHub or PayPal or Revolut

  14. #14
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    Danke. Ist wie gesagt mein erster Hook. Muss noch viel lernen Aber läuft jetzt. Danke dir!

    PHP-Code:
    <?php

    namespace App\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;
    use 
    Contao\Module;

    /**
     * @Hook("getAllEvents")
     */

     
    class EventsFeature
     
    {

      public function 
    __invoke ($arrEvents$arrCalendars$intStart$intEnd$objModule) {


             foreach (
    $arrEvents as $key=>$days)
             {
                 foreach (
    $days as $day=>$events)
                 {
                     foreach (
    $events as $arrCol=>$event)
                     {
              switch (
    $objModule->events_featured) {
                case 
    'featured_events':
                  if (
    $event['featured'] != 1) {

                    unset(
    $arrEvents[$key][$day][$arrCol]);
                  }
                  break;

                case 
    'unfeatured_events':
                  if (
    $event['featured'] == 1) {

                    unset(
    $arrEvents[$key][$day][$arrCol]);
                  }
                  break;

                case 
    'all_events':

                  break;
                      
                default:

                  break;
              }
                     }
                 }
             }

        return 
    $arrEvents;
       }
     }
    Geändert von marcohe (12.06.2022 um 07:08 Uhr)

  15. #15
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    ..
    Geändert von marcohe (18.08.2022 um 10:58 Uhr)

  16. #16
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    Hallo zusammen, Ich bins nochmal

    Wenn mir jetzt der Query s.u. direkt 0-n IDs aus tl_calendar_events findet und ich diese Events mit dem Hook ausgeben möchte kann ich mein bewährtes Schema nicht mehr anwenden.
    Hättest du mir hier noch einen Tipp in die richtige Richtung?

    Danke!

    PHP-Code:
    case 'filter_genre':
                      
                
    $aliasUrl = \Input::get('auto_item');
                
    $result = \Database::getInstance()->prepare("SELECT id from tl_calendar_events WHERE kuenstler = ANY (SELECT k.id FROM mm_kuenstler k LEFT JOIN tl_metamodel_tag_relation rel ON (k.id = rel.item_id) WHERE rel.att_id = 265 AND rel.value_id = (SELECT id FROM mm_genre WHERE alias= '" $aliasUrl "'))")->execute();
               ???????????????
                        {
                            unset(
    $arrEvents[$key][$day][$arrCol]);
                        }

                  break; 
    Geändert von marcohe (18.08.2022 um 10:58 Uhr)

  17. #17
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    490

    Standard Wiederholende Events als Liste ausgeben (mittels getAllEvents-Hook)

    Hallo @marcho,

    ich möchte auch eigene Liste mit den sich wiederholenden Events haben. Dazu will ich auch diesen Hook verwenden. Ich habe mich schon an deinem Beispiel orientiert, weiß aber noch nicht, ob mein Code funktionieren kann. Hättest du Zeit und Lust, darüber zu schauen? Siehe diesen Beitrag.

  18. #18
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Frage

    Zitat Zitat von jenda Beitrag anzeigen
    Hallo @marcho,

    ich möchte auch eigene Liste mit den sich wiederholenden Events haben. Dazu will ich auch diesen Hook verwenden. Ich habe mich schon an deinem Beispiel orientiert, weiß aber noch nicht, ob mein Code funktionieren kann. Hättest du Zeit und Lust, darüber zu schauen? Siehe diesen Beitrag.
    Habe ich es richtig verstanden. Du Möchtest du zu einem Event nur dessen Wiederholungen auf der selben Seite anzeigen?

  19. #19
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    490

    Standard

    Genau. Dabei stellen sich noch 3 Fragen:

    1. Wie frage ich den Hook im betroffenen Template ab
    2. Muss ich eine Checkbox per DCA im Backendmodul hinzufügen, um nur die wiederholenden Events ausgeben zu können?
    3. Ist mein Code richtig?

  20. #20
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    Zitat Zitat von jenda Beitrag anzeigen
    Genau. Dabei stellen sich noch 3 Fragen:

    1. Wie frage ich den Hook im betroffenen Template ab
    2. Muss ich eine Checkbox per DCA im Backendmodul hinzufügen, um nur die wiederholenden Events ausgeben zu können?
    3. Ist mein Code richtig?
    Das Listenmodul musst du z.B. per DCA um die Checkbox erweitern. Im Hook prüfst du ob Checkbox gesetzt und schränkst dann die Liste ein über recurring und den alias in der URL ein. Im Template gibts du dann per Inserttag das Listenmodul aus...
    Geändert von marcohe (13.04.2024 um 11:15 Uhr)

  21. #21
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    Zitat Zitat von jenda Beitrag anzeigen
    Genau. Dabei stellen sich noch 3 Fragen:
    Ist mein Code richtig?
    Bin da auch kein Spezialist aber ich kann es mir später am PC mal anschauen...

  22. #22
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    490

    Standard

    Zitat Zitat von marcohe Beitrag anzeigen
    Das Listenmodul musst du z.B. per DCA um die Checkbox erweitern. Im Hook prüfst du ob Checkbox gesetzt und schränkst dann die Liste ein über recurring und den alias in der URL ein. Im Template gibts du dann per Inserttag das Listenmodul aus...
    Super. Danke. Nun habe ich auch eine Checkbox durch folgenden Code unter contao/dca/tl_module.php hinzugefügt.

    PHP-Code:
    <?php
    use Contao\CoreBundle\DataContainer\PaletteManipulator;

    // Beschreibung der Felder
    $GLOBALS['TL_DCA']['tl_module']['eventlist']['fields']['onlyRecurringEvents'] = array(
        
    'label' => &$GLOBALS['TL_LANG']['tl_module']['onlyRecurringEvents'],
        
    'inputType' => 'checkbox',
        
    'eval' => array('tl_class' => 'w50'),
        
    'sql' => "char(1) NOT NULL default ''"
    );

    PaletteManipulator::create()
        ->
    addField('onlyRecurringEvents''cal_hideRunning'PaletteManipulator::POSITION_AFTER)
        ->
    applyToPalette('eventlist''tl_module');
    Dann habe ich den Code für den Hook angepasst. Jetzt sollte es stimmen, oder?

    PHP-Code:
    <?php
    namespace App\EventListener;

    use 
    Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
    use 
    Contao\Module;

    #[AsHook('getAllEvents')]
    class getAllRepeatingEvents
    {
        public function 
    __invoke(array $events, array $calendarsint $timeStartint $timeEndModule $module): array
        {
            foreach (
    $events as $key => $days) {
                foreach (
    $days as $day => $events) {
                    foreach (
    $events as $event) {
                        switch (
    $objectModule->onlyRecurringEvents) {
                            case 
    'onlyRecurringEvents':
                                if (
    $event['recurring'] == true) {
                                    unset(
    $events[$key][$day][$event]);
                                };
                                break;
                        }
                    }
                }
            }
            return 
    $events;
        }
    }
    Geändert von jenda (13.04.2024 um 12:24 Uhr)

  23. #23
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    Naja wenn du alle Wiederholungen eines speziellen Events ausgeben willst musst du noch eine Abfrage auf den Alias mit einbauen.

  24. #24
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    490

    Standard

    Zitat Zitat von marcohe Beitrag anzeigen
    Naja wenn du alle Wiederholungen eines speziellen Events ausgeben willst musst du noch eine Abfrage auf den Alias mit einbauen.
    Danke. Ich mache es auch auch zum ersten Mal, daher frage ich hier die Basicsachen. Wo müsste ich es abfragen? In derselben Zeile?

    PHP-Code:
    if ($event['recurring'] == true) {
     unset(
    $events[$key][$day][$event][$alias]);
    }; 

  25. #25
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    Zitat Zitat von jenda Beitrag anzeigen
    Danke. Ich mache es auch auch zum ersten Mal, daher frage ich hier die Basicsachen. Wo müsste ich es abfragen? In derselben Zeile?

    PHP-Code:
    if ($event['recurring'] == true) {
     unset(
    $events[$key][$day][$event][$alias]);
    }; 
    Du musst dir den Alias erst holen etwa so
    PHP-Code:
    $aliasUrl = \Input::get('auto_item');
    $result = \Database::getInstance()->prepare("SELECT id FROM tl_calendar_events WHERE alias= '" $aliasUrl "'")->execute(1); 

  26. #26
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    490

    Standard

    Danke. Dann würde der Code so aussehen müssen?

    PHP-Code:
    <?php
    namespace App\EventListener;

    use 
    Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
    use 
    Contao\Module;

    #[AsHook('getAllEvents')]
    class getAllRepeatingEvents
    {
        public function 
    __invoke(array $events, array $calendarsint $timeStartint $timeEndModule $module): array
        {
            foreach (
    $events as $key => $days) {
                foreach (
    $days as $day => $events) {
                    foreach (
    $events as $event) {
                        switch (
    $objectModule->onlyRecurringEvents) {
                            case 
    'onlyRecurringEvents':
                                if (
    $event['recurring'] == true) {
                                    
    $aliasUrl = \Input::get('auto_item');
                                    
    $result = \Database::getInstance()->prepare("SELECT id FROM tl_calendar_events WHERE alias= '" $aliasUrl "'")->execute(1); 
                                    unset(
    $events[$key][$day][$event][$result]);
                                };
                                break;
                        }
                    }
                }
            }
            return 
    $events;
        }
    }

  27. #27
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    Nein das kann so nicht funktionieren. Der Aufbau ist komplett falsch. Ich bin auch kein php Spezialist deshalb warten wir besser suf weitere Antworten bevor es weiter in die falsche Richtung geht

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •