Smarty Schleife - Logik :)

Hey, ich versuche gerade eine komplizierte Schleife (für mich kompliziert) zu bauen und komme nicht auf die logische Antwort bzw. Lösung. Vllt sieh es von euch jmd auf anhieb. Ich habe eine Array mit folgenden Werten: materialID | qm | preis 1 | 1 | 50€ 1 | 2 | 48€ 1 | 3 | 47€ 1 | 4 | 45€ 2 | 1 | 60€ 2 | 2 | 50€ 3 | 1 | 30€ 3 | 2 | 25€ 3 | 3 | 20€ 3 | 4 | 15€ Diese Werte habe ich jetzt nach MaterialID sortiert, können aber auch unsortiert sein. Nun brauche ich für jede materialID eine eigene Tabelle mit den Spalten qm und preis. Das ganze sollte dynamisch sein, da ich die Anzahl nicht kenne. Beispiel: [code]

| 1 | 50€ |
| 2 | 48€ |
| 3 | 47€ |
| 4 | 45€ |

| 1 | 60€ |
| 2 | 50€ |

| 1 | 300€ |
| 2 | 25€ |
| 3 | 20€ |
| 4 | 15€ |

[/code] Statisch für die MaterialID 1 würde ich es so machen: [code]

{foreach name=aussen item=feld from=$qm_matrix} {if $feld.materialID == 1} | {$feld.qm} | {$feld.preis} |
{/if} {/foreach}
[/code] Aber ich will es ja dynamisch für alle MaterialID haben. Ich hoffe ihr habt eine Idee? Danke euch.

Hallo, mein Vorschlag wäre das Array in PHP so aufzubauen und die Schleifen im Template nachzubauen: $a = array(); $a['materialID\_1']['qm\_1'] = 1.00; $a['materialID\_1']['qm\_2'] = 2.00; $a['materialID\_1']['qm\_3'] = 3.00; $a['materialID\_2']['qm\_4'] = 4.00; $a['materialID\_2']['qm\_5'] = 5.00; $a['materialID\_2']['qm\_6'] = 6.00; foreach ($a as $materialID =\> $qmPrices) { foreach ($qmPrices as $qm =\> $price) { echo $materialID . ', ' . $qm . ', ' . $price . ' '; } echo ' '; }

Hey Ralf, stehe auf dem Schlauf und blick dein Beispiel gerade nicht wirklich :confused: mein Array, welches im Template im Moment verfügbar ist, hat diesen Aufbau: $qm\_matrix[0][materialID] = 1 $qm\_matrix[0][qm] = 1 $qm\_matrix[0][preis] = 100 $qm\_matrix[1][materialID] = 1 $qm\_matrix[1][qm] = 2 $qm\_matrix[1][preis] = 95 etc. Das ganze Frage ich in der Bootstrap ab: //Preise ermitteln $sql = " Select s\_plugin\_OttschoAreaCalculator.materialID, qm, preis from s\_plugin\_OttschoAreaCalculator INNER JOIN s\_plugin\_OttschoAreaCalculator\_Materials ON s\_plugin\_OttschoAreaCalculator.materialID = s\_plugin\_OttschoAreaCalculator\_Materials.id WHERE s\_plugin\_OttschoAreaCalculator\_Materials.articleID=".$view-\>sArticle[articleID]." order by qm DESC";

Du müsstest das Array in das Format bringen, dass ich im Beispiel habe. Eine evtl. einfachere Lösung wäre, mit Smarty den aktuellen Wert von materialID in einer Variable zu speichern. Dann bei Durchlaufen der Einträge prüfen, ob sich dieser Wert geändert hat. Wenn ja, ist die vorgehende Tabelle zu Ende und die neue beginnt.

Ja, das wäre auch eine Idee. Das Problem ist ja, dass die Seite dann schon geladen wurde. Ich habe ein Radio-Html Form mit z.B. 3 Materialien. Jedes der Radiofelder hat als Value die materialID. Wird nur das Feld “1” Material XYZ angeklickt, würde ich gerne die Staffelpreise des Materials anzeigen. Da aber das Template schon viel früher geladen wird, habe ich in meiner Variable natürlich alle Werte und nicht nur die, welche der User später anklickt.

