Ankündigung

Einklappen
Keine Ankündigung bisher.

API Import Multilingual

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

  • API Import Multilingual

    Moinsen!

    Ich finde für den Import kein Datenbankfeld oder etwas, was mir die Sprache referenziert ?!
    Im Backend läuft das, dass ich grundlegen Deutsch habe und dann hinten über das language Icon meinen Englischen Datensatz eintragen kann.
    Wenn ich das mache, finde ich aber in der Datenbank kein Kürzel / ID oder sonstiges, was mir den language-verweis gibt.

    Wie kann ich das im Import lösen?
    Welche Infos brauchst du noch, um antworten zu können?

    // EDIT

    Ich muss die Frage sogar erweitern, ich sehe gerade, dass nach dem Import das Listensymbol keinerlei Produkte anzeigt. Wenn ich den Artikel im Backend einmal öffne und dann speichere, dann zeigt er diesen an. Ich vermute, weil er beim Speichern irgendwo das Language-Flag setzt. Wie bekomme ich das denn schon direkt beim Import hin, ohne alle Artikel einmal neu speichern zu müssen ?

    Danke & LG
    Zuletzt geändert von 2pmagentur; 04.05.2020, 16:14.

  • #2
    Die Referenz ist tl_pct_customcatalog_language.

    Ein neuer Basis-Eintrag setzt dort eine Referenz mit
    Code:
    ID, PID = ID-DES-NEUEN-EINTRAGS, tstamp = NOW, source = CC-TABELLE, lang = ""
    Ein Sprach-Geschwisterchen zu diesem Basis-Eintrags setzt eine Referenz mit:
    Code:
    ID = ID-DES-NEUEN-EINTRAGS, PID = ID-DES-BASIS-EINTRAGS, tstamp = NOW, source = CC-TABELLE, lang = SPRACH-KÜRZEL
    Ohne diese Referenzen existieren keine darzustellenden Eintrage.

    tl_pct_customcatalog_language
    Klicke auf die Grafik für eine vergrößerte Ansicht

