Ankündigung

Einklappen
Keine Ankündigung bisher.

API: Keine Auswahl bei Hook-Callback-Funktion?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • API: Keine Auswahl bei Hook-Callback-Funktion?

    Hossa,

    ich bin gerade dabei herauszufinden, was man mit der API bei einem Import so alles anstellen kann.
    Frage: Wenn ich als Aktion "Hook-Callback-Funktion ausführen" wähle, erscheint rechts daneben ein Feld, mit dem man natürlich die gewünschte Funktion auswählen kann. Nur ist diese leer... wie und wo muss man diese Funktionen denn registrieren, damit die API auch Wind davon bekommt?

  • #2
    $GLOBALS['PCT_CUSTOMCATALOG_API']['HOOKS']['myCallback_1'] = array('MyApiCallbacks','myFunction_1');
    http://www.premium-contao-themes.com

    Kommentar


    • #3
      Ahhhh... cool...
      Hätte ich das irgendwo nachlesen können? In der API Doku hab ich das so nicht gefunden.

      Kommentar


      • #4
        Zitat von D23 Beitrag anzeigen
        Ahhhh... cool...
        Hätte ich das irgendwo nachlesen können? In der API Doku hab ich das so nicht gefunden.
        Nein nein. Alles richtig zu fragen. . Das ist zur Zeit nur im Code herausfindbar sonst. Das kommt noch in die Doku (dieses Gitbook Zeug ist nur nervig ) - ich schreibs aber noch als Beschreibungstext zum Feld ins Backend.
        http://www.premium-contao-themes.com

        Kommentar


        • #5
          Da bin ja froh

          So ganz funktioniert's aber noch nicht – ich nehme an, dass mein Aufbau auch falsch ist, nachdem ich mich da an der Doku orientiert habe. Ich dachte, das wäre dann der gleiche Aufbau wie bei dataOutput...


          Wo ist der Fehler?

          PHP-Code:
          public function myDataOutputCallback($arrSet$objApi)
          {
              if(
          $objApi->getTable() == 'cc_za_members')
              {
                  foreach(
          $arrSet as $i => $data)
                  {
                      
          $dataFirstname $data['firstname'];
                      
          $dataLastname $data['lastname'];
                      
          $dataTitle preg_replace ('/[^a-z0-9 ]/i'''$data['title']);

                      if(
          $dataTitle != '')
                      {
                        
          $data['alias'] = strtolower($dataTitle.'-'.$dataFirstname.'-'.$dataLastname);
                      }
                      else
                      {
                        
          $data['alias'] = strtolower($dataFirstname.'-'.$dataLastname);
                      }

                      
          // set data
                      
          $arrSet[$i] = $data;
                  }
              }

              return 
          $arrSet;

          Kommentar


          • #6
            Nein, dataOutput gibt dir den Array NACH der gesamten Job-Bearbeitung.
            Hier bekommst du sogar den jeweiligen Datensatz rein, der gerade abgearbeitet wird.

            PHP-Code:
            /**
                 * @param mixed     Wert aus Quelle
                 * @param array        Aktueller zu bearbeitender Datensatz
                 * @param object    Der API Job
                 */
                
            public function myFunction_1($varBefore,$arrData,$objJob)
                {
                    
            // tabelle
                    
            $strTable $objJob->getTable();
                    
                    
            $varReturn $varBefore;
                    
                    
            // überschreibe mich :)
                    
            $varReturn 'Ich bin Funktion 1';
                    
                    return 
            $varReturn;
                } 
            Der Rückgabewert ist der Wert, der später in deinem dataOutput im jeweiligen Zielfeld landet
            http://www.premium-contao-themes.com

            Kommentar


            • #7
              Öhm, nö...versteh's noch immer nicht.

              Das hier kommt doch in die system/config/dcaconfig.php? $GLOBALS['PCT_CUSTOMCATALOG_API']['HOOKS']['myCallback_1'] = array('MyApiCallbacks','myFunction_1');

              Und dein PHP Code von eben kommt z.B. in system/modules/zz_assets/classes/ImportTest.php oder seh ich das falsch?

              Kommentar


              • #8
                Sowas sollte in der config.php einer eigenen Erweiterung deklariert werden, die nach CC läd (autoload.ini).

                Dann benötigst du eine php Klasse "MyApiCallbacks" mit der public function myFunction_1.

                Entspricht dem Standard: https://docs.contao.org/books/manual...tao-hooks.html
                Nur mit festem Array-Key "myCallback_1"
                --

                Ich habs mal bei Github eingestellt:
                https://github.com/timgatzky/pct_cus...iCallbacks.php
                Zuletzt geändert von Tim; 09.03.2017, 11:34.
                http://www.premium-contao-themes.com

                Kommentar


                • #9
                  Oh Mann... die class hatte gefehlt. Jetzt läuft das. Mal wieder super Hilfe von Dir! Danke vielmals!

                  Und schon gleich die nächste Noob-Frage:
                  Kann es sein, dass z.B. $arrData[''feld]; als Wert keinen String zurückgibt?

                  Wenn ich bspw. das hier in der Funktion stehen habe
                  PHP-Code:
                  $strStreet  $arrData['street'];
                  $varReturn $strStreet
                  wird am Ende des Jobs nichts in das entsprechende Feld eingetragen.

                  Wenn ich aber stattdessen das reinschreibe:
                  PHP-Code:
                  $strStreet  $arrData['street'];
                  $varReturn  = (string) $strStreet
                  funktioniert das ganze.

                  Kommentar


                  • #10
                    Wenn du mit (string) konvertierst, wird auch ein Array zu einem String. return "Array", auch ein numerischer Wert wird zu einem String. Das ist nicht aussagekräftig.

                    Meistens kommen da Strings rein. Man sollte immer mit einem Blick in SQL arbeiten. Blobs sind serialisierte Array-Strings.

                    Das prüft man vorab:

                    if(is_string($arrData['street']) && is_numeric($arrData['street'])
                    {
                    // oh das ist wohl eine Zahl
                    }

                    if(is_array(deserialize($arrData['street']))
                    {
                    // ich bin ein array
                    }

                    Ein php debugger zeigt dir das an.

                    Der Rückgabewert selbst muss nicht zwingend ein String sein, sondern eher passend zum Feldtyp. Ist "street" ein Textfeld, liegt es nah
                    Ein Tags-Attribut-Feld erwartet zum Beispiel einen Array. Die API kümmert sich um das SQL Statement.
                    Zuletzt geändert von Tim; 09.03.2017, 14:27.
                    http://www.premium-contao-themes.com

                    Kommentar


                    • #11
                      Nachvollziehbar.

                      Aber wie bekomme ich denn dann die Werte in die Felder?

                      Kommentar


                      • #12
                        Zitat von D23 Beitrag anzeigen
                        Nachvollziehbar.

                        Aber wie bekomme ich denn dann die Werte in die Felder?
                        Verstehe die Frage nicht. Die Dokumentation beschreibt dir den Weg eines Imports oder Exports. Wie der Wert für das Zielfeld je API Job ermittelt wird, kannst du ja selbst festlegen. Idealerweise Wert 1zu1 übertragen.

                        Mein Hook Beispiel überschreibt den Import-Wert oder Export-Wert mit "Ich bin Funktion 1"

                        https://premiumcontaothemes.gitbooks...ort/intro.html
                        Zuletzt geändert von Tim; 09.03.2017, 14:31.
                        http://www.premium-contao-themes.com

                        Kommentar


                        • #13
                          Jetzt mit Deiner Ergänzung verstehe ich auch was Du gemeint hast. Dankeschön!
                          Kannst meine letzte Frage zu den Akten legen

                          Ich arbeite in meinem konkreten Fall nur mit Textfeldern, von daher passt das schon. Aber ich glaube insgesamt habe ich jetzt kapiert, was da läuft.

                          Kommentar


                          • #14
                            Andere Frage:

                            Wenn ich einen Import via CSV mache, funktioniert das alles soweit.
                            Wenn ich nach dem Import in der CSV was ändere und den Import nochmal laufen lasse, ändert sich aber nichts.
                            In der API-Anbindung ist jeweils ein Haken gesetzt bei "Einträge updaten" und "Neue Einträge anlegen". Arbeitet das anders, als man vielleicht auf den ersten Blick vermutet?

                            Edit:
                            Hat sich erübrigt. Funktioniert schon so, wie ich es verstanden habe. Fehler lag woanders.
                            Zuletzt geändert von D23; 09.03.2017, 15:05.

                            Kommentar

                            Lädt...
                            X