Ergebnis 1 bis 10 von 10

Thema: Multiple Checkbox , SQL im FE

  1. #1
    Contao-Nutzer Avatar von aw029
    Registriert seit
    29.07.2009.
    Ort
    Schwäbisch Gmünd
    Beiträge
    44

    Standard Multiple Checkbox , SQL im FE

    Hallo,

    ich habe eine Extension zur Verwaltung von Datensätzen erstellt. Ich greife auf die taxonomy-Extension zu, um meine Datensätze mehreren Kategorien zuzuweisen.
    Aus diesem Thread
    PHP-Code:
    'taxonomy' => array
            (
                
    'label'                   => &$GLOBALS['TL_LANG']['tl_companies']['taxonomy'],
                
    'exclude'                 => true,
                
    'filter'                  => true,
                
    'inputType'               => 'checkbox',
                
    'foreignKey'              => 'tl_taxonomy.name'
                
    'eval'                    => array('mandatory'=>true,'multiple'=>true,'tl_class'=>'long clr')
            ), 
    TL speichert die Checkbox als serialisiertes Array in der DB ab. Wenn ich in meinen FE-Modulen nach einer Kategorie filtern will (im SQL) dann ist das serialisierte Array ein Problem.

    Kann ich die Tabellen-Verbindung anders speichern? Ansonsten muss ich ja immer alle Datensätze auslesen, das Array unserializen und dann die Filterung vornehmen. Das kann bei vielen Datensätze dann lange dauern.

    TYPO3 beispielweise speichert hier dann im Feld 1,5,7. Dann kann man im SQL bequem where IN() machen. Könnt Ihr mir einen Tipp geben, wie ich das angehen sollte?

    Danke & Gruß
    Alexander

  2. #2
    Contao-Fan Avatar von deerwood
    Registriert seit
    24.11.2009.
    Ort
    Hamburg
    Beiträge
    344

    Standard

    Hi Alexander,

    das folgende beruht auf einem Tipp von Leo Feyer in einem anderen Thread, den ich gerade nicht wiederfinde:

    das serialisierte Array ist ja auch lesbarer Text, auf dem man mit SQL IN suchen kann, schau dir das mal in der DB an, wie es in Deinem Fall genau aussieht. Nun könnte es sein, dass Dein IN(<Liste von IDs>) MEHR Datensätze als gewünscht liefert, weil die eine oder andere ID auch noch mit anderer Bedeutung in den serialisierten Werten vorkommt. Du müsstest also sicherheitshalber immer noch deserialisieren ... aber eben nur auf einer bereits per SQL erheblich eingeschränkten Liste von Datensätzen.

    LG, Georg

  3. #3
    Contao-Nutzer Avatar von aw029
    Registriert seit
    29.07.2009.
    Ort
    Schwäbisch Gmünd
    Beiträge
    44

    Standard

    Hallo Georg,

    vielen Dank für deine Antwort. Das wäre jetzt auch meine Lösung gewesen, wenn es keine bessere Lösungen für 1:n Beziehungen gibt. Der Thread ist mir bei der Recherche auch über den Bildschirm gehuscht.

    Ich möchte Firmen, Vereine,Organisation u.s.w. in TL speichern. Jeder TYP bekommt einen separaten Punkt im BE. Jedem Einzelelement möchte ich eine Kategorie zuweisen. Wirtschaft -> Unterkategorie Dienstleistungen oder eben Freizeit -> Unterkategorie Vereine -> Unterkategorie Fussball.

    Ich möchte die Kategorien global halten, damit ich die unterschiedlichen Typen trotzdem alle in die gleichen Kategorien stecken kann. Für die Backendansicht ist die Kategorie eigentlich eher unwichtig, weshalb ich auch nicht (wie bei News) auf Parent- und Childtable zurückgreife.

    Wenn man Datensätze bearbeiten will, ist es besser, wenn die Firmen alphabetisch aufgelistet sind, anstatt erst in den Parent-Datensätzen zu suchen wo eine Firma nun eingetragen ist. Deshalb war mein Gedanke das über die Taxonomy-Extension zu machen.

    Gruß und Danke
    Alexander

  4. #4
    Contao-Fan Avatar von deerwood
    Registriert seit
    24.11.2009.
    Ort
    Hamburg
    Beiträge
    344

    Standard

    Moin Alexander,

    ich kenne die Extension Taxonomie nicht und habe gerade keine Zeit, sie zu analysieren. Dennoch eine Bemerkung, unter der Voraussetzung, dass Taxonomie als "enhanced Tagging" angesehen werden kann.

    Aus Deinem DCA Fragment ist zu erkennen, dass es sich NICHT um eine 1:N Beziehung von Deinem TYP zu Taxonomie-Einträgen handelt (['eval']['multiple'] = true; ich denke auch, dass Dein DB Feld den Datentyp BLOB hat). Das ist eine N:M Beziehung und die wird in TL eben zur Zeit via serialized Array abgebildet (Leo hat auch irgendwo mal kurz angedeutet, dass sich das in Zukunft eventuell ändern kann).

    Die N:M Beziehung an der Stelle ist auch durchaus sinnvoll. Meinen Segelverein möchte ich z.B. unter ".../Vereine/Hamburg/Alster" finden --- aber auch unter ".../Hamburg/Segelschulen" --- oder sogar ".../Boote/Jollen/Pirat".

    LG, Georg

  5. #5
    Contao-Nutzer Avatar von aw029
    Registriert seit
    29.07.2009.
    Ort
    Schwäbisch Gmünd
    Beiträge
    44

    Standard

    Hallo Georg,

    vielen dank nochmals für deine Antwort. Du hast natürlich recht, es ist eine n:m Beziehungen zwischen den Tabellen. Über die Taxonomy-Extension kann man eine hierarchisches Konstrukt von Tags aufbauen. Es wird hautpsächlich in der Catalog- und Catalog-Ext Extension verwendet.

    Zum Abschluss hätte ich dann aber doch nochmal zwei Fragen:

    1: Gibt es für das DCA einen Hook wo ich die Formatierung des zu speichernden Datensatzes manipulieren kann? Dann könnte ich doch das gewünschte Format erreichen. Beim Auslesen müsste das dann halt eben auch wieder über einen Hook gehen. Bei TYPO3 heißt sowas ItemProcFunc. Da kann man die Daten vor dem rendern des Feldes mit einer eigenen Funktion versehen. :-)

    2. Kann ich der Eval-Einstellung des Feldes einen eigenen Schlüssel und Wert zuwiesen den ich dann im Hook verwende? Hintergrund: die Tags sind hierarchisch aufbaut. Im DCA für die Firmen brauche ich natürlich nur die Tags unterhalb von "Wirtschaft" und für die Vereine nur die Tags unterhalb von "Freizeit" zur Auswahl.?

    Viele Grüße nach Hamburg
    Alexander

  6. #6
    Contao-Fan Avatar von deerwood
    Registriert seit
    24.11.2009.
    Ort
    Hamburg
    Beiträge
    344

    Standard

    Hallo Alexander

    Zitat Zitat von aw029 Beitrag anzeigen
    1: Gibt es für das DCA einen Hook wo ich die Formatierung des zu speichernden Datensatzes manipulieren kann? Dann könnte ich doch das gewünschte Format erreichen. Beim Auslesen müsste das dann halt eben auch wieder über einen Hook gehen. Bei TYPO3 heißt sowas ItemProcFunc. Da kann man die Daten vor dem rendern des Feldes mit einer eigenen Funktion versehen. :-)
    Ich glaube die Kombination von load_callback/save_callback könnte sein, was Du suchst. Ach, und oben haben wir beide nicht über IN() geredet, sondern über LIKE (Tip von Leo), oder?

    Zitat Zitat von aw029 Beitrag anzeigen
    2. Kann ich der Eval-Einstellung des Feldes einen eigenen Schlüssel und Wert zuwiesen den ich dann im Hook verwende? Hintergrund: die Tags sind hierarchisch aufbaut. Im DCA für die Firmen brauche ich natürlich nur die Tags unterhalb von "Wirtschaft" und für die Vereine nur die Tags unterhalb von "Freizeit" zur Auswahl.?
    Nicht in den Eval-Einstellungen, aber statt foreignKey kannst Du den options_callback benutzen. In dem selektierst Du die gewünschten Taxonomie-Einträge (Du bekommst als Parameter DataContainer $dc) und lieferst ein assoziatives Array ID => 'Anzeigewert' zurück. Eventuell ist es auch einen Versuch wert, ein 2-dimensionales assoziatives Array zurückzuliefern:

    PHP-Code:
    $result = array(
        
    'Wirtschaft' =>
            array(
                
    4711 => 'Firma 1',
                
    4712 => 'Firma 2',
                ...
            ),
        
    'Freizeit/Vereine' =>
            array(
                
    4812 => 'Verein 1',
                
    4813 => 'Verein 2',
                ...
            ),
        
    'Freizeit/Kinos' =>
            array(
                
    4915 => 'Kino 1',
                
    4916 => 'Kino 2',
                ...
            ),
    );
    return 
    $result
    In einem Select würden aus den Keys der 1. Ebene Option-Groups. Ich habe aber keine Ahnung, ob TL auch eine sinnvolle Ausgabe für Checkbox-Menüs generiert ... ein kurzer check von system/modules/backend/CheckBox.php zeigt mir aber, dass der Code offenbar mit mehrdimensionalen Arrays umgehen kann.

    LG, Georg

  7. #7
    Contao-Nutzer Avatar von aw029
    Registriert seit
    29.07.2009.
    Ort
    Schwäbisch Gmünd
    Beiträge
    44

    Standard

    Hallo Georg,

    vielen lieben Dank für die Hinweise und Tipps. Ich werde das ich den nächsten Tagen ausprobieren. Dein beschriebener Weg müsste eigentlich alle meine Probleme lösen. :-)

    Nochmals vielen Dank für deine Antworten und sonnige Grüße nach Hamburg

    Alexander

  8. #8
    Contao-Nutzer Avatar von aw029
    Registriert seit
    29.07.2009.
    Ort
    Schwäbisch Gmünd
    Beiträge
    44

    Standard Lösung

    Zur Vervollständigung:

    Die load- und save-Callbacks haben hervorragend funktionert.

    PHP-Code:
    'taxonomy' => array
            (
                
    'label'                   => &$GLOBALS['TL_LANG']['tl_companies']['taxonomy'],
                
    'exclude'                 => true,
                
    'filter'                  => true,
                
    'inputType'               => 'checkbox',
                
    'foreignKey'              => 'tl_taxonomy.name'
                
    'eval'                    => array('mandatory'=>false,'multiple'=>true,'tl_class'=>'long clr'),
                
    'save_callback'           => array(array('tl_companies_hooks','taxonomy_save_callback')),
                 
    'load_callback'           => array(array('tl_companies_hooks','taxonomy_load_callback')),
            ), 
    Damit werden die Werte dann kommasepariert in der Datenbank gespeichert und ich kann das ganze im FE sauber mit einem SQL where IN() auslesen.

    PHP-Code:
    public function taxonomy_save_callback($var$dc)
      {
          
    $values unserialize($var);
          if(
    is_array($values))return implode($values',');
      }
        
      public function 
    taxonomy_load_callback($var$dc)
      {
          
    $values explode(','$var);    
          if(
    _is_array($values))return serialize($values);
      } 
    Für die Anzeige gibt es in der Taxonomy-Extension ein eigenes BE-Widget. Bin ich auch nur durch Zufall drauf gekommen, als ich schauen wollte, wie ich den Baum darstelle im options_callback. Beschreibung ist in diesem Post falls es jemand braucht.
    https://community.contao.org/de/show...9301#post59301

    Vielen Dank für die großartige Hilfe.
    Alexander
    Geändert von aw029 (18.04.2010 um 18:02 Uhr)

  9. #9
    Contao-Fan Avatar von deerwood
    Registriert seit
    24.11.2009.
    Ort
    Hamburg
    Beiträge
    344

    Standard

    Moin Alexander,

    danke für das Aufzeigen Deiner Lösung. Bezüglich load/save_callback sollten wir uns beide mal angewöhnen, zunächst die verfügbare Doku (Link "Forum" der Taxonomy-Extension) zu lesen !

    Wie hast Du denn die korrekte Einbindung des Taxonomy-Widgets erkannt, reverse Engineering (ich habe es inzwischen dadurch nachvollziehen können)? Weil: dokumentiert scheint das ja leider nicht zu sein.

    Ach, noch was: die deutsche Übersetzung der Taxonomy verwendet penetrant, (fast) durchgängig und fälschlicherweise "Taxonomie Bedingung" statt "Taxonomie Begriff" für das englische "Taxonomy term". In der Anlage ein ZIP mit den korrigierten DE Übersetzungen.

    Ich würde das ja gern auch dem Autor Thyon zur Verfügung stellen, aber der obige Link verweist aufs alte Forum, dort kann ich nichts hinzufügen. Im englischen Forum finde ich gerade keinen geeigneten Thread ... aber hier lesen doch auch Fans von [catalog 2] mit, die das ZIP an Thyon weiterreichen können?

    LG, Georg

    Edit: finally found a link to the [catalog 2] source, WHY is this so well hidden? And I NEVER will register with Google Code to report, because I then would allow them to read all of my emails and, more important, also read all answers of recipients, even when they were not asked for permisson! Sorry, I can NOT accept such policies, even when they (currently) only use that for advertising. I will NEVER expose any private message to whom ever.

    Thus, some other friendly guy has to forward the ZIP.
    Angehängte Dateien Angehängte Dateien
    Geändert von deerwood (19.04.2010 um 03:47 Uhr)

  10. #10
    Contao-Nutzer Avatar von aw029
    Registriert seit
    29.07.2009.
    Ort
    Schwäbisch Gmünd
    Beiträge
    44

    Standard

    Hallo Georg,

    ich bin durch Zufall drauf gestossen, als ich mir überlegt habe, wie ich die rekursive Funktion für's Frontend schreibe. Da habe ich die Datei entdeckt und dann wars recht einfach. Die Klasse ist ja nicht allzu lang und ich dachte mir auch, dass die BE-Anzeige für die Extension im Backend ja auch irgendwo her kommen muss.

    Natürlich hast du recht, man müsste mehr im Forum suchen. Allerdings ist das auch immer davon abhängig, dass man im Suchschlitz die richtigen Worte eingibt. Das empfinde ich sehr oft als Problem. Die Extension-Manuals geben oft nicht viel her und auch die TL-Referenzen von DCA, Hooks und Callbacks sind nur nützlich, wenn man sowas schonmal gemacht hat und dann nur nochmal nachschauen will. Für jemand der zwar weiß was es ist, aber es noch nie gemacht hat wären ein zwei Beispiele besser.

    Mir ist zum Beispiel vieles klarer geworden, als ich den Thread Tagebuch einen Extension durchgelesen hatte. Dort sind die Beispiele drin die ich gebraucht habe. Da gibt es noch Verbesserungsbedarf. Soll aber an dieser Stelle keine Kritik sein. Es ist in OS-Projekten eben nicht immer ganz einfach solche Dinge zu organisieren und zu realisieren.

    Viele Grüße
    Alexander

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 10.01.2012, 13:39
  2. Antworten: 1
    Letzter Beitrag: 24.02.2011, 16:28
  3. Probleme mit Multiple Domains
    Von Argus im Forum Sonstiges zu Contao
    Antworten: 1
    Letzter Beitrag: 14.09.2010, 10:22
  4. save_callback / multiple save
    Von SharkeyO im Forum Entwickler-Fragen
    Antworten: 5
    Letzter Beitrag: 25.02.2010, 12:29
  5. Checkbox speichert nicht, wenn multiple => false
    Von morb im Forum Entwickler-Fragen
    Antworten: 2
    Letzter Beitrag: 22.06.2009, 10:03

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •