letzte Bestellposition ermitteln

gerfriedd

Offizieller Servicepartner
SPBanner
20. Januar 2010
133
12
Hi @all

Folgendes Szenario:
Ich benötige in einer {if} Anweisung auf die letzte Bestellposition

Code:
    {if $Bestellung->kBestellung > 0 && $nSeitenTyp == 33 && $Einstellungen.global.global_google_ecommerce == 1}    <script>
    dataLayer = [{
            'transactionId': '{$Bestellung->cBestellNr}',
            'transactionAffiliation': '{if $Einstellungen.global.global_shopname}{$Einstellungen.global.global_shopname}{else}{$Firma->cName}{/if}',
            'transactionTotal': '{$Bestellung->fWarensummeNetto}',
            'transactionTax': '{$Bestellung->fSteuern}',
            'transactionShipping': '{$Bestellung->fVersandNetto}',
            'transactionProducts': [
            {foreach name=Bestell item=order from=$Bestellung->Positionen} 
                      {if $order->nPosTyp == 1}
            {
                'sku': '{$order->cArtNr}',
                'name': '{$order->cName}',
                'category': '{$order->Category}',
                'price': '{$order->fPreis}',
                'quantity': '{$order->nAnzahl|replace:",":"."}'
                },
                      {/if} 
                  {/foreach}
        ]
    }];
    </script>
    {/if}

Bei der letzten Bestellposition muss allerdings das letzte Komma entfernt werden.
 

tom10

Sehr aktives Mitglied
2. Oktober 2012
714
107
06774 Muldestausee
AW: letzte Bestellposition ermitteln

Siehe hier: {foreach}, {foreachelse} | Smarty

Foreach-Loops haben auch eigene Variablen welche die Foreach Eigenschaften enthalten. Diese werden wie folgt ausgewiesen: {$smarty.foreach.foreachname.varname}. foreachname ist der Name der als name Attribut von Foreach übergeben wurden.
iteration
gibt die aktuelle iteration aus
iteration beginnt immer mit 1 und wird danach bei jedem durchgang um 1 inkrementiert.

first
first ist TRUE wenn die aktuelle Iteration die erste ist

last
last ist TRUE wenn die aktuelle Iteration die letzte ist


show
show wird als Parameter von foreach verwedet und ist ein boolscher Wert, TRUE oder FALSE. Auf FALSE wird nichts ausgegeben und wenn foreachelse gefunden wird, dieser angezeigt.

total
total gibt die Anzahl Iterationen des Foreach Loops aus und kann in- oder nach- Foreach Blöcken verwendet werden.
 

gerfriedd

Offizieller Servicepartner
SPBanner
20. Januar 2010
133
12
AW: letzte Bestellposition ermitteln

@tom10 - Vielen Dank

Habe den Code dementsprechend angepasst und es ergibt sich eine neue Frage:

Ich muss anscheinend einen Teil meines Codes in {literal},{/literal} oder noch besser {ldelim}, {rdelim} setzen

Derzeit werden mir die Smarty Variablen ( so wie es auch nachzulesen ist ) nicht ausgegeben:

Code:
	{if $Bestellung->kBestellung > 0 && $nSeitenTyp == 33 && $Einstellungen.global.global_google_ecommerce == 1}
	{literal}
	<script type="text/javascript">
	dataLayer = [{
    		'transactionId': '{$Bestellung->cBestellNr}',
    		'transactionAffiliation': '{if $Einstellungen.global.global_shopname}{$Einstellungen.global.global_shopname}{else}{$Firma->cName}{/if}',
    		'transactionTotal': '{$Bestellung->fWarensummeNetto}',
    		'transactionTax': '{$Bestellung->fSteuern}',
    		'transactionShipping': '{$Bestellung->fVersandNetto}',
    		'transactionProducts': [
		    {foreach name=Bestell item=order from=$Bestellung->Positionen} 
                  	{if $order->nPosTyp == 1}
			{
        		'sku': '{$order->cArtNr}',
        		'name': '{$order->cName}',
        		'category': '{$order->Category}',
        		'price': '{$order->fPreis}',
        		'quantity': '{$order->nAnzahl|replace:",":"."}'
    			}
			{if not $smarty.foreach.Bestell.last},{/if}
                  	{/if} 
                  {/foreach}
		]
	}];
	</script>
	{/literal}
	{/if}

Lasse ich {literal},{/literal} weg läuft die Seite auf einen Fehler.

Ich vermute wegen:

