Wie kann ich in meinem Subscriber auf eine Smarty-Var zugreifen?

Hallo zusammen,

ich bin absoluter Shopware-Neuling und stehe total auf dem Schlauch.

Evtl. gehe ich auch vollkommen falsch an die Sache ran, aber ich habe folgendes vor:

Ich möchte die Shopauswahl im Kopf nur bereitstellen, wenn ich in einem speziellen Kategoriestrang bin. Am einfachsten fand ich es, mir eine Hilfsvariable ins Template zu schreiben, so dass ich die Auswahl nur darstelle, wenn meine Hilfsvariable=true ist. Ich habe mir nun einen ganz simplen Subscriber geschrieben:

 'onFrontendPostDispatch'
    );
  }

  /**
   * Handles the Enlight_Controller_Action_PostDispatchSecure_Frontend.
   *
   * @param \Enlight_Controller_ActionEventArgs $args
   */
  public function onFrontendPostDispatch(\Enlight_Event_EventArgs $args)
  {
    /** @var $controller \Enlight_Controller_Action */
    $view = $args->getSubject()->View();
    $view->assign('meineVar', 'Hier steht Inhalt!');
    echo $view->getAssign('meineVar');
  }

}

Klappt soweit auch ohne Probleme. Das “echo” gibt mir mein “Hier steht Inhalt” wieder. Entsprechend kann ich auch in Smarty die Variable ausgeben.
Um mein Problem aber lösen zu können, wollte ich nun aber das $sMainCategories Array mit $sCategoryCurrent abgleichen. Würde also in dem Array $sMainCategories bei $sCategoryCurrent einsteigen und soweit nach oben laufen, bis ich im root angekommen bin, um dort zu schauen, ob “flag” = true gesetzt ist.

Ich kann aber auf $sMainCategories oder $sCategoryCurrent in meinem Subscriber garnicht zugreifen. Das diese Variablen existieren weiß ich, durch eine {debug}-Ausgabe imSmarty-Template.

$view->getAssign('meineVar'); // funktioniert

$view->getAssign('sMainCategories'); // ist NULL

Ich vermute einfach mal, dass es irgendwie an der Reihenfolge der Events liegen könnte?! Sollte dem so sein, wüsste ich jedoch nicht, was ich anders machen könnte/müsste.

Bin über jeden Ratschlag dank!

Wieso so umständlich? Suche dir doch einfach in den tpl den betreffenden Bereich aus, erstelle eine entsprechende tpl in deinem Theme und packe sowas rein:

{Extends xyz:parentetc}

{block xyz}
  {if $category = n}
    $smarty.block.parent
  {/if}
{/block}

Du willst ja am Code nichts ändern, sondern nur einen Teil der Seite ausblenden, wenn man sich (nicht?) in einer gewissen Kategorie befindet, daher sollte es genügen einfach ein IF darum zu legen.
 

Das Beispiel ist natürlich stark vereinfacht, aber vermutlich geht das immernoch 3x schneller als sich da über PHP einzuklinken und noch umständlich eine Variable zu befüllen und diese dann abzufragen, immerhin hast du in der TPL meist alle Daten die du brauchst als Smarty-Variable ohnehin vorliegen.

Vielen dank für deine Antwort. Grundsätzlich wäre das so kein Problem. Ich möchte allerdings nicht abfragen, ob ich in einer bestimmten Kategorie bin, sondern in einem bestimmten Kategoriestrang.
Ich hab 4 Hauptkategorien, die dann jeweils weitere Unterkategorien haben. Wenn ich in Hauptkategorie 1 oder irgendeiner Unterseite (bis Tiefe X) bin, dann soll der Teil angezeigt werden. Hieße ja (wenn ich hier richtig denke), dass ich den Kategoriebaum aus der Tiefe nach oben bis zur Hauptkategorie laufen müsste, um dann zu schauen, ob meine Hauptkategorie die Hauptkategorie 1 ist. Ich wüsste nicht, wie ich dies in Smarty abbilden kann.

