Ergebnis 1 bis 23 von 23

Thema: Backend Filter abhängig von POST-Parameter

  1. #1
    Contao-Nutzer Avatar von pout
    Registriert seit
    23.06.2009.
    Ort
    Wien
    Beiträge
    124
    User beschenken
    Wunschliste

    Standard Backend Filter abhängig von POST-Parameter

    Hallo,

    ich habe ein hirarchisches Metamodel mit Kategorien.

    Hauptkategorien: Haupt1, Haupt2, Haupt3 (Mehrfachauswahl möglich)
    Haupt1 und Haupt3 haben Unterkategorien.

    MM Produkte hat eine Auswahl der Hauptkategorien (gefiltert nach pid).
    Wenn eine ausgewählte Hauptkategorie Unterkategorien hat, soll in der Eingabemaske das Auswahlfeld mit den passenden Unterkategrorien angezeigt werden.
    Bislang hatte ich nur eine Hauptkategorie mit Unterkategorien und ich habe es mit einem Filter über die pid der Kategorie gelöst.
    Code:
    SELECT * FROM mm_productcategory WHERE pid=1
    Jetzt haben aber auch andere Hauptkategrorien Unterkategorien, die abhängig des per auto_submit gesendeten POST-Parameters angezeigt werden sollen.
    Wie kann ich auf dieses Array im Filter zugreifen bzw. es aussplitten?
    Code:
    {{param::post?name=productcat[]}}
    habe testweise
    Code:
    SELECT * FROM mm_productcategory 
    WHERE pid IN (
    SELECT item_id FROM tl_metamodel_translatedtext 
    WHERE att_id = 92 AND value LIKE {{param::post?name=productcat[1]}})
    experimentiert, aber so scheint es nicht zu gehen.

  2. #2
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Vielleicht mit
    HTML-Code:
    LIKE <?= \Input::post('name') ?>
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  3. #3
    Contao-Nutzer
    Registriert seit
    05.10.2012.
    Beiträge
    213

    Standard

    Kurz zum Verständnis:
    […] soll in der Eingabemaske das Auswahlfeld mit den passenden Unterkategrorien angezeigt werden.
    In welcher Eingabemaske? Frontend? Hast du ein selbst erstelltes Formular? Oder geht es um einen Frontend-Filter für die Ausgabe?

    Jetzt haben aber auch andere Hauptkategrorien Unterkategorien, die abhängig des per auto_submit gesendeten POST-Parameters angezeigt werden sollen.
    Wie kann ich auf dieses Array im Filter zugreifen bzw. es aussplitten?
    Was genau wird im auto_submit genau übergeben, kannst du das POST mal posten?
    In POST kann doch kein Array direkt übergeben werden, oder? Wenn, dann müsste das ja serialisiert sein, darauf kannst du dann auf keinen Fall direkt zugreifen.

    Im Debug-Modus kannst du dir übrigens die Queries anschauen, damit siehst du dann, ob das Insert-Tag im Filter den richtigen Wert ausgibt. Kannst du die erzeugte Query mal posten?

    Was Andreas' Variante angeht: PHP im Filter geht meines Wissens nicht, nur Insert-Tags?

    Ah und ich denke, es müsste statt
    PHP-Code:
    SELECT FROM mm_productcategory 
    PHP-Code:
    SELECT id FROM mm_productcategory 
    lauten.

  4. #4
    Contao-Nutzer Avatar von pout
    Registriert seit
    23.06.2009.
    Ort
    Wien
    Beiträge
    124
    User beschenken
    Wunschliste

    Standard

    Es geht um die Backendeingabemaske.

    Ich fürchte das geht nur im Forntend, denn slebst ein {{param:ost?name=FORM_SUBMIT}} liefert NULL:

    Code:
    [query] => SELECT * FROM mm_productcategory 
    WHERE pid IN (
    SELECT item_id FROM tl_metamodel_translatedtext 
    WHERE att_id = 92 AND value LIKE NULL)

  5. #5
    Contao-Nutzer
    Registriert seit
    05.10.2012.
    Beiträge
    213

    Standard

    Verstehe.
    D.h. du hast in mm_produkte zwei Auswahlen, einmal Hauptkategorie und einmal Unterkategorie?
    Und die zweite Auswahl soll gefiltert werden, abhängig davon, was in der ersten Auswahl gewählt ist, richtig?

  6. #6
    Contao-Nutzer Avatar von pout
    Registriert seit
    23.06.2009.
    Ort
    Wien
    Beiträge
    124
    User beschenken
    Wunschliste

    Standard

    kurz und bündig und vollkommen richtig.

  7. #7
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von pju Beitrag anzeigen
    Was Andreas' Variante angeht: PHP im Filter geht meines Wissens nicht, nur Insert-Tags?
    Sorry, klar, das geht im BE nicht, dachte er wäre in einem Template.
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  8. #8
    Contao-Nutzer
    Registriert seit
    05.10.2012.
    Beiträge
    213

    Standard

    Okay, hab es gerade getestet mit einem Minimal-Setup. Bei mir funktioniert es wunderbar.
    Was ich nicht habe sind übersetzte Attribute.

    Mein Filter sieht so aus:
    PHP-Code:
    SELECT id FROM {{table}} WHERE alias LIKE {{param::post?name=auswahl}} 
    "auswahl" ist in diesem Fall der Spaltenname des ersten Auswahl-Attributs:
    Bildschirmfoto 2015-10-01 um 15.33.35.png

    Das ist jetzt natürlich nur ein Beispiel, aber das zeigt, dass die Werte korrekt aus POST gezogen werden.

    Bei dir also FORM_SUBMIT durch den Spaltennamen des ersten Auswahl-Attributs (Hauptkategorie) ersetzen.

    Bringt dich das so vielleicht schon weiter?
    Geändert von pju (01.10.2015 um 14:57 Uhr)

  9. #9
    Contao-Nutzer Avatar von pout
    Registriert seit
    23.06.2009.
    Ort
    Wien
    Beiträge
    124
    User beschenken
    Wunschliste

    Standard

    Hmm. Intersssant, dass du Werte bekommst.
    Wenn ich diese Hürde schaffen sollte, bleibt, dass beide Mehrfachauswahlen sind. Daher schaut der Name meines Postparameters so aus: productcat[] und ist wohl ein Array.
    Die Mehrsprachigkeit sollte dann nicht mehr das Problem sein.

    Danke für deine Mühe.

  10. #10
    Contao-Nutzer
    Registriert seit
    05.10.2012.
    Beiträge
    213

    Standard

    Ah ja, das mit der Mehrfachauswahl habe ich vergessen, sorry.

    Den Wert solltest du in deinem Fall dennoch über productcat (ohne []) bekommen, dann gibt es nicht NULL zurück, sondern ein serialisiertes Array, in meinem Beispiel sieht das so aus:
    PHP-Code:
    [query] => SELECT id FROM mm_helpers WHERE alias LIKE 'a:2:{i:0;s:8:\"bookable\";i:1;s:6:\"booked\";}' 
    Jetzt reichen meine SQL-Skills allerdings nicht aus, um dir zu sagen, ob du mit dem serialisierten Array etwas anfangen kannst, ich geh aber davon aus, dass das nicht so geht.

  11. #11
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.757
    User beschenken
    Wunschliste

    Standard

    ich bin mir nicht mehr sicher, ob man in dem SQL eigene Insert-Tags verwenden konnte

    wenn ja, kannst Du eine Templatedatei anlegen, mit PHP befüllen und einbinden per {{file::/mm_templates/paramconvert.html5}} vielleicht kommst Du hier an das Array und kannst es aufsplitten

    oder auf die "harte Tour" http://www.russellengland.com/2012/0...ing-mysql.html

    Nachtrag: wenn das ein Array ist, kommst Du mit LIKE nicht weiter - hier müsste sicher IN ('name1','name2') rein - den "Serial-String" könnte man ggf. per RegEx umwandeln in das "CSV-Gebilde"

  12. #12
    Contao-Nutzer
    Registriert seit
    05.10.2012.
    Beiträge
    213

    Standard

    Zonkys Idee mit dem eigenen File ist ne gute Idee.

    Hab heute zuviel Zeit, deshalb hab ich es direkt getestet.

    Filter:
    PHP-Code:
    SELECT id FROM {{table}} WHERE alias IN ({{file::test.php}}) 
    Test.php (liegt in meinem Fall direkt im Template-Folder, sonst halt Pfad anpassen):
    PHP-Code:
    <?php
    $values 
    = \Input::post('auswahl');
    $str '';

    for (
    $i 0$i count($values); $i++) {
      
    $str .= "'" $values[$i] . "'";
      if ( 
    $i count($values) - $str .= ", ";
    }
    echo (
    $str) ? $str : -1;
    ?>
    \Input::post('auswahl') müsste in deinem Fall dann \Input::post('productcat') sein.

    Bin mir nicht sicher, wie die Input-Klasse den Input genau sanitized, kann sein, dass das nicht sicher ist. Ich würde den Filter aber sowieso nur im BE einsetzen.
    Geändert von pju (01.10.2015 um 16:11 Uhr)

  13. #13

  14. #14
    Contao-Nutzer
    Registriert seit
    05.10.2012.
    Beiträge
    213

    Standard

    Und was willste mir damit sagen?

  15. #15
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  16. #16
    Contao-Nutzer
    Registriert seit
    05.10.2012.
    Beiträge
    213

    Standard

    Da gibt's nur weder was zu un- noch zu de-serializen, wenn man direkt über Post geht.
    Was man allerdings machen musst, und das macht die Schleife bei mir, ist, nen String für die Query zu bauen.

    Das mag auch eleganter gehen, aber ich glaube, zonky wollte vor allem bisschen klugscheißen, und das hat in diesem Fall nicht so gut geklappt.

  17. #17
    Contao-Nutzer Avatar von pout
    Registriert seit
    23.06.2009.
    Ort
    Wien
    Beiträge
    124
    User beschenken
    Wunschliste

    Standard

    Ihr seid super! Vielen Dank das funktioniert bestens!

  18. #18
    Contao-Nutzer Avatar von pout
    Registriert seit
    23.06.2009.
    Ort
    Wien
    Beiträge
    124
    User beschenken
    Wunschliste

    Standard

    Fehlt doch noch was:

    wenn man den Datensatz aus dem Listing aufruft, wird keine Unterkategorie gezeigt. Wenn ich dann eine Hauptkategorie ab- und wieder anwähle um die Unterkategorie zu zeigen, ist keine Unterkategorie gesetzt und wird auch nicht durch speichern gesetzt. Egal was ich bei den Unterkategorien anhake, es ist weg und der Frontend-Filter für die Unterkategorien zeigt auch keine Auswahlmöglichkeit, als ob keine Tags gesetzt seien. Wenn ich den BE Filter deaktiviere sind die Unterkategorien aber im Front- und Backend gesetzt.
    Werde morgen schauen, ob ich da morgen weiter komme.

  19. #19
    Contao-Nutzer
    Registriert seit
    05.10.2012.
    Beiträge
    213

    Standard

    Ja, der Filter liefert ein leeres Ergebnis, wenn das Feld im Post nicht gesetzt ist. Da muss man noch einen Fallback einbauen.
    Im FE kommt der Filter auch zum Einsatz? Kannst du mal einen Screenshot von deinen Frontendfilter-Modulen posten? Und den SQL-Filter, wie du ihn jetzt erstellt hast?

    Im FE würd ich es so machen (Auswahl = Hauptkategorie, Auswahl2 = Unterkategorie):
    Bildschirmfoto 2015-10-01 um 19.10.44.png
    Bildschirmfoto-2015-10-01-um-19.10.54.jpg
    Bildschirmfoto-2015-10-01-um-19.11.jpg
    Geändert von pju (01.10.2015 um 18:18 Uhr)

  20. #20
    Contao-Nutzer
    Registriert seit
    05.10.2012.
    Beiträge
    213

    Standard

    Okay, ich hab's nicht lassen können.
    Vorab: du meintest, du hast ein hierachisches Model für die Selects, das heißt mit Varianten, richtig?

    Meine Lösung beruht darauf, evtl musst du dementsprechend anpassen.

    Setup: ein Filter, mit OR und zwei Einstellungen:
    Bildschirmfoto 2015-10-01 um 20.43.27.png

    WICHTIG:
    Beim OR den Haken bei Nach erstem Treffer beenden setzen.

    Der obere Filter sieht dann so ähnlich aus, wie bisher (angepasst auf die Varianten):
    PHP-Code:
    SELECT id FROM {{table}} WHERE varbase AND vargroup IN (
    SELECT vargroup FROM {{table}} WHERE alias IN ({{file::test.php}})

    Der zweite sieht (untere) sieht so aus:
    PHP-Code:
    SELECT id FROM {{table}} WHERE varbase AND vargroup IN (
    SELECT vargroup FROM {{table}} WHERE id IN (
    SELECT value_id FROM tl_metamodel_tag_relation WHERE `att_id` = 13 AND `item_id`= SUBSTRING_INDEX({{param::get?name=id}},'::',-1)
    )

    Die att_id musst du auf dein gewünschtes Attribut anpassen!

    Keine Ahnung, ob das die beste Lösung ist, aber funktioniert bei mir. Und schön, mal zu sehen, was man mit den Filtern alles machen kann.


    ABER:
    Wie gesagt, für den Frontend-Filter sollte es einfacher gehen, so, wie im vorigen Post.


    Ach und ein Problem gibt es noch von der Benutzerfreundlichkeit (falls das überhaupt eines ist). Und zwar, wenn du ein bestehendes Item bearbeitest.

    Sagen wir, das Item hat Kategorie A, Unterkategorie A1.
    Dann stellst du um auf Kategorie B.

    Jetzt siehst du aber nicht mehr, dass die Unterkategorie A1 in der Mehrfachauswahl zugeordnet ist (weil er ja nur die Unterkategorien von Kategorie B zeigt).

    Für die Auswahl im Frontend macht das aber nichts, solange die Unterkategorien nur angezeigt werden, wenn die Hauptkategorie gewählt ist. (Dann wird das Item mit Hauptkategorie B und Unterkategorien A1 und B1 beim Filter "Hauptkategorie A, Unterkategorie A1" nicht angezeigt, weil die Hauptkategorie ja nicht stimmt.

    Du könntest den Filter aber auch noch so erweitern, dass die gewählten Unterkategorien immer dazukommen. Wie, kannst du dir ja jetzt vielleicht zusammenreimen
    Geändert von pju (01.10.2015 um 19:53 Uhr)

  21. #21
    Contao-Nutzer Avatar von pout
    Registriert seit
    23.06.2009.
    Ort
    Wien
    Beiträge
    124
    User beschenken
    Wunschliste

    Standard

    pju, danke für deine Lösung. Ich habe sie an meine Bedürfnisse angepasst. Habe nicht mit Varianten gearbeitet, sonder einfach hierarchisch mit manueller Sortierung. Leider "zerschießt" mir der Filter meine FE-Filterung. Es dürfte mit der Mehrfachauswahl zu tun haben (gelöst, siehe unten ------).

    Meine Kategoriefilter sehen wie folgt aus (zwei oder-Verknüpfte "EigeneSQL"-Filtereinstellungen):

    PHP-Code:
    SELECT FROM mm_productcategory 
    WHERE pid 
    <> AND pid IN (
    SELECT item_id FROM tl_metamodel_translatedtext
    WHERE att_id 
    92 AND value IN ({{file::post_productcat.php}})) 
    92 ist der übersetzte Alias

    PHP-Code:
    SELECT id FROM {{table}} WHERE pid <> AND pid IN (
    SELECT pid FROM {{table}} WHERE pid IN (
    SELECT value_id FROM tl_metamodel_tag_relation WHERE `att_id` = 93 AND `item_id`= SUBSTRING_INDEX({{param::get?name=id}},'::',-1)
    )

    93 ist die Hauptkategorie. Somit werden abhängig der gewählten Hauptkategorie alle zugehörigen Unterkategorien angezeigt. Das funktioniert wunderbar.

    Allerdings kann ich im BE-Listing nicht mehr nach Unterkategorie filtern und im FE fehlt mir auch nicht.

    Im FE habe ich je eine Seite mit einer MM-Liste vorsortiert nach einer Hauptkategorie. Hier sollte es eine Mehrfachauswahl auf die zugehörige Unterkategorie geben. Die verschwindet aber mit dem neuen Unterkategorie-Filter und es wird nicht gefiltert. Es wird noch nach anderen Sachen gefiltert, aber das Problem ist die Mehrfachauswahl der Unterkategorie. Stelle ich auf eine Einzelauswahl um, wird danach gefiltert.

    Bei meinem vorherigen Filter, der einfach nur auf die Unterkategorie der einen Hauptkategorie einschränkte, weil es die einzige mit Unterkategorien war, funktioniert die Filterung sowohl im BE, als auch im FE:
    PHP-Code:
    SELECT FROM mm_productcategory WHERE pid=or pid=
    --------------------------

    OK gelöst. Gerade habe ich das oben geschrieben, kam mir die Lösung. Man muss meine letzte Filteranweisung auch noch als letzte in die Oder-Verknüpfung schreiben und die pid (=Hauptkategorien) angeben, die im BE-Listing und FE gefiltert werden soll. Oder alle Unterkategorien:

    PHP-Code:
    SELECT FROM mm_productcategory WHERE pid<> 
    Der nächste Schritt ist auch den auto_item-Parameter im FE auszuwerten und nur die Unterkategorien der aktuellen Hauptkategorie zur Auswahl zu stellen.

    Vielen Dank nochmals!

    ---------------------------

    Nachtrag: Wenn man "nur verbleibende Tags" in der Mehrfachauswahl für die Unterkategorien des Produktfilter anhakt, braucht man den auto_item-Parameter nicht auswerten und es werden nur die zugehörigen Unterkategorien im Filter gezeigt.
    Geändert von pout (02.10.2015 um 18:16 Uhr)

  22. #22
    Contao-Nutzer
    Registriert seit
    05.02.2010.
    Ort
    Chemnitz
    Beiträge
    30

    Standard

    Kurze Frage, wo setze ich den Filter?

    Anlegen kann ich die Filter ja unter den Filtereinstellungen des MetaModels, aber wo kann ich den erstellten Filter dann zuweisen? Weder bei Attributen noch bei Render-Einstellungen noch bei Eingabemaske kann ich den Filter dem entsprechenden Feld (in meinem Fall "subcategory") zuweisen. Lediglich unter Render-Einstellungen -> [Einstellungen bearbeiten] ist der Filter zu finden - es passiert aber nichts augenscheinliches.

    Oder andersherum gefragt. Wo muss ich Filter anlegen, damit diese unter MetaModels -> MeinMetamodel -> [Attribute] beim Attribut-Typ "Auswahl" im Formular unter Anzeigeeinstellungen -> Filter angezeigt werden.

    Ich verzweifel langsam an dieser eigentlich simplen Funktion.

  23. #23
    Contao-Nutzer Avatar von pout
    Registriert seit
    23.06.2009.
    Ort
    Wien
    Beiträge
    124
    User beschenken
    Wunschliste

    Standard

    Zwei MM

    Produkte
    Kategorie

    in Kategorie den Filter anlegen
    in Produkte ein Mahrfachauswahl -Attribut anlegen -Datanbanktabelle des MM Kategorie auswählen, dann kann man da die Filter der Kategorie auswählen.

Aktive Benutzer

Aktive Benutzer

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

Lesezeichen

Lesezeichen

Berechtigungen

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