schlueter550vschlueter550v MitgliedKommentare: 18 Danke erhalten: 0 Mitglied seit: 29. Juni bearbeitet 14. November

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}
<a class="tab--link" title="{s namespace="frontend/detail/tabs" name='TabDownload'}{/s}" href="#">{s namespace="frontend/detail/tabs" name='TabDownloadDescription'}{/s}</a>
{/block}
{/if}

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

Grüße Schlueter550v

1 Antwort

  • simklisimkli MitgliedKommentare: 646 Danke erhalten: 236 Mitglied seit: Februar 2014

    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} https://developers.shopware.com/designers-guide/smarty/#blocks

    Viele Grüße

    Zitieren
    Akzeptierte Antwort
  • Akzeptierte Antwort

Antworten

  • arnebeckerarnebecker MitgliedKommentare: 212 Danke erhalten: 42 Mitglied seit: 28. Juni

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

  • simklisimkli MitgliedKommentare: 646 Danke erhalten: 236 Mitglied seit: Februar 2014

    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} https://developers.shopware.com/designers-guide/smarty/#blocks

    Viele Grüße

    Zitieren
    Akzeptierte Antwort
  • schlueter550vschlueter550v MitgliedKommentare: 18 Danke erhalten: 0 bearbeitet 14. November Mitglied seit: 29. Juni

    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"}
    <a class="tab--link" title="{s namespace="frontend/detail/tabs" name='TabDownload'}{/s}" href="#">{s namespace="frontend/detail/tabs" name='TabDownloadDescription'}{/s}</a>
    {/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']);

     

  • simklisimkli MitgliedKommentare: 646 Danke erhalten: 236 Mitglied seit: Februar 2014

    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

  • schlueter550vschlueter550v MitgliedKommentare: 18 Danke erhalten: 0 bearbeitet 14. November Mitglied seit: 29. Juni

    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"}
    <a class="tab--link" title="{s namespace="frontend/detail/tabs" name='TabDownload'}{/s}" href="#">{s namespace="frontend/detail/tabs" name='TabDownloadDescription'}{/s}</a>
    {/if}
    {/block}
    
    {* New Tab container *}
    
    {block name="frontend_detail_tabs_content_description" append}
    {if $kundengruppe != "GAST"}
    <div class="tab--container">
    <div class="tab--header"><a class="tab--title" title="{s namespace="frontend/detail/tabs" name='TabDownloadDescription'}{/s}" href="#">{s namespace="frontend/detail/tabs" name='TabDownloadDescription'}{/s}</a></div>
    <div class="tab--content">{include file="frontend/detail/tabs/download.tpl"}</div>
    </div>
    {/if}
    {/block}

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

    <p>
    {$kundengruppe}
    </p>

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

  • arnebeckerarnebecker MitgliedKommentare: 212 Danke erhalten: 42 Mitglied seit: 28. Juni

    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.

  • schlueter550vschlueter550v MitgliedKommentare: 18 Danke erhalten: 0 Mitglied seit: 29. Juni

    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

  • sschreiersschreier MitgliedKommentare: 2182 Danke erhalten: 536 Mitglied seit: August 2014

    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

  • schlueter550vschlueter550v MitgliedKommentare: 18 Danke erhalten: 0 Mitglied seit: 29. Juni

    Hallo,

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

    Gruß
    Schlueter550v

  • arnebeckerarnebecker MitgliedKommentare: 212 Danke erhalten: 42 Mitglied seit: 28. Juni

    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: https://developers.shopware.com/blog/2016/07/11/on-action-tags/

     

  • schlueter550vschlueter550v MitgliedKommentare: 18 Danke erhalten: 0 bearbeitet 17. November Mitglied seit: 29. Juni

    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?

  • simklisimkli MitgliedKommentare: 646 Danke erhalten: 236 Mitglied seit: Februar 2014

    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

  • arnebeckerarnebecker MitgliedKommentare: 212 Danke erhalten: 42 Mitglied seit: 28. Juni

    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"}
      <a class="tab--link" title="{s namespace="frontend/detail/tabs" name='TabDownload'}{/s}" href="#">{s namespace="frontend/detail/tabs" name='TabDownloadDescription'}{/s}</a>
    {/if}

    Und das Ergebniss des Controller bindest du so ein:

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

     

  • schlueter550vschlueter550v MitgliedKommentare: 18 Danke erhalten: 0 Mitglied seit: 29. Juni

    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.

  • arnebeckerarnebecker MitgliedKommentare: 212 Danke erhalten: 42 Mitglied seit: 28. Juni

    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.

Anmelden oder Registrieren, um zu kommentieren.