Hauptkategorie 1 (Bereich im Kopf anzeigen)
– Unterkategorie 1.1 (Bereich im Kopf anzeigen)
– Unterkategorie 1.2 (Bereich im Kopf anzeigen)
---- Unterkategorie 1.2.1 (Bereich im Kopf anzeigen)
---- Unterkategorie 1.2.2 (Bereich im Kopf anzeigen)
– Unterkategorie 1.3 (Bereich im Kopf anzeigen)
Hauptkategorie 2 (Bereich im nicht Kopf anzeigen)
– Unterkategorie 2.1 (Bereich im nicht Kopf anzeigen)
– Unterkategorie 2.2 (Bereich im nicht Kopf anzeigen)
---- Unterkategorie 2.2.1 (Bereich im nicht Kopf anzeigen)
---- Unterkategorie 2.2.2 (Bereich im nicht Kopf anzeigen)
– Unterkategorie 2.3 (Bereich im nicht Kopf anzeigen)
Hauptkategorie 3 (Bereich im nicht Kopf anzeigen)
– … (Bereich im nicht Kopf anzeigen)
Hauptkategorie 4 (Bereich im nicht Kopf anzeigen)
– … (Bereich im nicht Kopf anzeigen)

Wann greift denn dein Subscriber?

Glaube die Variable kommt aus dem Advanced Menü, dann musst du vor dem eingreifen. Also ein recht frühes Event nehmen.

du könntest in die bootstrap des Menüs schauen wo dieses registriert wird.

1 Like
// Ermittle die IDs der übergeordneten Kategorien
{assign var="aboveCategories" value=$sCategoryContent.path|explode:"|"}

// Vergleiche ob aktuelle oder Überkategorie zutreffen 
{IF $sCategoryContent.id = "1234" || "1234"|in_array($aboveCategories) }

   

{/IF}

 

 

So in der Richtung dachte ich mir das

1 Like

@PStadtfeld schrieb:

// Ermittle die IDs der übergeordneten Kategorien
{assign var=„aboveCategories“ value=$sCategoryContent.path|explode:"|"}

// Vergleiche ob aktuelle oder Überkategorie zutreffen
{IF $sCategoryContent.id = „1234“ || „1234“|in_array($aboveCategories) }

{/IF}

 

 

So in der Richtung dachte ich mir das

Beinahe! Danke dir. Hab es leicht angepasst, so funktioniert es nun:
 

{assign var="aboveCategories" value="|"|explode:$sCategoryContent.path}

{if $sCategoryContent.id == "1234" || "1234"|in_array:$aboveCategories }
    %hier kopf%
{/if}

 

@Moritz Naczenski schrieb:

Wann greift denn dein Subscriber?

Glaube die Variable kommt aus dem Advanced Menü, dann musst du vor dem eingreifen. Also ein recht frühes Event nehmen.

du könntest in die bootstrap des Menüs schauen wo dieses registriert wird.

Auch wenn ich bereits eine andere, vermutlich einfachere Lösung habe, interessiert mich dein Ansatz jedoch auch noch.

  1. Wieso muss ich FRÜHER eingreifen? Müsste ich nicht entsprechend später eingreifen, damit ich auch auf die Variable zugreifen kann (denn sie muss dann ja schon VOR MIR gesetzt worden sein, oder?

  2. Ich habe mal in die Bootstrap geschaut. Dort sieht es so aus: 

    $this->subscribeEvent(
    ‘Enlight_Controller_Action_PostDispatchSecure_Frontend’,
    ‘onPostDispatch’
    );

Also im Prinzip genau wie bei mir. Woher genau weiß ich denn, wann welches Event greift? Gibt es dort eine Übersicht?
3. Wenn in beiden Fällen das Event “Enlight_Controller_Action_PostDispatchSecure_Frontend” genutzt wird, woher weiß ich in diesem speziellen Fall, welches Event zuerst genutzt wird? 
Ich verstehe noch nicht so richtig den Ablauf mit den Events.

Ich bin kein Entwickler, kann dir nur so beschreiben, wie ich es verstanden habe.

Das „PostDisptachSecure_Frontend“ wird relativ spät im Stack geworfen - bspw. „PostDispatchSecure_Frontend_Controllername“ deutlich früher. In dem Moment hat also das Menü noch garkeine Variablen gesetzt, die man abgreifen könnte. Wenn also PostDistpatchSecure_Frontend" genutzt wird, könntest du noch über einen Parameter steuern, welches Plugin „später“ kommt.

Hier ein Beispiel: MNExtendB2B/MNExtendB2B.php at master · mnaczenski/MNExtendB2B · GitHub

Oder aber das PreDispatchSecure_Frontend nutzen. Wenn es keinen Parameter gibt, ist es immer 0 - du definierst dann über +/- Zahlenwert die Reihenfolge der Plugins. Sollte also schon reichen, wenn du ein zusätzliches „-100“ mit registrierst.