PHP Variable an Smarty übergeben

Hallo Community,

Ich stehe auf dem Schlauch. Ich will in einem Smarty Template mit der aktuellen Kundengruppe des Users arbeiten.

Sprich: Wenn Kundengruppe nicht gleich Gast, zeige blabla.

Ich hab im Hinterkopf irgendetwas von view->assign?
Wie übergebe ich die Variable aus einem Plugin an Smarty? Welches Event muss ich dafür nutzen?

Momentan habe ich folgendes:
Bootstrap:

public function install()
{
	$this->subscribeEvent(
            'Enlight_Controller_Action_PostDispatch_Frontend',
            'postDispatch'
        );

	return true;
}

public function postDispatch(Enlight_Event_EventArgs $args)
{
$view->assign("kundengruppe",Shopware()->System()->sUSERGROUPDATA['groupkey']);
}

und in der tpl:

{if $kundengruppe != "GAST"}
{block name="frontend_detail_tabs_description" append}
{s namespace="frontend/detail/tabs" name='TabDownloadDescription'}{/s}
{/block}
{/if}

Nur leider ist es Shopware egal, ob ich eingeloggt bin oder nicht. Er zeigt den Inhalt immer an.

Grüße Schlueter550v

view->assign() ist schon richtig. An welcher Stelle willst du es denn konkret nutzen?

