Contao-Camp 2024
Ergebnis 1 bis 10 von 10

Thema: Frage zu callbacks

  1. #1
    Contao-Fan
    Registriert seit
    20.10.2012.
    Ort
    Berlin
    Beiträge
    257

    Standard Frage zu callbacks

    Ich hab ein Produktattribut Textfeld (youtube) erstellt und würd gern den save_callback aus tl_content darauf anwenden
    https://github.com/contao/core-bundl....php#L606-L609
    https://github.com/contao/core-bundl...tent.php#L1919
    PHP-Code:
    <?php
    //dcaconfig.php
    $GLOBALS['TL_DCA']['tl_iso_product']['fields']['youtube']['save_callback'][] = array('tl_content''extractYouTubeId');
    allerdings bekomm ich immer eine Fehlermeldung im BE:
    System::import() failed because class "tl_content" is not a valid class name or does not exist.
    Wie find ich denn den richtigen Classname ohne das ich den Code dupliziere?

    Ist system/config/dcaconfig.php überhaupt noch (contao 4.10) der Richtige Ort um das zu machen?

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

    Standard

    Zitat Zitat von andre.saage Beitrag anzeigen
    Ist system/config/dcaconfig.php überhaupt noch (contao 4.10) der Richtige Ort um das zu machen?
    Grundsätzlich nicht, nein . Callbacks registrierst du so: https://docs.contao.org/dev/framewor...ring-callbacks

    In deinem eigenen Callback müsstest du dann \Contao\System::loadDataContainer('tl_content') aufrufen, damit du dann (new \tl_content())->extractYouTubeId(); aufrufen kannst. Oder du implementierst es selbst, was sicherer ist, denn es gibt keine Garantie dafür, dass tl_content::extractYouTubeId für immer existieren wird.

  3. #3
    Contao-Fan
    Registriert seit
    20.10.2012.
    Ort
    Berlin
    Beiträge
    257

    Standard

    Grundsätzlich nicht, nein
    Das ist mir eigentlich schon geläufig aber ich finde es echt ätzend, dass man für so Kleinigkeiten immer gleich ein ganzes Bundle mit einem dutzend Dateien und Ordnern erstellen muss.

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

    Standard

    Zitat Zitat von andre.saage Beitrag anzeigen
    Das ist mir eigentlich schon geläufig aber ich finde es echt ätzend, dass man für so Kleinigkeiten immer gleich ein ganzes Bundle mit einem dutzend Dateien und Ordnern erstellen muss.
    Warum willst du ein Bundle erstellen? Ab Contao 4.9 musst du nur genau eine einzige Datei anlegen, um den Callback zu implementieren.
    Geändert von Spooky (27.12.2020 um 21:27 Uhr)

  5. #5
    Contao-Fan
    Registriert seit
    20.10.2012.
    Ort
    Berlin
    Beiträge
    257

    Standard

    Ich krieg's nicht hin....

    Grundsätzlich krieg ich 'ne dca Anpassung auch der Stelle geregelt: app/Resources/contao/dca/tl_iso_product.php aber ohne save_callback...

    jetzt hab ich von vorn gestartet und folgendes probiert:

    Datei angelegt:
    app/EventListener/DataContainer/ProductYoutubeSaveCallbackListener.php

    PHP-Code:
    <?php

    namespace App\EventListener\DataContainer;

    use 
    Contao\CoreBundle\ServiceAnnotation\Callback;
    use 
    Contao\DataContainer;

    class 
    ProductYoutubeSaveCallbackListener{
        
    /**
         * @Callback(table="tl_iso_product", target="fields.youtube.save")
         */    
       
    public function onSaveCallback(DataContainer $dc): void    {
            
    // Do something …
            
    return "foo"
       }
    }
    passiert nix
    Geändert von andre.saage (27.12.2020 um 16:39 Uhr)

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

    Standard

    Zitat Zitat von andre.saage Beitrag anzeigen
    Grundsätzlich krieg ich 'ne dca Anpassung auch der Stelle geregelt: app/Resources/contao/dca/tl_iso_product.php aber ohne save_callback...
    DCA Anpassungen machst du im Ordner contao/dca/



    Zitat Zitat von andre.saage Beitrag anzeigen
    Datei angelegt:
    app/EventListener/DataContainer/ProductYoutubeSaveCallbackListener.php
    Das ist nicht der richtige Pfad. Siehe das Beispiel: https://docs.contao.org/dev/framewor...ice-annotation

  7. #7
    Contao-Fan
    Registriert seit
    20.10.2012.
    Ort
    Berlin
    Beiträge
    257

    Standard

    DCA Anpassungen machst du im Ordner contao/dca/
    Ja das geht...
    Ich dachte app/Resoures/contao/dca - das geht nämlich auch. (komisch)

    nun nochmal zum callback.
    Den hab ich nun so gebaut:

    src/EventListener/DataContainer/ProductFieldListener.php
    PHP-Code:

    <?php
    namespace App\EventListener\DataContainer;
    use 
    Contao\CoreBundle\ServiceAnnotation\Callback;
    use 
    Contao\DataContainer;
    class 
    ProductFieldListener{
        
    /**
         * Extract the YouTube ID from an URL
         *
         * @Callback(table="tl_iso_product", target="fields.youtube.save")
         *
         * @param mixed         $varValue
         * @param DataContainer $dc
         *
         * @return mixed 
        */
        
    public function extractYouTubeId($varValueDataContainer $dc)
        {
            if (
    $dc->activeRecord->youtube != $varValue)
            {
                
    $matches = array();
                if (
    preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i'$varValue$matches))
                {
                    
    $varValue $matches[1];
                }
            }
            return 
    $varValue;
        }
    }
    keine Fehler... aber auch keine Funktion.
    Wenn ich am Ende ein return "foo"; mache funktioniert das zwar aber ich will ja die YouTube ID aus der url.
    Daher dachte ich, es wär sinnvoller code aus tl_content.php wiederzuverwenden anstatt zu duplizieren.

    (Der Editor hier ist irgendwie eine Zumutung...)
    Geändert von andre.saage (27.12.2020 um 19:01 Uhr)

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

    Standard

    Zitat Zitat von andre.saage Beitrag anzeigen
    Ja das geht...
    Ich dachte app/Resoures/contao/dca - das geht nämlich auch. (komisch)
    Ja, das geht noch aus Rückwärtskompatibilitätsgründen.


    Zitat Zitat von andre.saage Beitrag anzeigen
    nun nochmal zum callback.
    Den hab ich nun so gebaut:

    src/EventListener/DataContainer/ProductFieldListener.php
    PHP-Code:

    <?php
    namespace App\EventListener\DataContainer;
    use 
    Contao\CoreBundle\ServiceAnnotation\Callback;
    use 
    Contao\DataContainer;
    class 
    ProductFieldListener{
        
    /**
         * Extract the YouTube ID from an URL
         *
         * @Callback(table="tl_iso_product", target="fields.youtube.save")
         *
         * @param mixed         $varValue
         * @param DataContainer $dc
         *
         * @return mixed 
        */
        
    public function extractYouTubeId($varValueDataContainer $dc)
        {
            if (
    $dc->activeRecord->youtube != $varValue)
            {
                
    $matches = array();
                if (
    preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i'$varValue$matches))
                {
                    
    $varValue $matches[1];
                }
            }
            return 
    $varValue;
        }
    }
    keine Fehler... aber auch keine Funktion.
    Wenn ich am Ende ein return "foo"; mache funktioniert das zwar aber ich will ja die YouTube ID aus der url.
    Daher dachte ich, es wär sinnvoller code aus tl_content.php wiederzuverwenden anstatt zu duplizieren.

    (Der Editor hier ist irgendwie eine Zumutung...)
    Prüfe mal, ob in $dc->activeRecord->youtube überhaupt etwas drin steht.

  9. #9
    Contao-Fan
    Registriert seit
    20.10.2012.
    Ort
    Berlin
    Beiträge
    257

    Standard

    Prüfe mal, ob in $dc->activeRecord->youtube überhaupt etwas drin steht.
    Dort wo schon was eingetragen wurde steht das auch drinn.
    Bei neuen Datensätzen ist es leer.
    Wenn ich das Feld editiere und speichere spring ich auch in den äußeren if-Block.

  10. #10
    Contao-Fan
    Registriert seit
    20.10.2012.
    Ort
    Berlin
    Beiträge
    257

    Standard starting to get angry...

    src/EventListener/DataContainer/ProductFieldListener.php
    PHP-Code:
    <?php
    namespace App\EventListener\DataContainer;
    use 
    Contao\CoreBundle\ServiceAnnotation\Callback;
    use 
    Contao\DataContainer;
    class 
    ProductFieldListener {
    /**
       * Extract the YouTube ID from an URL
       *
       * @Callback(table="tl_iso_product", target="fields.youtube.save")
       *
       * @param mixed              $varValue
       * @param DataContainer  $dc
       *
       * @return mixed 
       */
      
    public function extractYouTubeId($varValueDataContainer $dc) {
        if (
    $dc->activeRecord->youtube != $varValue) {
          
    // okay up to here
          
    $matches = array();
          if (
    preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i'$varValue$matches)) {
            
    // want to be here
            
    $varValue $matches[1];
          }
        }
        return 
    $varValue;
      }
    }
    it simply does not want to match anything allthough it should...

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
  •