dataLayer = [{

Wo setzte ich also {literal},{/literal oder besser {ldelim}, {rdelim} genau?

Vielen Dank im voraus
 

tom10

Sehr aktives Mitglied
2. Oktober 2012
714
107
06774 Muldestausee
AW: letzte Bestellposition ermitteln

So sollte es passen:

Code:
    {if $Bestellung->kBestellung > 0 && $nSeitenTyp == 33 && $Einstellungen.global.global_google_ecommerce == 1}
    <script type="text/javascript">
    dataLayer = [[B]{ldelim}[/B]
            'transactionId': '{$Bestellung->cBestellNr}',
            'transactionAffiliation': '{if $Einstellungen.global.global_shopname}{$Einstellungen.global.global_shopname}{else}{$Firma->cName}{/if}',
            'transactionTotal': '{$Bestellung->fWarensummeNetto}',
            'transactionTax': '{$Bestellung->fSteuern}',
            'transactionShipping': '{$Bestellung->fVersandNetto}',
            'transactionProducts': [
            {foreach name=Bestell item=order from=$Bestellung->Positionen} 
                      {if $order->nPosTyp == 1}
            {
                'sku': '{$order->cArtNr}',
                'name': '{$order->cName}',
                'category': '{$order->Category}',
                'price': '{$order->fPreis}',
                'quantity': '{$order->nAnzahl|replace:",":"."}'
                }
            {if not $smarty.foreach.Bestell.last},{/if}
                      {/if} 
                  {/foreach}
        ]
    [B]{rdelim}[/B]];
    </script>
    {/if}
 

gerfriedd

Offizieller Servicepartner
SPBanner
20. Januar 2010
133
12
AW: letzte Bestellposition ermitteln

@tom

Vielen Dank für die schnelle Antwort - passt leider doch nicht.

Weiße Seite beim Aufruf
Auch mit { einbinden nicht

Code:
<body class="page_type_{$nSeitenTyp}{if $oBrowser->nType > 0} browser_type_{$oBrowser->cBrowser}{/if}">


	{if $Bestellung->kBestellung > 0 && $nSeitenTyp == 33 && $Einstellungen.global.global_google_ecommerce == 1}
	<script type="text/javascript">
	dataLayer = [{{ldelim}
    		'transactionId': '{$Bestellung->cBestellNr}',
    		'transactionAffiliation': '{if $Einstellungen.global.global_shopname}{$Einstellungen.global.global_shopname}{else}{$Firma->cName}{/if}',
    		'transactionTotal': '{$Bestellung->fWarensummeNetto}',
    		'transactionTax': '{$Bestellung->fSteuern}',
    		'transactionShipping': '{$Bestellung->fVersandNetto}',
    		'transactionProducts': [
		    {foreach name=Bestell item=order from=$Bestellung->Positionen} 
                  	{if $order->nPosTyp == 1}
			{
        		'sku': '{$order->cArtNr}',
        		'name': '{$order->cName}',
        		'category': '{$order->Category}',
        		'price': '{$order->fPreis}',
        		'quantity': '{$order->nAnzahl|replace:",":"."}'
    			}
			{if not $smarty.foreach.Bestell.last},{/if}
                  	{/if} 
                  {/foreach}
		]
	{rdelim}}];
	</script>
	{/if}
	{literal}
	<!-- Google Tag Manager -->
	<noscript>
		<iframe src="//www.googletagmanager.com/ns.html?id=GTM-MGC9CK" height="0" width="0" style="display:none;visibility:hidden"></iframe>
	</noscript>
       <script type="text/javascript">
		(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});
			var f=d.getElementsByTagName(s)[0],
			j=d.createElement(s),
			dl=l!='dataLayer'?'&l='+l:'';
			j.async=true;
			j.src='//www.googletagmanager.com/gtm.js?id='+i+dl;
			f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-MGC9CK');
	</script>
	<!-- End Google Tag Manager -->
	{/literal}
<div id="page"{if $bExclusive} class="exclusive"{/if}>

Ich habe jetzt einmal den gesamten Code Teil gepostet ( wo dieser auch platziert ist )
 

gerfriedd

Offizieller Servicepartner
SPBanner
20. Januar 2010
133
12
AW: letzte Bestellposition ermitteln

Korrektur:

{ldelim} und {rdelim} an 2 Stellen einfügen!

Code:
	{if $Bestellung->kBestellung > 0 && $nSeitenTyp == 33 && $Einstellungen.global.global_google_ecommerce == 1}
	<script type="text/javascript">
	dataLayer = [{ldelim}
    		'transactionId': '{$Bestellung->cBestellNr}',
    		'transactionAffiliation': '{if $Einstellungen.global.global_shopname}{$Einstellungen.global.global_shopname}{else}{$Firma->cName}{/if}',
    		'transactionTotal': '{$Bestellung->fWarensummeNetto}',
    		'transactionTax': '{$Bestellung->fSteuern}',
    		'transactionShipping': '{$Bestellung->fVersandNetto}',
    		'transactionProducts': [
		    {foreach name=Bestell item=order from=$Bestellung->Positionen} 
                  	{if $order->nPosTyp == 1}
			{ldelim}
        		'sku': '{$order->cArtNr}',
        		'name': '{$order->cName}',
        		'category': '{$order->Category}',
        		'price': '{$order->fPreis}',
        		'quantity': '{$order->nAnzahl|replace:",":"."}'
    			{rdelim}
			{if not $smarty.foreach.Bestell.last},{/if}
                  	{/if} 
                  {/foreach}
		]
	{rdelim}];
	</script>
	{/if}
 

gerfriedd

Offizieller Servicepartner
SPBanner
20. Januar 2010
133
12
AW: letzte Bestellposition ermitteln

allerdings funktioniert

{if not $smarty.foreach.Bestell.last},{/if}

nicht

Ausgabe ist:

Code:
    dataLayer = [{
            'transactionId': 'SH-10197',
            'transactionAffiliation': 'mein Shop',
            'transactionTotal': '10.427394958',
            'transactionTax': '3.08428571429',
            'transactionShipping': '5.79831932773',
            'transactionProducts': [
             
                                  {
                'sku': '100058',
                'name': 'Leitungsfilter 11 mm - 11 mm Gasphase',
                'category': 'Einzelteile',
                'price': '4.48739495798',
                'quantity': '1'
                }
            ,                       
                   
                                  {
                'sku': '100390',
                'name': 'Filtereinsatz Valtek Flüssigphase',
                'category': 'Einzelteile',
                'price': '2.97',
                'quantity': '2'
                }
            ,                       
                   
                       
                          ]
    }];

das letzt , nach der letzen Bestellposition muss halt das Komma entfernt werden
 

gerfriedd

Offizieller Servicepartner
SPBanner
20. Januar 2010
133
12
AW: letzte Bestellposition ermitteln

auch nicht :)-

Code:
{if !$smarty.foreach.Bestell.last},{/if}

immer noch wird nach der letzen Bestellposition ein Komma ausgegeben

Nachtrag:

Ein $smarty.foreach.last == false geht auch nicht
 

tom10

Sehr aktives Mitglied
2. Oktober 2012
714
107
06774 Muldestausee
AW: letzte Bestellposition ermitteln

Hast du schon mal die Gegenprobe, also die Prüfung gegen true, ausprobiert?
Warst du schon mal auf Fehlersuche? Z.B. mal total gegen die anzahl der tatsächlichen durchläufe (iteration) prüfen.
 

martinwolf

Offizieller Servicepartner
SPBanner
6. September 2012
3.385
262
AW: letzte Bestellposition ermitteln

Du hast einen Denkfehler. Du berücksichtigst lediglich alle Positionen vom Typ 1. Dennoch sind auch die Versandkosten (Typ 2) innerhalb der foreach existent. Ergo triffst du deine Anweisung {if not $smarty.foreach.Bestell.last},{/if} nicht. Du müsstest von der Menge deiner Positionen - 1 abziehen und mit dem Index innerhalb der foreach vergleichen:

Code:
{if $smarty.foreach.Bestell.index < $smarty.foreach.Bestell|@count - 1},{/if}
 

tom10

Sehr aktives Mitglied
2. Oktober 2012
714
107
06774 Muldestausee
AW: letzte Bestellposition ermitteln

martinwolf hat recht, hab ich garnicht drauf geachtet.
Da es aber auch noch Geschenke, Kupons, Gebühren usw. gibt, ist es vielleicht ratsam, dass ganze andersrum aufzubauen. Nach dem ersten Durchlauf das Komma als erstes ausgeben. Also inetwa so:
Code:
    {if $Bestellung->kBestellung > 0 && $nSeitenTyp == 33 && $Einstellungen.global.global_google_ecommerce == 1}
    <script type="text/javascript">
    dataLayer = [{ldelim}
            'transactionId': '{$Bestellung->cBestellNr}',
            'transactionAffiliation': '{if $Einstellungen.global.global_shopname}{$Einstellungen.global.global_shopname}{else}{$Firma->cName}{/if}',
            'transactionTotal': '{$Bestellung->fWarensummeNetto}',
            'transactionTax': '{$Bestellung->fSteuern}',
            'transactionShipping': '{$Bestellung->fVersandNetto}',
            'transactionProducts': [
            {foreach name=Bestell item=order from=$Bestellung->Positionen} 
            {if $order->nPosTyp == 1}
            [COLOR=#b22222]{if !$smarty.foreach.Bestell.first},{/if}[/COLOR]
            {ldelim}
                'sku': '{$order->cArtNr}',
                'name': '{$order->cName}',
                'category': '{$order->Category}',
                'price': '{$order->fPreis}',
                'quantity': '{$order->nAnzahl|replace:",":"."}'
            {rdelim}
            {/if} 
                  {/foreach}
        ]
    {rdelim}];
    </script>
    {/if}
Das funktioniert aber nur, wenn ein normaler Artikel (nPosTyp 1) als erstes in $Bestellung->Positionen steht. Ob das irgendwann eventuell nicht so ist, kann ich nicht sagen.
 

gerfriedd

Offizieller Servicepartner
SPBanner
20. Januar 2010
133
12
AW: letzte Bestellposition ermitteln

Hi Ihr beiden.

Vielen Dank fürs "mitwirken"

Hat jetzt endlich funktioniert @martinwolf

Hintergrund der Aktion:

Einbau Google Analytics Code mit E-Commerce Tracking für den Google Tag Manager

Folgende Vorgabe bestand ( Beispiel):

Code:
[COLOR=#000000]<script>[/COLOR]
[COLOR=#000000]dataLayer = [{[/COLOR]
[COLOR=#000000]    'transactionId': '1234',[/COLOR]
[COLOR=#000000]    'transactionAffiliation': 'mein Shop',[/COLOR]
[COLOR=#000000]    'transactionTotal': '11.99',[/COLOR]
[COLOR=#000000]    'transactionTax': '1.29',[/COLOR]
[COLOR=#000000]    'transactionShipping': '5',[/COLOR]
[COLOR=#000000]    'transactionProducts': [{[/COLOR]
[COLOR=#000000]        'sku': 'DD44',[/COLOR]
[COLOR=#000000]        'name': 'T-Shirt',[/COLOR]
[COLOR=#000000]        'category': 'Apparel',[/COLOR]
[COLOR=#000000]        'price': '11.99',[/COLOR]
[COLOR=#000000]        'quantity': '1'[/COLOR]
[COLOR=#000000]    },{[/COLOR]
[COLOR=#000000]        'sku': 'AA1243544',[/COLOR]
[COLOR=#000000]        'name': 'Socks',[/COLOR]
[COLOR=#000000]        'category': 'Apparel',[/COLOR]
[COLOR=#000000]        'price': '9.99',[/COLOR]
[COLOR=#000000]        'quantity': '2'[/COLOR]
[COLOR=#000000]    }][/COLOR]
[COLOR=#000000]}];[/COLOR]

[COLOR=#000000]</script>
[/COLOR][/FONT][FONT=arial][FONT=arial]<!-- Google Tag Manager -->
[/FONT][/FONT]
[FONT=arial][FONT=arial]<noscript>
[/FONT][FONT=arial, helvetica, sans-serif]
[FONT=arial]		<iframe src="//www.googletagmanager.com/ns.html?id=GTM-MGC9CK" height="0" width="0" style="display:none;visibility:hidden"></iframe>[/FONT]
[/FONT][FONT=arial]</noscript>
[/FONT][FONT=arial, helvetica, sans-serif]
[FONT=arial]<script type="text/javascript">[/FONT]
[FONT=arial]		(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});[/FONT]
[FONT=arial]			var f=d.getElementsByTagName(s)[0],[/FONT]
[FONT=arial]			j=d.createElement(s),[/FONT]
[FONT=arial]			dl=l!='dataLayer'?'&l='+l:'';[/FONT]
[FONT=arial]			j.async=true;[/FONT]
[FONT=arial]			j.src='//www.googletagmanager.com/gtm.js?id='+i+dl;[/FONT]
[FONT=arial]			f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-MGC9CK');[/FONT]
[FONT=arial]</script>[/FONT]
[FONT=arial]<!-- End Google Tag Manager -->[/FONT]

[/FONT]
[/FONT]
[FONT=arial]
 
Ähnliche Themen

Ähnliche Themen