evtl. Problem mit Freitext seit ca. 5.2.26

Hallo,

ich wende mich ja nicht sooo oft mit einem Problem ans Forum, nun ist es aber mal wieder nötig  Wearing-Sunglasses
Schon für 4.3.xx hatte ich mir ein kleines Plugin gebastelt, mit dem ich mir zusätzliche Tabs in die Detail-Ansicht bei Bedarf einblende - Inhalt über Freitext gesteuert.
Bis gefühlt 5.2.24 hatte ich damit keine Probleme - jetzt mit 5.2.26 fehlen mir immer wieder diese Tabs. Lösche ich den Cache und lade die Seite neu oder baue den Cache neu auf, sind die Tabs wieder da, ich kann das „Verschwinden“ nicht reproduzieren. Und dann am nächsten Tag sind manchmal wieder in allen betroffenen Artikeln die Tabs weg. Einzig nachts wird per Cron der http-cache geleert. Aus irgend einen Grund wird entweder unter bestimmen Bedingungen das Plugin nicht geladen, das Template nicht eingebunden oder dem Plugin die Freitextfelder nicht übergeben.

Hat sich irgend etwas um 5.2.26 ausser Smarty noch etwas geändert, was Plugin - Theme oder Freitext-Attribute betrifft?
Keine Error-Logs - nix dergleichen - habe zum ersten Mal richtig große ??? bei SW - hat es doch 2 1/2 Jahre funktioniert  Wink

Fragemente bootstrap
 

public function install()
    {
        $this->createConfiguration();
 
        $this->subscribeEvent(
            'Enlight_Controller_Action_PostDispatch_Frontend_Detail',
            'onPostDispatchDetail'
        );
		
		.....
    }

.....

  public function onPostDispatchDetail(Enlight_Event_EventArgs $arguments)
    {
	
		/**@var $controller Shopware_Controllers_Frontend_Detail*/
		$controller = $arguments->getSubject();
		$view = $controller->View();
		
        $config = $this->Config()->toArray();
        $sArticle = $view->getAssign('sArticle');
        $dataseta = array();
		$datasetb = array();
		$datasetemotion = array();
		$mflag = false;
        
        for($i = 1; $i < 4; $i++) {
            $key = 'tab' . $i;
            $atrvalue=trim($sArticle[$config[$key]]);
			if (isset($tabcontent)) unset($tabcontent);
			
			switch ($config[$key . '-type']) {
				case "content"	:	$tabcontent=$this->collectSiteContent($atrvalue);
									break;
				case "text" : $tabcontent=$atrvalue != "" ? $atrvalue : false;
									break;
				case "video" :	$tabcontent=$this->getVideoLink($atrvalue);
									break;
				default: break;
			}
			
			if ($tabcontent) {
				$mflag=true;
				$tmpdataset = array( 'type' => $config[$key . '-type']=="video"?"video":"content",
									 'poster' => $config[$key . '-poster'],
									 'headline' => $config[$key . '-headline'], 
									 'content' => $tabcontent);
				
				$datasetemotion[$key] = $tmpdataset; //altes Emotion-Template
				
				switch ($config[$key . '-position']) {
					case 'a' : $dataseta[$key] = $tmpdataset; break;
					case 'b' : $datasetb[$key] = $tmpdataset; break;
					default : break;
                }
            }
        }
		
		if ($mflag === true) {
        
			//Add our plugin template directory
			if (Shopware()->Shop()->getTemplate()->getVersion() >= 3) {
				$view->addTemplateDir($this->Path() . 'Views/responsive/');
				$view->wawugInfoTabA=$dataseta;
				$view->wawugInfoTabB=$datasetb;
			} else {
				$view->addTemplateDir($this->Path() . 'Views/emotion/');
				$view->extendsTemplate('frontend/plugins/wawug_info_tabs/detail/index.tpl');
				$view->wawugInfoTab=$datasetemotion;
			}
        }
    }

Da das alte Emotion 100% nicht mehr verwendet wird, werde ich den Teil noch rausschmeissen.
In der Plugin-Config gibt es drei Gruppen, in einem Feld wird der Name vom Freitext eingegeben.
(Basiert noch aus der Zeit vor dem neuen Freitext-System)

Mein Bauchgefühl sagt mir, es könnte folgender Zeile liegen:

$sArticle = $view->getAssign('sArticle');

Eine Template-Datei: 

{extends file="parent:frontend/detail/tabs.tpl"}
 
{* Position 1 *}
{* New tab *}
{block name="frontend_detail_tabs_description"}
{$smarty.block.parent}
{if $wawugInfoTabA}
	{foreach from=$wawugInfoTabA key=key item=tab}
			{$tab.headline}
    {/foreach}
{/if}
{/block}
 
{* New Tab container *}
{block name="frontend_detail_tabs_content_description"}
{$smarty.block.parent}
{if $wawugInfoTabA}
	{foreach from=$wawugInfoTabA key=key item=tab}
				{include file="frontend/detail/tabs/wawugtabs.tpl"}
	{/foreach}
{/if}
{/block}

{* Position 2 *}
{* New tab *}
{block name="frontend_detail_tabs_rating"}
{$smarty.block.parent}
{if $wawugInfoTabB}
	{foreach from=$wawugInfoTabB key=key item=tab}
			{$tab.headline}
    {/foreach}
{/if}
{/block}
 
