Neu Smarty foreach Schleife

lord_icon

Gut bekanntes Mitglied
21. Juli 2007
198
8
Moin,

ich würde gern weitere Angaben in der Artikel-Detail-Ansicht erstellen.

Also hab ich ein eigenes Template angelegt und im gewünschten Bereich Änderngen vorgenommen.

Code:
{extends file="{$parent_template_path}/productdetails/attributes.tpl"}

$array = array( material       => array('1','2'),
               innenmaterial    => array('3','4'),
           );

test2

{foreach from=$array key=key item=item}
   <pre>{$item|print_r}</pre>
   {foreach from=$item item=item2}
       <pre>{$item2|print_r}</pre>
   {/foreach}
   
{/foreach}
test3


Test2 + Test 3 wird an der gewünschten Stelle ausgegeben. Mein array-durchlauf allerdings nicht.
Was mache ich denn dort falsch ?
 

martinwolf

Offizieller Servicepartner
SPBanner
6. September 2012
3.385
263
Weil Du kein Array definiert hast:

Code:
{assign var=array value=['material' => ['1', '2'], 'innenmaterial' => ['3', '4']]}
 

lord_icon

Gut bekanntes Mitglied
21. Juli 2007
198
8
Danke Martin für deine Hilfe.
Das klappt soweit ganz gut.

Ein Problem habe ich aber noch. Groß/Kleinschreibung verurascht offensichtlich eine Kollision (?)

Schreibe ich "Material" im array wieder klein, wird der Text ausgegeben. Sobald ich es groß schreibe hab ich ein leeres Feld.
Ist das nicht zulässig ?

Danke nochmal


P.s. Gelöst hab ich es über {$key|strtolower|ucwords}: aber wäre dennoch mal interessant zu wissen, warum es hier zum Fehler kommt.


Code:
{extends file="{$parent_template_path}/productdetails/attributes.tpl"}


{block name="productdetails-attributes" append}
{assign var=array value=[    'Material' => 'material',
                            'innenmaterial' => 'innenmaterial'
                        ]
}


    <div class="product-attributes">
        <div class="table-responsive">
            <table class="table table-striped table-bordered">
                <tbody>
              
                {foreach from=$array key=key item=item}
                    <tr class="attr-characteristic">
                        <td class="attr-label">
                            {if (isset($Artikel->FunktionsAttribute.{$key}) && $Artikel->FunktionsAttribute.{$key}|@strlen > 0)}
                            {$key}:
                            {/if}
                        </td>
                        <td class="attr-value">         
                            {if (isset($Artikel->FunktionsAttribute.{$item}) && $Artikel->FunktionsAttribute.{$item}|@strlen > 0)}
                            {$Artikel->FunktionsAttribute.{$item}}
                            {/if}                 
                        </td>
                    </tr>
                {/foreach}
              
            </tbody>
            </table>
        </div>
    </div>

{/block}
 

martinwolf

Offizieller Servicepartner
SPBanner
6. September 2012
3.385
263
Ich bin mir nicht zu 100% sicher, aber ich meine dass Attributnamen beim Übertragen an den Webshop nach lowercase convertiert werden.
 

lord_icon

Gut bekanntes Mitglied
21. Juli 2007
198
8
oki. Scheint tatsächlich so zu sein. aber gut. Über {$key|ucwords} lässt sich das ja lösen.

@css-umsetzung:
Du schreibst: "dass auch spezielle Zeichen gefiltert werden."
Das scheint auch zu stimmen. Ich habe ein Feld mit Umlaute. (Schafthöhe)
In der WAWI wird diese korrekt angezeigt... ein Zugriff im Shop habe ich aber so nicht.
Ist bekannt wie gewisse Zeichen gefiltert werden ?
 

lord_icon

Gut bekanntes Mitglied
21. Juli 2007
198
8
komisch. ich hab mir mal die eigenen Felder ausgeben lassen, die da sind:

Code:
<pre>
{$Artikel->FunktionsAttribute|print_r}

Array
(
   [mögliche größen] => 6-11
...
)

Also DA sind die. Nur die Aussabe dessen scheint nicht zu klappen.

Ideen zur Ausgabe ?
 

lord_icon

Gut bekanntes Mitglied
21. Juli 2007
198
8
oki. Da auch _JTL direkt keine Lösung aufzeigen konnte, musste ich mir mit einer "Quick and dirty" Lösung behelfen.


Ich durchlaufe mittels einer Schleife alle Attribute und konvertiere diese mittels escape:"url" um. Hier kenne ich die umgewandelten Zeichen auswendig.
Damit wird dann ein neuer Variabelnamen gebaut, den ich dann später direkt ansprechen kann.

Code:
{foreach from=$Artikel->FunktionsAttribute key=key item=item}    {* Durchlaufe alle Eigenen_Felder und ersetze alle vorkommenden Sonderzeichen*}
    {assign var="key" value="{$key|replace:" ":"_"|escape:"url"|replace:"%F6":"oe"|replace:"%20":""|replace:"%DF":"ss"|replace:"%E4":"ae"|replace:"%2F":"_"}"}        {* erst Leerzeichen ersetzen, dann escapen und dann die Umlaute umwandeln *}
    {assign var=$key value={$item}}                {* Erzeugt nun eine neue Variable, die dann später direkt ausgelesen werden kann *}

{*    {$key}<br> *}     {* Auskommentieren, wenn Textliche Ausgabe der neuen Variabelnamen erwünscht ist *}
{/foreach}

Dann nur noch die gewünschten Felder in ein array eintragen, die ausgegeben werden sollen.
Der "key" ist der Spaltenname wie er angezeigt werden soll. (z.b. Schuhgröße: )
Der "value" ist der variabel-name, der mittels URL-Escape "umgebaut" worden ist.

Code:
{assign var=array value=[   ...
                           'Absatzh&ouml;he in INCH:'                    => 'absatzhoehein_inch',
                           'Absatzh&ouml;he in CM:'                    => 'absatzhoehe_in_cm_s',
                           'Plateauh&ouml;he in INCH'                   => 'plateauhoehein_inch',
                           'Plateauh&ouml;he in CM'                   => 'plateauhoehe_in_cm_s'
....
                       ]
}
{extends file="{$parent_template_path}/productdetails/attributes.tpl"}
{block name="productdetails-attributes" append}

    <div class="product-attributes">
       <div class="table-responsive">
           <table class="table table-striped table-bordered">
               <tbody>
               {foreach from=$array key=anzeigename item=variable}       {* Durchlaufe nun das array mit den auszugebenen Feldern *}

                   {if ({${$variable}}|@strlen > 0)}                   {* Prüfe, ob die Variable überhaupt gefüllt ist. Wenn nicht, dann überspringen *}
                       <tr class="attr-characteristic">
                           <td class="attr-label">
                               {$anzeigename}
                           </td>
                           <td class="attr-value">
                           {if {$variable} == 'voraussichtlich_lieferbar_ab'} {${$variable}|date_format:"%d.%m.%Y"}
                           {else}
                               {if  $anzeigename == 'absatzh&ouml;he:'} ca. {/if}
                               {${$variable}}
                           {/if}
                     
                           {if $anzeigename == 'absatzh&ouml;he:'} cm{/if}
                           </td>
                       </tr>                     
                   {/if}
               {/foreach}     
               </tbody>
           </table>
       </div>
   </div>
{/block}

Wie gesagt.. nicht schön... aber seeeehr selten ;)

Mitunterbin ich mir fast sicher, das smarty oder jtl sonderzeichen oder umlaute umwandelt.
ODER aber dass es eine zeichencodierungsproblem ist. (?)

Egal. Meine Lösung hab ich. Vlt. kanns ja einer gebrauchen.

Thread kann geschlossen werden (meiner Meinung nach)
 
Zuletzt bearbeitet:

Ähnliche Themen