Welcher Controller ist der Richtige

Hallo Leute,

ich bin ganz neu hier und ich hab ein Problem mit meinem Plugin. Ziel ist es die Preise pro Einheit 3stellig darzustellen. Im Template hat es gut funktioniert, nun wollte ich aber ein Plugin machen, das das gleiche tut und scheitere scheinbar an den Controllern. Meine Bootstrap.php sieh wie folgt aus:

subscribeEvent(
			'Enlight_Controller_Action_PostDispatch_Frontend_Detail',
			'onPostDispatchContent'
		);
	  	  
		$this->subscribeEvent(
			'Enlight_Controller_Action_PostDispatchSecure_Widgets_Index',
			'onPostDispatchContent'
		);
	  
		$this->subscribeEvent(
			'Enlight_Controller_Action_PostDispatchSecure_Widgets_Listing',
			'onPostDispatchContent'
		);
	  
		$this->subscribeEvent(
			'Enlight_Controller_Action_PostDispatchSecure_Widgets_Emotion',
			'onPostDispatchContent'
		);
	  	  
		return true;
	}
	
	public function onPostDispatchContent(Enlight_Event_EventArgs $arguments) {
	  $view = $arguments->getSubject()->View();
	  $view->addTemplateDir($this->Path() . 'frontend/');
	  $view->extendsTemplate('changes/block_price.tpl');
	  $view->extendsTemplate('changes/data.tpl');
	  $view->extendsTemplate('changes/product-price-unit.tpl');
	}
	 
}

Leider wird nur die “block_price.tpl” aus dem Verzeichnis “detail” überschrieben und bei den Block-Preisen hab ich 3 Nachkommastellen. Aber in den Boxen oder beim Topseller etc. bleibt es bei  2 Stellen nach dem Komma.

Wie gesagt, der Code in den drei .tpl Dateien ist identisch mit denen in meinem Template wo es funktioniert hat. Hier aber wird er gar nicht erst ausgeführt. Ich nehme daher an ich brauche andere Controller in meinem subscribe aber ich weiß nicht welche …

Kann jmd. helfen?

Du solltest dich mit dem „neuen“ Plugin-System von Shopware 5 vertraut machen: https://developers.shopware.com/plugin-guide/

Viel Erfolg,

Geert

Vielen Dank für den Link. Ich werds vielleicht im nächsten Anlauf damit versuchen.

Fürs Listing fehlt dir das Event Enlight_Controller_Action_PostDispatchSecure_Frontend_Listing.
Wie sieht denn dein Template aus? Wenn alle drei Datein den gleiche Inhalt haben, dann funktionierts in den Produktboxen nicht, weil du nicht den richtigen Block überschreibst

Hi,

danke ür die Antwort, aber es functioniert trotzdem nicht. Ich überschreibe bspws. in der Datei data.tpl folgendes, damit bekomme ich drei Nachkommastellen und die Währung.

{* Unit price is based on a reference unit *}
{if $sArticle.purchaseunit && $sArticle.referenceunit && $sArticle.purchaseunit != $sArticle.referenceunit && !$sArticle.sBlockPrices}

 {* Reference unit price content *}
 {block name='frontend_detail_data_price_unit_reference_content'}

  {assign var="ppe" value=$sArticle.referenceunit* ($sArticle.price_numeric/$sArticle.purchaseunit)}
  {assign var="ppestring" value=$ppe|string_format:"%.3f"}
  {assign var="currsymi" value=0}
  {assign var="currsym" value="{$currsymi|currency}"}
  {$currsym=$currsym|replace:"0":""}
  {$currsym=$currsym|replace:",":""}
  {$currsym=$currsym|replace:" ":""}
  {$currsym=$currsym|replace:".":""}
 				
  ({$ppestring|replace:".":","} {$currsym} {s name="Star" namespace="frontend/listing/box_article"}{/s}

  / {$sArticle.referenceunit} {$sArticle.sUnit.description})

 {/block}
{/if}

Wenn ich das ins Theme schreibe, dann funktioniert es einwandfrei. Hier im Plugin wird nur die block_price.tpl überschrieben. Ich verstehe daher nicht wieso die anderen beiden Dateien, die im Theme funzen hier unangetastet bleiben.

Die product-price-unit.tpl hab ich auch komplett übernommen und darin Änderungen vorgenommen.

{namespace name="frontend/listing/box_article"}