{* New Tab container *}
{block name="frontend_detail_tabs_content_rating"}
{$smarty.block.parent}
{if $wawugInfoTabB}
	{foreach from=$wawugInfoTabB key=key item=tab}
		{include file="frontend/detail/tabs/wawugtabs.tpl"}	
	{/foreach}
{/if}
{/block}

Bin für jeden Rat dankbar  Wink

Du solltest deine templates -immer- einbinden und die Logik, ob der Tab angezeigt werden soll oder nicht (quasi dein $mflag), in das Template packen. Ansonsten wandern die detail Templates ohne deine Erweiterung in den Shopware cache. 

Viele Grüße

1 „Gefällt mir“

Die Einbindung basierte noch auf Beispielcode zu 4.3 und den Updateanleitungen zu 5.0  Blush
Aber die Details sind doch Artikel bezogen, und der Artikel sollte ja gar nicht erst ohne Tabs generiert werden. 
Ich werde mich dann mal an Daniels Vorgehen im Buch orientieren - der bindet das Template auch IMMER ein - hatte schon gedacht: Was für eine Performance-Bremse.
Letztlich habe ich die Abfrage ja eh schon in den Blöcken drinne - also doppelt gemoppelt.
Danke erst mal für den ersten Fingerzeig.

*Confused*
Gerade ins Backend geguckt: Cron für HTTP Cache leeren ist gar nicht aktiviert, somit kann sich doch eigentlich nicht ohne Cache leeren  “über Nacht” der Inhalt ändern.

Das Problem hat nichts mit dem HTTP Cache zu tun, sondern mit dem smarty template cache. Dort wird das template - mal mit und mal ohne - deine Erweiterung gespeichert.

Viele Grüße
https://www.digitvision.de

Ich baue das Plugin gerade um und werde es wohl morgen aktualisieren.
Ich verstehe es dennoch nicht. Gerade erst wieder: Mehrfach Template- und HTTP-Cache geleert, Produkte aufgerufen: Tabs waren immer da.
Laptop für eine halbe Stunde Beiseite gelegt, und exakt die gleichen Artikel aufgerufen. Und wieder waren die Tabs weg - Cache geleert - und sie waren wieder da. Zwischenzeitlich lief kein Cron etc.
Ich werde die tabs.tpl entweder um ein hidden-div oder Kommentar erweitern, so müsste ich wenigstens feststellen können, ob SW das Plugin-tpl geladen hat oder nicht, oder ob es an fehlende Daten liegt. Eins steht jedenfalls fest: Vor dem Update auf 5.2.26 bestand das Problem nicht.

Morgen wird erstmal das umgebaute Plugin getestet.
Danke und schönen Abend noch.

Schau dir mal die Einstellungen für die Cache invalidierung im HTTP-Cache an. Kann gut sein, dass der Cache invslidiert wird nach 30 Minuten, je nachdem welche Zeit eingestellt wurde.

1 „Gefällt mir“

Manche Sachen bedenkt man nicht, automatische Invalidierung ist eingeschaltet und für details sind 3600 eingetragen, also eine Stunde. Das passt in etwa mit den „verschwinde“ Zeiten. (Die Einstellung hatte ich nicht bedacht)
Gestern Abend hatte ich alle 6 Artikel aufgerufen, Tabs waren da - jetzt sind sie wieder alle weg. Lösche ich nun einfach im Backend den Cache. sind sie wieder da - offensichtlich bis zur nächsten Invalidierung.

[@Moritz Naczenski](http://forum.shopware.com/profile/14574/Moritz Naczenski „Moritz Naczenski“)‍ jetzt bräuchte ich dann nur noch einen Hinweis, warum nach der „automatischen Invalidierung“ beim nächsten Aufruf die Tabs nicht erzeugt - also ggf. das Plugin nicht aufgerufen wird - aber bei einer manuellen simplen Cache-Löschung das Plugin funktioniert? Offensichtlich streikt wärend der Invalidierung und Seiten-Erzeugung der Pluginaufruf.

Werde mir jetzt eine Debug-Zeile einbauen - dann sehe ich zumindest im Code, ob das Plugin-Theme eingebunden wurde, oder nicht. Wird es aufgerufen, dürften die Freitexte nicht stimmen.
Edit: Es passiert im Subshop - im Hauptshop ist mir das noch nicht aufgefallen.

Vosichtig optimitisch:
Seit dem ich am Freitag mein Plugin so umgebaut habe, dass für jeden Artikel, unabhängig davon, ob es “gebraucht” wird oder nicht, das Template im Event IMMER registriert wird, sind die Tabs nicht mehr verschwunden. Steht aber erstmal weiter unter Beobachtung.

Dennoch liegt hier klar ein NEUES “Fehlverhalten” von Shopware vor.
Nur wenn der Cache durch den “Timeout” beim nächsten Aufruf invalidiert wird und neu gerendert wird, scheint SW / Smarty das Plugin-Template nicht zu berücksichtigen. Beim BAN durch Artikel speichern, Cache manuell leeren etc. wird beim nächsten Seitenaufruf auch das Plugin-Template benutzt. Nur nicht beim Cache-Timeout - und das war bis vor einigen Versionen nicht so. Und ich meine, dass wäre auch nur im Subshop so.

Danke an Euch beiden.