Fehler:

  1. In deiner Tpl fehtl ein {extends file="…} sonst kannst du nicht „append“ bei einem Block machen
  2. Wenn du eine Datei erweiterst {extends file="…} darf nichts auserhalb von einem Block stehen (=> die if-Abfrage muss innerhlab des Blocks}

Empfehlungen:

  1. Anstelle von append nutze {$smarty.block.parent} Getting started with Smarty

Viele Grüße

Hallo,

@arnebecker‍ ich will es bei der Artikelansicht nutzen. Ein Tab unten soll nur für eingeloggte Kunden sichtbar sein.

@simkli Meinst du so?:

{extends file="parent:frontend/detail/tabs.tpl"}

{* New tab *}
{block name="frontend_detail_tabs_description" append}
{if $kundengruppe != "GAST"}
{s namespace="frontend/detail/tabs" name='TabDownloadDescription'}{/s}
{/if}
{/block}

Das funktioniert leider auch nicht.
stimmt mein Ansatz überhaupt wie ich die Kundengruppe übergebe, oder ist hier was Falsch

$view->assign("kundengruppe",Shopware()->System()->sUSERGROUPDATA['groupkey']);

 

Ja, das sieht besser aus. Eines fehlt noch:

public function postDispatch(Enlight_Event_EventArgs $args)
{
  $subject = $args->getSubject(); // Controller 
  $view = $subject->View(); // View
  $view->assign("kundengruppe",Shopware()->System()->sUSERGROUPDATA['groupkey']);
}

Noch eine Empfehlung:

Enlight_Controller_Action_PostDispatch_Frontend -> Enlight_Controller_Action_PostDispatchSecure_Frontend

Das verhindert, dass dein Code bei Fehlern o.ä. ausgeführt wird.

Viele Grüße

ok ich habe jetzt:

public function install()
{
	$this->subscribeEvent(
            'Enlight_Controller_Action_PostDispatchSecure_Frontend',
            'postDispatch'
        );

	return true;
}

public function postDispatch(Enlight_Event_EventArgs $args)
{
	$subject = $args->getSubject();
    $view=$subject->View();
$view->assign("kundengruppe",Shopware()->System()->sUSERGROUPDATA['groupkey']);
}

und in der tpl:

{extends file="parent:frontend/detail/tabs.tpl"}

{* New tab *}
{block name="frontend_detail_tabs_description" append}
{if $kundengruppe != "GAST"}
{s namespace="frontend/detail/tabs" name='TabDownloadDescription'}{/s}
{/if}
{/block}

{* New Tab container *}

{block name="frontend_detail_tabs_content_description" append}
{if $kundengruppe != "GAST"}

{s namespace="frontend/detail/tabs" name='TabDownloadDescription'}{/s}
{include file="frontend/detail/tabs/download.tpl"}

{/if}
{/block}

in der download.tpl, lass ich mir die $kundengruppe zwischen zwei paragraphs ausgeben.

{$kundengruppe}

Auf der Seite zeigt er dann aber einen leeren Wert an.

Ich weiß leider nicht was in Shopware()->System()->sUSERGROUPDATA[‘groupkey’] drin steht. Vielleich steht da auch einfach nix drin?!?

Du solltest auch beachten, dass die Artikeldetail Seite gecached wird (zumindest im Standard) und du auf der Detailseite nix Kunden-dynamisches einzeigen kannst auf diese Art und Weise. Du müsst mit dem {action} Viewhelper einen Subrequest abfeuern. Die werden nicht gecached und können deine Kunden-dynamischen Informationen in die Seite einbinden.

Hallo Community,

das Problem hat sich gelöst. Die Kundengruppe wurde nach dem Tipp von @simkli‍ übertragen.
Was ich nicht wusste ist, das wenn man nicht eingeloggt ist diese Abfrage einen leeren String zurück gibt.

Wenn ich nun in Smarty:

{if $kundengruppe != ""}

nutze funktioniert alles so wie es soll.

Vielen Dank nochmal an @simkli‍

Beste Grüße

Schlueter550v

Hallo,

wie simkli aber oben schon schreibt: man soll kein append mehr nutzen (auch von Shopware aus), sondern anstelle davon {$smarty.block.parent}, da die Nutzung von append und preprend zu Problemen führen kann.

Und wie arnebecker richtig schreibt, wird deine Lösung auch gecacht, was ja auch nicht Sinn der Sache sein soll, wenn nur bestimmte Kundengruppen oder ähnliches die Downloads sehen dürfen.

Beste Grüße

Sebastian

Hallo,

wie wende ich das {$smarty.block.parent} an, und wie kann ich verhindern, dass es gecacht wird?

Gruß
Schlueter550v

Moin Schlueter,

append

{block name="frontend_detail_tabs_description"}
  {$msarty.block.parent}
  {* deine Erweiterung *}
{/block}

prepend

{block name="frontend_detail_tabs_description"}
  {* deine Erweiterung *}
  {$msarty.block.parent}
{/block}

Und wie man den Cache deaktiviert? Das findet man sehr einfach bei Google. Untschuldigung, aber dieses Forum bietet Hilfe zu Selbsthilfe. Wir können hier keine komplette Lösungen basteln. Wir setzen vorraus, dass ihr Hilfesuchenden mit der Doku, der Dev Doku und Google vertraut seid!

Cache Global deaktivieren (nicht empfohlen): http://community.shopware.com/Cache-Performance-Modul_detail_845.html#Start

Hier kannst du nur die ADS (frontendt/detail) aus dem Cache nehmen (ebenfalls nicht empfohlen): http://community.shopware.com/Cache-Performance-Modul_detail_845.html#HTTP-Cache_aktivieren_und_konfigurieren

So kannst dus richtig machen: On action tags

 

Ok ich hab jetzt verstanden, dass ich mit dem Smarty {action} tag eine Abfrage ohne Cache auslösen kann. Aber welchen controller und Action muss ich angeben?

wäre controller=frontend und action=detail?

So wie ich das sehe brauchst du dir um den Cache keine Gedanken zu machen. Die Kundengruppe ist bereits ein Cache-Key. D.h. pro Kundengruppe wird ein separater Cache angelegt. Problematisch würde es werden, wenn du auch noch spezielle Daten von Kunden wie z.B. Name oder Vorname abfragen würdest. Diese stehen dir nämlich im Cache nicht zur Verfügung. Hast du den überhaupt Caching-Probleme?

Viele Grüße

Du müsstest dir selber einen Controller mit eigener Action schreiben. In das Template der Action muss das hier rein. Sprich das Ergebniss deiner Action:

{if $kundengruppe != "GAST"}
  {s namespace="frontend/detail/tabs" name='TabDownloadDescription'}{/s}
{/if}

Und das Ergebniss des Controller bindest du so ein:

{block name="frontend_detail_tabs_description" append}
{action controller=deinController action=deineAction}
{/block}

 

hmm nicht das ich wüsste. Es ergibt sich aber gerade ein anderes Problem:

mittels view->assign habe ich ja die kundengruppe übergeben. Dies funktioniert nur leider nicht bei der Startseite. In welchem Event muss ich nochmals ein view->assign ausführen?
Gibt es ne Liste mit den ganzen Shopware Events? In der DevDoku finde ich nicht viel passendes außer ein paar Beispielen.

Du verwendest ja Enlight_Controller_Action_PostDispatchSecure_Frontend. Der wird bei jedem Frontend Request gefeuert. Also auch bei der Startseite. Sollte also eigtl richtig sein!

Kann es sein das du zwischezeitlich ausgeloggt wurdest?

Was ich nicht wusste ist, das wenn man nicht eingeloggt ist diese Abfrage einen leeren String zurück gibt.

Früher zu SW4 Zeiten gab es auch mal eine Übersicht mit allen Events. Die gibts aber inzwischen nicht mehr. Jetzt findest man sie nur noch wenn man durch den Shopware Code scrollt oder im Code nach den Stichworten filter(, notifiy( oder notifyUntil( suchst.