[quote=“ottscho”]Hey, ich versuche gerade eine komplizierte Schleife (für mich kompliziert) zu bauen und komme nicht auf die logische Antwort bzw. Lösung. Vllt sieh es von euch jmd auf anhieb. Ich habe eine Array mit folgenden Werten: materialID | qm | preis 1 | 1 | 50€ 1 | 2 | 48€ 1 | 3 | 47€ 1 | 4 | 45€ 2 | 1 | 60€ 2 | 2 | 50€ 3 | 1 | 30€ 3 | 2 | 25€ 3 | 3 | 20€ 3 | 4 | 15€ Diese Werte habe ich jetzt nach MaterialID sortiert, können aber auch unsortiert sein. Nun brauche ich für jede materialID eine eigene Tabelle mit den Spalten qm und preis. Das ganze sollte dynamisch sein, da ich die Anzahl nicht kenne. Beispiel: [code]

| 1 | 50€ |
| 2 | 48€ |
| 3 | 47€ |
| 4 | 45€ |

| 1 | 60€ |
| 2 | 50€ |

| 1 | 300€ |
| 2 | 25€ |
| 3 | 20€ |
| 4 | 15€ |

[/code] Statisch für die MaterialID 1 würde ich es so machen: [code]

{foreach name=aussen item=feld from=$qm_matrix} {if $feld.materialID == 1} | {$feld.qm} | {$feld.preis} |
{/if} {/foreach}
[/code] Aber ich will es ja dynamisch für alle MaterialID haben. Ich hoffe ihr habt eine Idee? Danke euch.[/quote] “$feld.materialID” gib es ja nicht, sondern das dürfte $feld.0 sein, usw. Auf die Schnelle würde ich die Tabelle so konstruieren: [code]
{assign var=“old_id” value=-1} {foreach name=mat_id item=feld from=$qm_matrix} {if $feld.0 <> $old_id} {assign var=“old_id” value=$feld.0} {if $smarty.foreach.mat_id.iteration>1} {/if}

$feld.3 || {/if} {$feld.1} | {$feld.2} | {/foreach}

[/code] Um die Überschriften zu bekommen, muss du den array im ein Feld erweitern: Material-Namen.

[quote=“ottscho”]Ja, das wäre auch eine Idee. Das Problem ist ja, dass die Seite dann schon geladen wurde. Ich habe ein Radio-Html Form mit z.B. 3 Materialien. Jedes der Radiofelder hat als Value die materialID. Wird nur das Feld “1” Material XYZ angeklickt, würde ich gerne die Staffelpreise des Materials anzeigen. Da aber das Template schon viel früher geladen wird, habe ich in meiner Variable natürlich alle Werte und nicht nur die, welche der User später anklickt.[/quote] Du musst natürlich alle möglichen Tabellen vorgenerieren, und dann per javascript die passende sichtbar schalten…

Hey avenger, danke für deinen Lösungsansatz, leider habe ich nun für jeden Datensatz eine eigene Tabelle. Wenn das ganze nun irgendwie nach materialID gruppiert wäre, dann müsste es passen. Die Ausgabe sieht nun so aus: [code]

| 10 | 115 |

| 5 | 60 |

| 5 | 30 |

| 5 | 120 |

| 4 | 70 |

| 4 | 35 |

| 3 | 80 |

| 3 | 40 |

| 2 | 90 |

| 2 | 45 |

| 1 | 100 |

| 1 | 50 |

[/code] Verwendete Code: [code]
{assign var=„old_id“ value=-1} {foreach name=mat_id item=feld from=$qm_matrix} {if $feld.materialID <> $old_id} {assign var=„old_id“ value=$feld.materialID} {if $smarty.foreach.mat_id.iteration>1} {/if}

{/if} {$feld.qm} | {$feld.preis} | {/foreach}

[/code] P.S. ich könnte nun auch die css class=mat3 einbelden und alle anderen ausblenden. Dann hätte ich auch den gewünschten Effekt. Leider weiß ich nur, wie es über die ID geht. Gibts da auch was für die Class? function anzeigen(das) { if (document.getElementById(das).style.display=='none') { document.getElementById(das).style.display='block'; } else { document.getElementById(das).style.display='none'; } }

Moin, es scheint dann doch der 2. Lösungsvorschlag zu werden. Denke, jetzt müsstest Du nur noch die Sortierung in der SQL-Anweisung ändern: ‚order by materialID, qm‘ (so ähnlich), dann sollte es funktionieren.

Hey Ralf, naja, ich hab den ersten Vorschlag immer noch nicht verstanden bzw. die Logik des Array’s. Warum kommt da bei MaterialID 1 - qm_1,qm_2 etc. und nachher bei MaterialID 2 - qm_4,qm_5 etc. Da sollte es ja auch wieder mit qm_1 anfangen, oder? Aber nun zum letzten Problem. Ich habe ja jetzt mehrer Tabellen. Nun will ich alle Klassen mat1 und mat2 ausblenden und mat3 anzeigen.

