Contao-Camp 2024
Ergebnis 1 bis 13 von 13

Thema: Insert-Tag Hook über Annotation nur im Debug-Modus

  1. #1
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    160

    Standard Insert-Tag Hook über Annotation nur im Debug-Modus

    Hallo zusammen,

    ich habe zurzeit das Problem, dass meine eigenen Insert-Tags nur im Debug Modus von Contao 4.11 funktionieren.

    Ich habe mich dabei an die folgende Anleitung gehalten.

    https://docs.contao.org/dev/framework/insert-tags/

    In der Anleitung steht dazu: "Creating this file while using the Hook service annotation within is all you have to do in Contao 4.9 and upwards."

    Folgende Dateien habe ich angelegt.

    PHP-Code:
    // src/EventListener/ColorInsertTagListener.php

    namespace App\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;

    /**
     * @Hook("replaceInsertTags")
     */
    class ColorInsertTagListener
    {
        public const 
    TAG 'color';
        
        public function 
    __invoke(string $tag)
        {

            
    // Split tag
            
    $chunks explode('::'$tag3);

            
    // Check if tag is valid
            
    if (count($chunks) !== || $chunks[0] !== self::TAG) return false;

            
    // Return string
            
    return '<span class="color-' $chunks[1] . '">' $chunks[2] . '</span>';

        }

    PHP-Code:
    // src/EventListener/StrongInsertTagListener.php

    namespace App\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;

    /**
     * @Hook("replaceInsertTags")
     */
    class StrongInsertTagListener
    {
        public const 
    TAG 'strong';
        
        public function 
    __invoke(string $tag)
        {

            
    // Split tag
            
    $chunks explode('::'$tag2);

            
    // Check if tag is valid
            
    if (count($chunks) !== || $chunks[0] !== self::TAG) return false;
            
            
    // Return string
            
    return '<strong>' $chunks[1] . '</strong>';

        }

    Im Debug-Modus funktioniert es wunderbar. Leider funktioniert es im Prod-Environment nicht.

    Folgendes habe ich versucht:

    - Contao Manager: Prod-Cache leeren
    - Contao Manager: Composer Class Loader => Datei aktualisieren
    - Contao Manager: Composer-Abhängigkeiten => Installer ausführen
    - Contao Manager: Composer-Cache => Cache leeren
    - Contao Manager: Opcode-Cache => Cache leeren
    - Contao Backend: Systemwartung => Alle Daten bereinigt

    Leider werden die Insert Tags nach wie vor nur im Debug Modus ersetzt. Habe ich hier etwas übersehen?

    Danke und VG
    Dennis

  2. #2
    Contao-Nutzer
    Registriert seit
    03.10.2020.
    Beiträge
    41

    Standard

    Im Code fehlt evtl. der geforderte Return (siehe Beispiel):
    If your function is not responsible for this insert tag, you must return false to continue to the next hook callback.


    Ich habe für 4.9.13 ebenfalls einen eigenen Insert-Tags Hook erstellt. Da tritt nun das gleiche Problem auf, nur umgekehrt

    Dieser funktioniert nur in der Prod, im Debugmodus erhalte ich die Fehlermeldung
    Code:
    Unknown insert tag {{userOrt}} on page ...
    Ist dies evtl. das gleiche Problem?
    PHP-Code:
    <?php
    // src/EventListener/userOrteShownameInsertTagListener.php

    namespace App\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;
    use 
    Doctrine\DBAL\Connection
    use 
    Contao\FrontendUser;

    /**
     * @Hook("replaceInsertTags")
     */
    class userOrteShownameInsertTagListener
    {
        public function 
    __invoke(
            
    string $insertTag
        
    )
        {
            if (
    'userOrt' === $insertTag) {
                
    $myScope TL_MODE;
                if (
    'FE' === $myScope)
                {
                    
    $objUser FrontendUser::getInstance();
                    
    $idOrt =  $objUser->homeTown;

                    
    $db = \Contao\System::getContainer()->get('database_connection');
                    
    $homeTownOrt $db->executeQuery('SELECT * FROM mm_dz_ort_ort WHERE id = ?', array($idOrt))->fetch();

                    return 
    $homeTownOrt['Ort'];
                }
                return 
    false;
            }
            return 
    false;
        }
    }
    Geändert von stu (12.05.2021 um 10:53 Uhr)

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

    Standard

    Zitat Zitat von stu Beitrag anzeigen
    Im Code fehlt evtl. der geforderte Return (siehe Beispiel):
    If your function is not responsible for this insert tag, you must return false to continue to the next hook callback.
    Den entsprechenden return hat er drin.
    » sponsor me via GitHub or PayPal or Revolut

  4. #4
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    160

    Standard

    Wir konnten das Problem jetzt beheben, indem wir in der Fehleranalyse Schritt für Schritt vorgegangen sind. Warum die Insert-Tags in unserer anderen Instanz nur im Debug-Modus angezeigt werden, ist weiterhin unklar. Wir sind nun wie folgt vorgegangen.

    - Contao 4.11.2 Core installiert
    - Beispielscript von https://docs.contao.org/dev/referenc...aceInsertTags/ eingefügt und erfolgreich getestet
    - Unsere eigenen Insert-Tags hinzugefügt und erfolgreich getestet
    - Composer.json übertragen und zusätzliche Erweiterungen installiert
    - Datenbank, Files und Templates übertragen

    Am Ende funktionierten die Insert-Tags weiterhin. Wenn wir alles bei 1&1 in einem Durchgang machen, funktionieren die Insert-Tags nur im Debug-Modus. Warum das so ist, ist mir ein Rätsel, aber nun haben wir eine Instanz bei 1&1, die funktioniert.

  5. #5
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    160

    Standard

    Wir haben heute eher durch Zufall herausgefunden, warum die Insert-Tags nicht geladen wurden. Es hing mit einer Anpassung am DCA zusammen. Unsere bisherige Dateistruktur sah wie folgt aus.

    - src\
    - EventListener\
    - ColorInsertTagListener.php
    - StrongInsertTagListener.php
    - Resources\
    - contao\
    - dca\
    - tl_content.php

    Wenn wir die "tl_content.php" gelöscht haben, wurden auch die Insert-Tags geladen. Der Resources-Order gehörte nicht in den Ordner "src", sondern in den Ordner "app". Mit folgender Ordnerstruktur hat es dann geklappt.

    - app\
    - Resources\
    - contao\
    - dca\
    - tl_content.php
    - src\
    - EventListener\
    - ColorInsertTagListener.php
    - StrongInsertTagListener.php

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

    Standard

    Irgendwie vermischst du hier zwei Dinge. Ist das nun eine Applikationsanpassung oder eine Extension?
    » sponsor me via GitHub or PayPal or Revolut

  7. #7
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    160

    Standard

    Es ging mir in erster Linie darum, zwei Insert Tags zu erzeugen und den DCA zu erweitern. Wie die Änderungen zustande kommen, war für mich erst einmal zweitrangig.

    Für die Insert-Tags hatte ich mich jetzt an folgender Dokumentation orientiert.

    https://docs.contao.org/dev/framework/insert-tags/

    Auf den Pfad "app" bin ich hier gestoßen.

    https://contao-academy.de/blog/conta...und-langconfig

    Wobei es, wenn ich das richtig sehe, unter docs.contao.org noch die Variante mit dem Ordner "contao" gibt.

    https://docs.contao.org/dev/getting-started/dca/

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

    Standard

    Du hast zwar meine Frage nicht beantwortet, aber ich vermute es geht um eine Applikationsanpassung und nicht um eine Extension . Und du solltest natürlich immer das machen, was in der Dokumentation steht. Richtig wäre also folgende Struktur:

    Code:
    contao/
        dca/
            tl_content.php
    src/
        EventListener/
            ColorInsertTagListener.php
            StrongInsertTagListener.php
    Den app/ Ordner solltest du nicht mehr verwenden.
    » sponsor me via GitHub or PayPal or Revolut

  9. #9
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    160

    Standard

    Genau, es ging um eine Applikationsanpassung. Ich habe erst spät gemerkt, dass der Bau einer Erweiterung für minimale Anpassungen an einer Contao-Instanz ja eigentlich unnötig ist. Der App-Ordner wird für solche Anpassungen zukünftig nicht mehr verwenden.

    Vielen Dank, wieder was gelernt.

  10. #10
    Contao-Nutzer
    Registriert seit
    26.10.2021.
    Beiträge
    4

    Standard Ich habe das gleiche Problem mit processFormData Hook (Contao 4.11.9)

    Ich hänge mich jetzt einfach mal in den Thread, denn ich habe wohl das gleiche Problem.
    Mein processFormData Hook mit Annotation läuft auch nur im Debug-Mode. Sonst wird er scheinbar nicht aufgerufen (bekomme dann z.B. keine Log-Messages).

    PHP-Code:
    <?php
    /* Contao-Root/src/cje/ */
    namespace App\cje;

    use 
    Contao\CoreBundle\Monolog\ContaoContext;
    use 
    Psr\Log\LogLevel;

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

    use 
    Contao\Form;

    use 
    Contao\Database;
      
    class 
    FormHookListener
    {
        
    /**
         * @Hook("processFormData")
         */
        
    public function onProcessFormData(
            array 
    $submittedData
            array 
    $formData
            ?array 
    $files
            array 
    $labels
            
    Form $form
        
    ): void
        
    {
            \
    System::log('ProcessFormData: called (FormId: ' $form->formID ')'__METHOD__TL_FORMS);

            if (
    $form->formID == 'status') {
              \
    System::log('ProcessFormData Passcode ' $submittedData['passcode'], __METHOD__TL_FORMS);
              
    $status_response fonti_check_status($submittedData['passcode']);
              \
    System::log('ProcessFormData Status response: ' $status_response__METHOD__TL_FORMS);
              
              
    $session = \Session::getInstance();
              
    $session->set('status_response'$status_response);
            }

            if (
    $form->formID == 'abrechnung') {
            }
        }

        
    /**
         * @Hook("prepareFormData")
         */
        
    public function onPrepareFormData(
            array &
    $submittedData
            array 
    $labels
            array 
    $fields
            
    Form $form
        
    )
        {

        }
    }
    Was mache ich da falsch? Bin noch recht neu im Umgang mit Contao.

    Die Datei habe ich unter FormHookListener.php unter [contao_root]/src/cje abgelegt.
    Geändert von wollibk (27.10.2021 um 17:44 Uhr)

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

    Standard

    Hast du composer install danach ausgeführt?
    » sponsor me via GitHub or PayPal or Revolut

  12. #12
    Contao-Nutzer
    Registriert seit
    26.10.2021.
    Beiträge
    4

    Standard

    Ja, das habe ich mehrfach ausgeführt. Leider ohne Erfolg.

  13. #13
    Contao-Nutzer
    Registriert seit
    26.10.2021.
    Beiträge
    4

    Standard

    Ich habe es jetzt in services.yml die Registrierung meines Hooks eingebaut und es funktioniert jetzt ohne Debug-Modus.

    Code:
    services:
        App\cje\FormHookListener:
            tags:
                - { name: contao.hook, hook: FormHook, method: onPrepareFormData, priority: 0 }

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
  •