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

  • D23
    antwortet
    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, 16:05.

    Einen Kommentar schreiben:


  • D23
    antwortet
    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.

    Einen Kommentar schreiben:


  • Tim
    antwortet
    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, 15:31.

    Einen Kommentar schreiben:


  • D23
    antwortet
    Nachvollziehbar.

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

    Einen Kommentar schreiben:


  • Tim
    antwortet
    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, 15:27.

    Einen Kommentar schreiben:


  • D23
    antwortet
    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.

    Einen Kommentar schreiben:


  • Tim
    antwortet
    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, 12:34.

    Einen Kommentar schreiben:


  • D23
    antwortet
    Ö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?

    Einen Kommentar schreiben:


  • Tim
    antwortet
    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

    Einen Kommentar schreiben:


  • D23
    antwortet
    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;

    Einen Kommentar schreiben:


  • Tim
    antwortet
    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.

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • Tim
    antwortet
    $GLOBALS['PCT_CUSTOMCATALOG_API']['HOOKS']['myCallback_1'] = array('MyApiCallbacks','myFunction_1');

    Einen Kommentar schreiben:


  • D23
    hat ein Thema erstellt API: Keine Auswahl bei Hook-Callback-Funktion?.

    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?
Lädt...
X