Name: screenshot_5638.jpg
Ansichten: 112
Größe: 17,8 KB
ID: 18578


    Zuletzt geändert von Tim; 05.05.2020, 06:42.
    http://www.premium-contao-themes.com

    Kommentar


    • #3
      Danke, das hilft schonmal weiter !
      Aber den DB Eintrag muss ich im PHP Skript selber auslösen oder kann ich diese Funktion irgendwo auslösen nach Import ?!
      Zum Zeitpunkt des verarbeitenden PHP Skripts entsteht ja noch kein DB Import … ergo weiß ich doch zu dem Zeitpunkt meine eigene ID noch nicht. Bekomme ich das über eine "Aufgabe" in der API ausgelöst ?

      Ich glaube man kann viel mehr mit der API machen, als mir gerade bewusst ist
      Zuletzt geändert von 2pmagentur; 05.05.2020, 10:48.

      Kommentar


      • #4
        Ja, die API ist ein mächtiges Tool.

        Ich würde hier den [apiComplete] Hook nutzen und für alle frisch importierten Einträge im Nachgang die language-referenz setzen.
        Hier kann das System leider nicht viel helfen, weil nur "der Mensch" bzw. Du weisst welcher Eintrag zu welcher Sprache etc. gehört.

        Daher ja, hier musst du im Nachgang selbst ran.

        Der hook ist in der Doku beschrieben: https://github.com/premiumcontaothem...atalog-api.pdf

        Mit Hilfe der ->getReport() Methode bekommst du hier alle Daten gelistet, die die API durchgeführt hat. Sowohl die INSERT, UPDATE oder DELETE Einträge (bei einem Import).

        Code:
        var_dumpt( $objAPI->getReport() ); // array
        Der Rest ist Handarbeit
        Zuletzt geändert von Tim; 05.05.2020, 11:25.
        http://www.premium-contao-themes.com

        Kommentar


        • #5
          Danke für die PDF … Ich habe mir das alles mal durchgelesen und habe den Ablauf auch von der Logik verstanden.
          Ich komme aber bei der Umsetzung etwas ins stolpern.

          Ich soll etwas in die config.php reinschreiben. Bei eigenen Modulen weiß ich, wo es die config gibt. In diesem falle hab ich den Ordner meines Catalogs geschaut aber da gibt es nur einen dca Ordner. Auch ein Anlegen nach der Folderstruktur aus der PDF modules/xxx/config/config.php hat nichts gebracht. Wo müssen die config.php und die myclass.php liegen?
          Es geht um eine C4.9.1 Instanz …

          Und wo starte ich dann den Aufruf? Über eine Aufgabe in der API ? Aufgabentyp: Feld-Aktion » Ziel » tstamp
          Aktion: Hook-Callback-Funktion ausführen » apiComplete ?


          Sorry, dass ich so nerve

          Mir fehlt gerade nur noch der Anstoß ...
          Zuletzt geändert von 2pmagentur; 05.05.2020, 15:13.

          Kommentar


          • #6
            Der apiComplete hook wird nach Fertigstellung der API Funktion global getriggert. Die allgemeine Arbeit mit der Contao Hook-Logik ist in der Contao Dokumentation abgebildet.
            http://www.premium-contao-themes.com

            Kommentar


            • #7
              Ja, das habe ich ja verstanden … aber eben nur wenn man die config.php und die myclass.php irgendwo hat. Habe gestern die ganze Hook Doku gelesen und da scheint es von C3 über C4, C4.5, C4.8 und C4.9 (habe 4.9.1) deutliche unterschiede zu geben. siehe » https://docs.contao.org/dev/framework/hooks/
              I
              D
              ie angegebenen Pfade gibt es aber alle nicht
              // contao/config.php
              // src/EventListener/ActivateAccountListener.php
              von einer MyClass.php bzw. einer eigenen Klassen PHP keine Spur


              Kommentar


              • #8
                Es muss nicht zwingend ein Bundle sein. Du kannst Erweiterungen nach dem gewohnten Contao-Muster erstellen und in system/modules feuern.

                /system/modules/my_module
                - config
                - dca
                - templates
                - languages
                - classes
                - ...
                http://www.premium-contao-themes.com

                Kommentar


                • #9
                  zumindest versucht er schonmal etwas zu laden
                  Attempted to load class "MyClass" from the global namespace. Did you forget a "use" statement?

                  /system/modules/pct_customcatalog_hf_produkte/config/config.php
                  Code:
                  <?php $GLOBALS['CUSTOMCATALOG_HOOKS']['apiComplete'][] = array('MyClass', 'myApiCompleteCallback'); ?>
                  /system/modules/pct_customcatalog_hf_produkte/config/autoload.php
                  Code:
                  <?php
                  
                  ClassLoader::addClasses(array
                  (
                      // Classes
                      'MyClass' => 'system/modules/pct_customcatalog_hf_produkte/MyClass.php',
                  ));
                  
                  ?>

                  /system/modules/pct_customcatalog_hf_produkte/MyClass.php
                  Code:
                  <?php
                  
                  // MyClass.php
                  public function myApiCompleteCallback($objApi)
                  {
                  if($objApi->getTable() == 'cc_hf_produkte')
                  {
                  // api completed. do something
                  print_r("Hook wird ausgeführt");
                  }
                  }
                  
                  ?>


                  Eine kleine Vorlage war dieser Post » https://community.contao.org/de/show...-use-statement
                  Zuletzt geändert von 2pmagentur; 06.05.2020, 09:21.

                  Kommentar


                  • #10
                    Symphony-Cache leeren, damit neue Klassen im Loading-Prozess berücksichtigt werden.
                    http://www.premium-contao-themes.com

                    Kommentar


                    • #11
                      Habe ich mehrfach gemacht - klappt nicht

                      Kommentar


                      • #12
                        Naja, bissel PHP Grundwissen auffrischen
                        Du musst überhaupt erstmal die PHP Klasse richtig initialisieren in der Datei. Deine MyClass.php ist nur eine lose Funktion ohne Klassen-Klammerung.


                        https://www.php.net/manual/de/language.oop5.php

                        Code:
                        class MyClass
                        {
                        public function...
                        }
                        http://www.premium-contao-themes.com

                        Kommentar


                        • #13
                          Hallo zusammen,

                          bin gerade auf dieses Thema gestoßen und sitze derzeit an einer relativ ähnlichen Aufgabe.

                          Konkret geht es um die Automatisierung (via Cron Job) des CSV Imports für mehrere Sprachen. Ich kann zwar den apicomplete Hook benutzen um mehr oder weniger einen gesamten Datensatz nach dem Durchlauf auch zur tl_pct_customcatalog_language hinzuzufügen aber eigentlich fehlt mir an dieser Stelle zur Automatisierung die Information der Sprache aus der CSV. Gibt es eine elegante Lösung einen Import für mehrere Sprachen zu realisieren ? bspw. durch hinzufügen eines Language Flags in den API Import ? oder hab ich was essentielles übersehen ?

                          Beispiel

                          Vorhandene Produkt CSVs: de_products , en_products, fr_products

                          Idee
                          Für jede Sprache einen eigenen identischen Import anlegen und eine Art Sprachflag zu haben (um zu wissen, welche lang ich für diesen Länderimport in der Sprachentabelle eintragen muss)


                          Besten Dank für ein Feedback!

                          Kommentar


                          • #14
                            Hi,
                            der apicomplete Hook ist gut geeignet. Wenn dieser triggert sind alle Einträge importiert. Die Einträge sind vorerst lose, weil die Sprach-Referenzen fehlen.
                            Dann läufst du über alle Einträge und erstellst Datensatz für Datensatz einen Basis-Eintrag (z.B. DE) und seine Sprach-Referenz oin tl_pct_customcatalog_language.

                            Wenn der Import bereits Querverweise zwischen den Sprach-Einträgen aufweist, kannst du diese direkt nutzen um die Referenzen korrekt abzubilden. Du benötigst in jedem Fall irgendeine Logik zwischen Basis-Eintrag (z.B. DE) zu seinen Sprach-Geschwistern.
                            http://www.premium-contao-themes.com

                            Kommentar


                            • #15
                              Moin Tim,

                              danke für die Ausführung. Hier nochmal eine Rückfrage zum CSV Import:

                              ich bleibe mal bei meinem konkreten Beispiel mit dem Produktimport.

                              Beim Import einer CSV kann ich ein Schlüsselfeld angeben - bspw Artikelnummer. Wenn ich nun mehrere Importe habe um CSV Dateien zu importieren. Jede CSV repräsentiert dabei eine Sprachreferenz des Produktes. Die CSVs sind exporte aus einem Datenpool.

                              Vorhandene Produkt CSVs: de_products , en_products, fr_products

                              Dann ist die Artikelnummer bei allen Übersetzungen gleich nur die sprachlichen Elemente sind unterschiedlich. Bedeutet also konkret, jeder neu ausgeführte import überschreibt die anderen.

                              Wenn ich das Schlüsselfeld weglasse, dann wird für jede Sprache ein eigener Eintrag angelegt und die Artikelnummer ist nicht mehr unique. An dieser Stelle könnte ich also mit dem apiCompleteHook wunderbar über die Elemente laufen und die Sprachreferenz zum Basis Element aufbauen.

                              Das Problem: Bei einem erneuten Import (bspw. via cron) kann ich ohne unique Feld aber keine Einträge mehr aktualisieren. Ich kann nur blind neue Einträge erzeugen - Tabelle truncaten kann ich an der Stelle auch nicht, weil mit dem aktuellen Import nur ein Teil des ganzen importiert wird.

                              Mir fehlt an dieser Stelle also beim Import eigentlich eine Referenz auf das richtige Element (bspw aslo die artikelnummer) in der richtigen Sprache.


                              ich könnte natürlich für jede Sprache eine eigene Tabelle erzeugen und dann dementsprechend in der Spracheinstellung die richtige Tabelle auswählen, dass fühlt sich aber im Hinblick auf die language tabelle irgendwie nicht so richtig an.

                              Kommentar

                              Lädt...
                              X