Catalog-Einträge via EFG erstellen und im Backend und ggfs. Frontend verwalten

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • wsa
    Contao-Nutzer
    • 27.10.2009
    • 131

    #1

    Catalog-Einträge via EFG erstellen und im Backend und ggfs. Frontend verwalten

    Hallo zusammen,
    ich hab mir über Google und hier im Forum schon einen Wolf gesucht, aber leider noch keinen passenden Lösungsansatz gefunden. :-(

    Meine Aufgabenstellung: Ich möchte Neueinträge im Katalog über das Frontend (EFG-Formular) erstellen, die dann im Backend von einer "Redaktion" geprüft, freigeschaltet, verwaltet werden und ggfs. von den Frontend-Mitgliedern, die die Einträge gemacht haben, via CatalogEdit überarbeitet werden können.

    Ich habe hierzu einen Katalog angelegt, in dem es unter anderem ein "Tags"-Feld gibt, das die Auswahl mehrerer Optionen erlaubt. Wähle ich die zugehörigen Checkboxen (z.B. 1, 3 und 6) im Backend aus, werden die Daten im Format
    Code:
    1,3,6
    abgespeichert. Soweit alles bestens. Einträge aus dem Frontend via EFG werden auch sauber gemacht (pid, tstamp usw. werden suaber via hidden-Fields gesetzt).

    ABER: Im EFG verwende ich für o.g. "Catalog-Tags" das "Checkbox-Menü". Das Problem: Die Optionen werden von EFG als "serialized Array" abgespeichert.
    Code:
    a:3:{i:0;s:1:"1";i:1;s:1:"3";i:2;s:1:"6";}
    Das bedeutet: Aus Backend-Sicht sind in der Catalog-Datenbank im entsprechenden Feld angeblich KEINE Optionen ausgewählt. Die entsprechenden Checkboxen sind im Backend leer. Noch viel schlimmer: Nach dem Abspeichern ist auch das "serialized Array" (BLOB) verschwunden.

    Nun meine Frage: Wie bringe ich EFG dazu, die Checkbox-Optionen ganz simpel so in der DB abzuspeichern, wie es der Catalog tut?
    Ein ähnliches Problem ist übrigens das vielfach hier beschriebene, nämlich dass die Datumsformate von EFG und Katalog voneinander abweichen. EFG: formatiertes Datum, Catalog: UNIX-Timestamp
    Auch hiefür habe ich noch keine elegante Lösung gefunden.


    BITTEBITTEBITTE helft! Ich kann doch nicht der einzige sein, der EFG und Catalog zusammenspielen lassen will, oder!?

    Liebe Grüße und danke für jeden guten Tipp
    wsa
    Zuletzt geändert von wsa; 07.12.2012, 17:47.
  • MacKP
    Contao-Yoda
    • 15.06.2009
    • 13315

    #2
    Hallo wsa,
    meine Lösung ist jetzt eventuell etwas weit hergeholt... aber ich glaub da würde ich das FrontendEditing vom Catalog benutzen ;-)

    Viele Grüße
    Contao Pool | C-C-A | MetaModels | [Internetseite -> Mediendepot Ruhr]
    [Arbeitet bei -> Paus Design & Medien]
    "I can EXPLAIN it to you, but I can't UNDERSTAND it for you."

    Kommentar

    • wsa
      Contao-Nutzer
      • 27.10.2009
      • 131

      #3
      Halle MacKP,atalog

      stehe ich total auf dem Schlauch und merks nur nicht?
      Taugt denn der CatalogEdit auch zum ERFASSEN von CatalogItems? Falls ja, muss ich mich da wohl gewaltig verlesen haben. *Augenroll*
      Ich ging bisher davon aus, dass man damit nur bestehende Items EDITIEREN kann. Bin ich da auf dem Holzweg?

      LG wsa

      Kommentar

      • Flex
        Contao-Urgestein
        • 03.06.2010
        • 2149

        #4
        Nein, damit kann man auch neue Einträge erstellen...

        Siehe im Contao Wiki:
        Catalog mit Frontend-Editing und Workflow
        Zuletzt geändert von Flex; 08.12.2012, 00:04.

        Kommentar

        • wsa
          Contao-Nutzer
          • 27.10.2009
          • 131

          #5
          catalogitemuseridfield für catalog 2.0.0 beta2?

          Hallo zusammen,
          komme langsam voran, stolpere aber gerade über die Nicht-Verfügbarkeit von "catalogitemuseridfield" Habe bei Contao 2.11.6 die catalog-version 2.0.0 beta2 und bekomme 'catalogitemuseridfield' im Erweiterungskatalog nicht angezeigt.
          Und im Catalog steht der entsprechende Feldtyp (Frontend-Benutzer) nicht zur Auswahl.
          Mache ich was falsch?
          LG wsa

          Kommentar

          • MacKP
            Contao-Yoda
            • 15.06.2009
            • 13315

            #6
            Hallo wsa,
            eventuell musst du dafür in den Einstellungen von Contao ankreuzen, das dir auch inkompatible Erweiterungen angezeigt werden.
            Oder du nimmst das direkt aus dem SVN (wie den kompletten Catalog auch...).
            Mehr Infos zu SVN = Im Wiki oder hier im Forum. Also bitte die Suche benutzen.


            Viele Grüße
            Contao Pool | C-C-A | MetaModels | [Internetseite -> Mediendepot Ruhr]
            [Arbeitet bei -> Paus Design & Medien]
            "I can EXPLAIN it to you, but I can't UNDERSTAND it for you."

            Kommentar

            • wsa
              Contao-Nutzer
              • 27.10.2009
              • 131

              #7
              Merci !

              ... da war er wieder der Schlauch ... und wieder nicht bemerkt, dass ich draufsteh. :-(
              Merci !

              Kommentar

              • wsa
                Contao-Nutzer
                • 27.10.2009
                • 131

                #8
                storeFormData hook - Dokumentation? Beispiele?

                Hallo zusammen,

                habe mir die CatalogEdit-Funktion inzwischen genauer angesehen und bin für meine Zwecke nicht glücklich darüber. Dieses Modul erreicht nicht annähernd den Funktionsumfang von EFG, weshalb ich nun meinen ursprünglichen Ansatz (Erfassen von Catalogdaten via EFG) weiterverfolge. Im Moment beabsichtige ich, die im Formular via Checkbox eingegebenen Daten, die serialisiert in einem Array abgelegt werden,
                Code:
                a:3:{i:0;s:1:"1";i:1;s:1:"3";i:2;s:1:"6";}
                vor dem Speichern in die Datenbanktabelle zu unserialisieren.
                Code:
                1,3,6
                Hierzu bin ich hier im Forum auf den storeFormData Hook gestoßen. Leider finde ich nirgendwo eine Dokumentation oder ein Beispiel für die genaue Verwendung dieses Hooks. Mein derzeitiger Versuch endet in einem
                Parse error: syntax error, unexpected T_PUBLIC in /www/htdocs/.../TYPOlight/system/modules/EfgCallbacks/EfgCallbacks.php on line 4
                Meine /system/modules/EfgCallbacks/EfgCallbacks.php
                PHP-Code:
                <?php
                // unserialze Arrays repertoire and medien (from EFG-Format to Catalog-Format)
                
                        public function storeFormData_mdb($arrData,$arrForm)
                        {
                
                                        echo '<p>Catalogdaten werden bearbeitet</p>';
                                        echo '<p>'.$arrForm['repertoire'].'<br /><br />';
                                        $arrForm['repertoire'] = unserialze($arrForm['repertoire']);
                                        echo $arrForm['medien'].'/p>';
                                        $arrForm['medien'] = unserialze($arrForm['medien']);
                
                                return $arrForm;
                
                        }
                
                ?>
                Meine /system/modules/EfgCallbacks/config/config.php
                PHP-Code:
                <?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
                
                $GLOBALS['TL_HOOKS']['storeFormData']['callback_01'] = array('EfgCallbacks', 'storeFormData_mdb');
                
                ?>
                Kann mir jemand auf die Sprünge helfen? (Ich fürchte, ich stehe wieder mit der Nase direkt vor dem Fehler!?)

                Vielen Dank im Voraus, für jede brauchbare Unterstützung.
                GLG wsa
                Zuletzt geändert von wsa; 24.01.2013, 16:23.

                Kommentar

                • Tim G
                  Contao-Urgestein
                  • 13.02.2010
                  • 2212

                  #9
                  Der storeFormData Hook wird nicht vom EFG getriggert, sondern von Contao selbst, für Formulare, die in die Datenbank schreiben.

                  Zeile 439 in der Form.php

                  Übergeben wird ein Array aus Feld => Wert und das Formular-objekt selbst. Rückgabe ist das Array.

                  Deine Funktion würde damit so aussehen (wenn die Felder gleiche Namen haben):
                  PHP-Code:
                  public function storeFormData_mdb($arrSet,$objForm)
                  {
                      $arrSet['repertoire'] = deserialize($arrSet['repertoire']); 
                      return $arrSet;
                  } 
                  

                  Die Globale vom Hook wäre dann auch als push besser, damit man nicht eventuelle gleiche Keys überschreibt, ich weiss in der Doku vom EFG selbst steht es mit festen Keys :
                  $GLOBALS['TL_HOOKS']['storeFormData'][] = array('EfgCallbacks', 'storeFormData_mdb');
                  Zuletzt geändert von Tim G; 07.01.2013, 16:26.
                  http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

                  Kommentar

                  • wsa
                    Contao-Nutzer
                    • 27.10.2009
                    • 131

                    #10
                    Servus Tim G,

                    vielen Dank für deinen Input. Habe deinen Code übernommen und erhalte nach wie vor denselben
                    Parse error: syntax error, unexpected T_PUBLIC in /www/htdocs/.../TYPOlight/system/modules/EfgCallbacks/EfgCallbacks.php on line 4
                    Allerdings muss ich gestehen, dass ich nicht sicher bin, ob ich dich richtig verstanden habe.
                    Frage 1: Muss ich den Hook-Code direkt in die Form.php einbauen? Und - falls ja - wie updatesicher ist das Ganze dann?
                    Frage 2: wohin muss dann der Code?
                    PHP-Code:
                    $GLOBALS['TL_HOOKS']['storeFormData'][] = array('EfgCallbacks', 'storeFormData_mdb'); 
                    
                    In die localconfig.php? Oder in die dcaconfig.php?
                    Frage 3: Kannst du bitte enäher erläutern, was
                    Die Globale vom Hook wäre dann auch als push besser, damit man nicht eventuelle gleiche Keys überschreibt, ich weiss in der Doku vom EFG selbst steht es mit festen Keys
                    bedeutet? Da verstehe ich nämlich nur Bahnhof.
                    Vielen Dank im Voraus!
                    GLG wsa
                    Zuletzt geändert von wsa; 24.01.2013, 16:22.

                    Kommentar

                    • Tim G
                      Contao-Urgestein
                      • 13.02.2010
                      • 2212

                      #11
                      Catalog-Einträge via EFG erstellen und im Backend und ggfs. Frontend verwalten

                      Wie man mit Hooks arbeitet steht im Handbuch:
                      Herzlich willkommen Du bist hier, weil sich die folgenden Menschen (in alphabetischer Reihenfolge) und die Contao Community Tage und Nächte um die Ohren schlagen, um die Contao-Entwicklung voranzutreiben: Andreas (@aschempp) David (@bytehead) Fritz Michael (@fritzmg) Leo (@leofeyer), Initiator Martin (@ausi) Moritz (@m-vo) Sebastian (@zoglo) Yanick (@toflar) Neben dem Core-Team sorgen viele weitere Freiwillige dafür, dass Contao ein einzigartiges und wunderschönes Erlebnis ist und bleibt. Möchtest du ein Teil davon werden? Dann freuen wir uns auf dich.
                      http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

                      Kommentar

                      • tom
                        Contao-Fan
                        • 16.06.2009
                        • 385

                        #12
                        Zitat von wsa Beitrag anzeigen
                        Servus Tim G,

                        vielen Dank für deinen Input. Habe deinen Code übernommen und erhalte nach wie vor denselben

                        Allerdings muss ich gestehen, dass ich nicht sicher bin, ob ich dich richtig verstanden habe.
                        Frage 1: Muss ich den Hook-Code direkt in die Form.php einbauen? Und - falls ja - wie updatesicher ist das Ganze dann?
                        Frage 2: wohin muss dann der Code?
                        Code:
                        $GLOBALS['TL_HOOKS']['storeFormData'][] = array('EfgCallbacks', 'storeFormData_mdb');
                        In die localconfig.php? Oder in die dcaconfig.php?
                        Frage 3: Kannst du bitte enäher erläutern, was

                        bedeutet? Da verstehe ich nämlich nur Bahnhof.
                        Vielen Dank im Voraus!
                        GLG wsa
                        Hallo wsa,

                        ziemlich verwirrende Mischung hier ;-/

                        Um die Daten in eine Catalog-Tabelle zu speichern, hilft Dir EFG (bzw. dessen Hook) nicht wirklich weiter.
                        Einfacher ist dies mit der Standard-Option "Eingaben speichern", die Du ganz offensichtlich auch nutzt.
                        Da Dein ganzes Procedere eigentlich mit EFG nichts zu tun hat, würde ich auch die Dateien/Klassen/Methoden nicht mit "EFG" benennen.


                        Zu Frage 1)
                        Deinen "Hook-Code" musst Du in einer Klasse speichern. Der Parse-Error kommt daher, dass in Deiner Datei "/system/modules/EfgCallbacks/EfgCallbacks.php" keine Klasse definiert wird.
                        Weitere Fehler in Deiner Funktion:
                        Du darfst nicht $arrForm verändern und zurückgeben (das wäre das Formular-Objekt), sondern das geänderte Array $arrData

                        Statt:
                        PHP-Code:
                        <?php
                        // unserialze Arrays repertoire and medien (from EFG-Format to Catalog-Format)
                        
                                public function storeFormData_mdb($arrData,$arrForm)
                                {
                        
                                                echo '<p>Catalogdaten werden bearbeitet</p>';
                                                echo '<p>'.$arrForm['repertoire'].'<br /><br />';
                                                $arrForm['repertoire'] = unserialze($arrForm['repertoire']);
                                                echo $arrForm['medien'].'/p>';
                                                $arrForm['medien'] = unserialze($arrForm['medien']);
                        
                                        return $arrForm;
                        
                                }
                        
                        ?>
                        wäre korrekt (Umbenennung noch nicht berücksichtigt):
                        PHP-Code:
                        <?php
                        class EfgCallbacks extends Backend
                        {
                        
                        // unserialze Arrays repertoire and medien (from Form-/POST-Format to Catalog-Format)
                        
                                public function storeFormData_mdb($arrData, $objForm)
                                {
                                                $arrData['repertoire'] = implode(',', deserialze($arrData['repertoire'], true)); // ohne implode hättest Du ein Array statt einer kommaseparierten Liste
                                                $arrData['medien'] = deserialze($arrData['medien']); // auch hier ggf. per implode in kommasep. Liste wandeln
                        
                                        return $arrData;
                        
                                }
                        
                        }
                        ?>
                        Zu Frage 2)
                        Niemals in die Datei localconfig.
                        Entweder in die dcaconfig.php oder in eine config.php im Modulverzeichnis, in Deinem Fall also (vor vernünftiger Umbenennung):
                        system/modules/config/config.php

                        Zu Frage 3)
                        Damit meint Tim:
                        Gesetzt den Fall, eine andere Erweiterung hätte bereits unter demselben Schlüssel einen callback registriert, z.B.
                        PHP-Code:
                        $GLOBALS['TL_HOOKS']['storeFormData']['callback_01'] = array('TimsCallbacksKlasse', 'timsTutIrgendwasMethode'); 
                        
                        würde Deine Zeile
                        PHP-Code:
                        $GLOBALS['TL_HOOKS']['storeFormData']['callback_01'] = array('EfgCallbacks', 'storeFormData_mdb'); 
                        
                        Tim's Eintrag überschreiben oder aber Dein Eintrag würde von Tim's überschrieben (falls Tim's Modulverzeichnis nach Deinem folgt)

                        Daher schlägt Tim vor, per
                        PHP-Code:
                        $GLOBALS['TL_HOOKS']['storeFormData'][] = array('EfgCallbacks', 'storeFormData_mdb'); 
                        
                        einfach zu "pushen". Soll heißen Deinen Eintrag an das bestehende Array als weiteren Eintrag anzuhängen.

                        @Tim: im EFG-Beispiel befindet sich der Eintrag allerdings in der dcaconfig.php, welche u.U. mehrfach geladen wird ...

                        Schöne Grüße
                        Tom

                        Kommentar

                        • wsa
                          Contao-Nutzer
                          • 27.10.2009
                          • 131

                          #13
                          Zitat von Tim G Beitrag anzeigen
                          Wie man mit Hooks arbeitet steht im Handbuch:
                          https://contao.org/de/manual/3.0/cus...l#contao-hooks
                          Hallo Tim G,
                          das Handbuch hatte ich bereits zu Hilfe gezogen. Allerdings ist es so, dass die Beschreibung dort bereits ein breites Allgemeinwissen über die "Tiefen" von Contao voraussetzt. Mir geht es da aber wie sicherlich vielen Contao-Nutzern: Ich bin weder "gelernter" Programmierer noch professioneller Webdesigner und nutze Contao für ausschließlich private Zwecke nach dem Prinzip "learning by doing" und "copy, customize and paste". D.h. ich habe bereits viele Funktionen erfolgreich implementiert, ohne im Detail zu wissen, was ich da genau gemacht habe bzw. warum es nach vielen Versuchen endlich funktioniert. Gleichzeitig fehlt mir in meiner Freizeit die Zeit, mich tiefer einzulesen und somit die "Theorie" besser zu verstehen. Unterm Strich helfen mir - wie auch in diesem Fall - oft nur Antworten wie die von tom wirklich weiter. Trotzdem vielen Dank für deine Antwort. :-)

                          Besten Dank an dieser Stelle an tom für die ausführliche Darstellung und die aufwändige Entwirrung meiner "ziemlich verwirrenden Mischung" ! :-) *Daumen hoch*
                          GLG wsa

                          Kommentar

                          • wsa
                            Contao-Nutzer
                            • 27.10.2009
                            • 131

                            #14
                            Hallo zusammen,
                            habe jetzt folgende Codes aktiv:
                            In /TYPOlight/system/modules/FormData_deserializer/FormData_deserializer.php :
                            PHP-Code:
                            <?php
                            class FormData_deserializer extends Backend
                            {
                            
                            // deserialze Arrays from Form-/POST-Format to Catalog-Format (i.e. 'repertoire' and 'medien' in cat_Musikanten)
                            // for example
                            // input:  a:3:{i:0;s:1:"1";i:1;s:1:"3";i:2;s:1:"6";}
                            // output: 1,3,6
                            
                                    public function storeFormData_mdb($arrData, $objForm)
                                    {
                                                    $arrData['repertoire'] = implode(',', deserialize($arrData['repertoire'], true));
                                                    $arrData['medien'] = implode(',', deserialize($arrData['medien'], true));
                            
                                            return $arrData;
                            
                                    }
                            
                            }
                            ?>
                            Und in /TYPOlight/system/modules/FormData_deserializer/config/config.php :
                            PHP-Code:
                            <?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
                            
                            $GLOBALS['TL_HOOKS']['storeFormData'][] = array('FormData_deserializer', 'storeFormData_mdb');
                            
                            ?>
                            Das Ergebnis: Der Eintrag in die Datenbank erfolgt wie beabsichtigt. *Daumen hoch*
                            Jedoch: Nach dem Abschicken des Formulars erhalte ich eine leere weiße Seite, anstatt der eingestellten Weiterleitungsseite.
                            Versteht das jemand?

                            LG wsa
                            Zuletzt geändert von wsa; 24.01.2013, 16:21.

                            Kommentar

                            • wsa
                              Contao-Nutzer
                              • 27.10.2009
                              • 131

                              #15
                              gelöst

                              Diesmal konnte ich mir mit Hilfe der Suchfunktion selbst weiterhelfen:
                              Die Lösung bzw. Erklärung für die "weiße Seite" anstatt der Weiterleitungsseite:
                              in meiner FormData_deserializer.php hatte sich nach dem schließenden PHP-Tag noch ein Leerzeichen versteckt.
                              Kaum habe ich dieses entfernt, läuft alles bestens! *Hurra*
                              (s. auch https://community.contao.org/de/show...ll=1#post46517)

                              Kommentar

                              Lädt...