{$tooltip = "{s name='ListingBoxArticleContent'}{/s}"|escape:'html'}
{$hasPurchaseUnit = $sArticle.purchaseunit && $sArticle.purchaseunit != 0}
{$hasReferenceUnit = $sArticle.purchaseunit && $sArticle.referenceunit && $sArticle.purchaseunit != $sArticle.referenceunit}

{if $hasPurchaseUnit}
    {$purchaseUnit = "{$sArticle.purchaseunit} {$sArticle.sUnit.description}"}
    {$tooltip = "{$tooltip} {$purchaseUnit|escape:'html'}"}
{/if}

{if $hasReferenceUnit}
	{assign var="ppe" value=$sArticle.referenceunit*($sArticle.price_numeric/$sArticle.purchaseunit)}
	{assign var="ppestring" value=$ppe|string_format:"%.3f"}
	{assign var="currsymi" value=0}
	{assign var="currsym" value="{$currsymi|currency}"}
	{$currsym=$currsym|replace:"0":""}
	{$currsym=$currsym|replace:",":""}
	{$currsym=$currsym|replace:" ":""}
	{$currsym=$currsym|replace:".":""}
    {$price = "{$sArticle.referenceprice|currency}"}
    {$unit = "{s name='Star'}{/s} / {$sArticle.referenceunit} {$sArticle.sUnit.description}"}
    {$referenceUnit = "({$ppestring} {$currsym} {$unit|escape:'html'})"}
    {$tooltip = "{$tooltip} {$referenceUnit}"}
	

{/if}



    {* Price is based on the purchase unit *}
    {if $hasPurchaseUnit}

        {* Unit price label *}
        {block name='frontend_listing_box_article_unit_label'}
            
                {s name="ListingBoxArticleContent"}{/s}
            
        {/block}

        {* Unit price content *}
        {block name='frontend_listing_box_article_unit_content'}
            
                {$purchaseUnit}
            
        {/block}
    {/if}

    {* Unit price is based on a reference unit *}
    {if $hasReferenceUnit}

        {* Reference unit price content *}
        {block name='frontend_listing_box_article_unit_reference_content'}
            
                {$referenceUnit}
            
        {/block}
    {/if}

Und wie bereits erwähnt: Alle drei Datein in richtige Verzeichnis des Themes gespeichert und alles funktioniert. Hier im Plugin Fehlanzeige. Es werden die originalen Dateien benutzt nicht meine veränderten.

Leg mal deine überschriebenen Dateien in der gleichen Ordnerstruktur ab wie die Originale, also z.B. frontend/detail/index.tpl liegt dann unter MeinPlugin/Resources/Views/frontend/detail/index.tpl. Dann überarbeite deinen Subscriber, dass du nur noch in Enlight_Controller_Action_PostDispatchSecure_Frontend und Enlight_Controller_Action_PostDispatchSecure_Widgets hängst und mach da drin nur ein $args->getSubject()->View()->addTemplateDir(‘pfad/zu/deinen/Templates’);. Damit sagst du, egal was im Frontend passiert, da liegen Templates. Ab Shopware 5 werden die Templates, wenn die den originalen Pfad nachbilden, automatisch geladen. Und in deinen Templates überschreib nicht alles, sondern nur den einen Block, den du wirklich brauchst.

Hi,

vielen Dank, vielleicht klappt es so. Ich geb Bescheid :wink:

Also damit funktioniert es dann leider gar nicht mehr. Aber ich habe bemerkt Enlight_Controller_Action_PostDispatchSecure_Frontend genügt für die block-price.tpl. Die anderen werden nach wie vor ignoriert.

Ich habs zwar gelöst, verstehe aber immer noch nicht den Fehler. Der Code aus product-price-unit.tpl steht bei mir jetzt in box-basic.tpl, statt dem inlcude. Denn box-basic.tpl wird geladen im Gegensatz zu product-price-unit.tpl — nur warum ist das so???

Die Bootstrap.php sieht jetzt so aus:

subscribeEvent(
			'Enlight_Controller_Action_PostDispatchSecure_Frontend',
			'onPostDispatchContent'
		);
	  	  	  	  
	  	  
		return true;
	}
	
	public function onPostDispatchContent(Enlight_Event_EventArgs $arguments) {
	  $view = $arguments->getSubject()->View();
	  $view->addTemplateDir($this->Path() . 'frontend/');
	  $view->extendsTemplate('detail/block_price.tpl');
	  $view->extendsTemplate('detail/data.tpl');
	  $view->extendsTemplate('listing/product-box/box-basic.tpl');
	}
	 
}

Und die 3 tpl’s werden geladen.