[quote=„ottscho“]Hey Ralf, naja, ich hab den ersten Vorschlag immer noch nicht verstanden bzw. die Logik des Array’s. Warum kommt da bei MaterialID 1 - qm_1,qm_2 etc. und nachher bei MaterialID 2 - qm_4,qm_5 etc. [/quote] Die Werte für qm waren in dem Beispiel doch nicht wichtig. Es ging mir um den Aufbau des Arrays und dass du dann mit 2 einfachen Schleifen im Template auskommen würdest. Aber hast recht, mit den richtigen Werten wäre es leichter zu verstehen.

[quote=“ottscho”]Hey avenger, danke für deinen Lösungsansatz, leider habe ich nun für jeden Datensatz eine eigene Tabelle. Wenn das ganze nun irgendwie nach materialID gruppiert wäre, dann müsste es passen.[/quote] Der Array muss natürlich nach materialid, qm sortiert sein… [quote=“ottscho”]P.S. ich könnte nun auch die css class=mat3 einbelden und alle anderen ausblenden. Dann hätte ich auch den gewünschten Effekt. Leider weiß ich nur, wie es über die ID geht. Gibts da auch was für die Class?[/quote] Kannst da auch eine ID draus machen… Mit jQuery kann man einfach auch Elemente nach ihren Klassen selektieren. Das geniale an jQuery ist u.a. dass man das zu bearbeitende Element genau so anspricht, wie man das in CSS machen würde. Da brauch man nicht viel neu zu lernen. Um z.B. ein Element mit der Klasse “mat1” anzuprechen, schreibt man einfach “$(’.mat1’)…”

[quote=“avenger”][quote=“ottscho”]Hey avenger, danke für deinen Lösungsansatz, leider habe ich nun für jeden Datensatz eine eigene Tabelle. Wenn das ganze nun irgendwie nach materialID gruppiert wäre, dann müsste es passen.[/quote] Der Array muss natürlich nach materialid, qm sortiert sein… [quote=“ottscho”]P.S. ich könnte nun auch die css class=mat3 einbelden und alle anderen ausblenden. Dann hätte ich auch den gewünschten Effekt. Leider weiß ich nur, wie es über die ID geht. Gibts da auch was für die Class?[/quote] Kannst da auch eine ID draus machen… Mit jQuery kann man einfach auch Elemente nach ihren Klassen selektieren. Das geniale an jQuery ist u.a. dass man das zu bearbeitende Element genau so anspricht, wie man das in CSS machen würde. Da brauch man nicht viel neu zu lernen. Um z.B. ein Element mit der Klasse “mat1” anzuprechen, schreibt man einfach “$(’.mat1’)…”[/quote] Ja gut, wenn ich eine ID draus mache, habe ich aber doppelte ID’s. Das geht ja dann nicht :wink: Habe es nun so gelöst, mit JQuery kenne ich mich noch weniger aus :frowning: [code] function ShowClass©{ var alltags = document.getElementsByTagName(“table”); //für alle Tags: “*” for (i=0; i<alltags.length i if alltags></alltags.length>

[quote=“ottscho”]Ja gut, wenn ich eine ID draus mache, habe ich aber doppelte ID’s. Das geht ja dann nicht ;)[/quote] Mit

hast Du ja unterschiedliche id’s.

[quote=“avenger”][quote=“ottscho”]Ja gut, wenn ich eine ID draus mache, habe ich aber doppelte ID’s. Das geht ja dann nicht ;)[/quote] Mit

hast Du ja unterschiedliche id’s.[/quote] Ja, dass stimmt. Aber die Smarty Schleife klappt nicht 100%ig und macht dies. Darum hätte ich doppelte ID’s [code]

| 10 | 115 |

| 5 | 60 |

| 5 | 30 |

| 5 | 120 |

| 4 | 70 |

| 4 | 35 |

| 3 | 80 |

| 3 | 40 |

| 2 | 90 |

| 2 | 45 |

| 1 | 100 |

| 1 | 50 |

[/code] Ich blende jetzt alle Tabellen aus und nur die benötigten z.b. calss=mat1 ein. Dann stimmt die optische Ansicht. Schöner wäre natürlich, wenn die Smarty Schleife gleich dies machen würde: [code]

| 5 | 120 | 10 | 115 |

| 5 | 60 | 4 | 70 | 3 | 80 | 2 | 90 | 1 | 100 |

| 5 | 30 | 4 | 35 | 3 | 40 | 2 | 45 | 1 | 50 |

[/code]