Inhalt aus Kategoriefreitextfeld in zugehöriger Artikeldetailseite als Variable bereit stellen

Hallo Community,

ich habe ein Plugin, daß mir Inhalte aus einem Kategoriefreitextfeld global in einer Variable zur Verfügung stellt, so daß ich diese im Listing und auch in der Detailansicht abfragen kann.
Seit dem Update auf 5.2 und der Aktualisierung des Freitextmoduls funktioniert das nicht mehr.
 

So sieht die Funktion in der Bootstrap aus:

 public function PostDispatchFrontend(Enlight_Event_EventArgs $arguments)
        {
            $controller = $arguments->getSubject();
            $request = $controller->Request();
            $response = $controller->Response();
            $view = $controller->View();

            if (!$request->isDispatched() || $response->isException() || !$view->hasTemplate()) {
                return;
            }

            $currentCategoryData = $view->getAssign('sCategoryInfo');
            $currentCategory = $currentCategoryData['id'];

            if($currentCategory === null){
                return;
            }

            $sql = Shopware()->Db()->select()
                ->from('s_categories_attributes',array('my_own_attribute'))
                ->where('categoryID = ?', $currentCategory);

            $result = Shopware()->Db()->fetchOne($sql);

            $view->assign('MyAttribute',$result);
        }

Leider bleibt meine Variable {$MyAttribute} jetzt im Listing- wie im Detailtemplate leer.

Im Listing kann ich mir die Variable ja nun auch so ausgeben mit dem neuen Freitextmodul: “$sCategoryContent.attribute.my_own_attribute”;
aber im Detail habe ich darauf ja keinen Zugriff.

Aber die Funktion müßte doch eigentlich immer noch genau so funktionieren seit dem Update auf 5.2.2, oder nicht?

Für Hilfe würde ich mich sehr freuen…

Danke,
beste Grüße

Selbst hinbekommen.
Musste subscribeEvents ändern:

/**
         * subscribe to all needed events for the plugin
         * @return void
         */
        private function subscribeEvents()
        {
            $this->subscribeEvent('Enlight_Controller_Action_PostDispatchSecure_Frontend','onFrontendPostDispatch');
        }

        /**
         * Handling for frontend views
         *
         * @param Enlight_Event_EventArgs $args
         */
        public function onFrontendPostDispatch(Enlight_Event_EventArgs $args)
        {
            $controller = $args->get('subject');
            $request = $controller->Request();
            $response = $controller->Response();
            $view = $controller->View();

            if (!$request->isDispatched() || $response->isException() || !$view->hasTemplate()) {
                return;
            }

            $currentCategoryData = $view->getAssign('sCategoryInfo');
            $currentCategory = $currentCategoryData['id'];

            if($currentCategory === null){
                return;
            }

            $sql = Shopware()->Db()->select()
                ->from('s_categories_attributes',array('my_own_attribute'))
                ->where('categoryID = ?', $currentCategory);

            $result = Shopware()->Db()->fetchOne($sql);

            $view->assign('MyAttribute',$result);
}

 

im alten PlugIn war’s so:

/**
         * subscribe to all needed events for the plugin
         * @return void
         */
        private function subscribeEvents()
        {
            $this->subscribeEvent('Enlight_Controller_Action_PostDispatch_Frontend','PostDispatchFrontend');
        }

/**
         * Handling for frontend views
         *
         * @param Enlight_Event_EventArgs $args
         */
public function PostDispatchFrontend(Enlight_Event_EventArgs $arguments)
        {
            $controller = $arguments->getSubject();


.................................
...................................
....................................
}

 

Hallo flo.kalango!

Du schreibst: “ich habe ein Plugin, daß mir Inhalte aus einem Kategoriefreitextfeld global in einer Variable zur Verfügung stellt, so daß ich diese im Listing und auch in der Detailansicht abfragen kann”

Eine Frage/Bitte:

Ich bin leider kein Programmierer aber ich versuche für den Shop eines Freundes folgendes zu realisieren:

Für bestimmte Artikel-Kategorien soll auf der Artikel-Detailseite ein Hinweistext über dem “In den Warenkorb” Button erscheinen. Dein Plugin dürfte dafür genau das richtige sein…

Wie wird das Plugin installiert?

Das Einbinden des Textes an die richtige Position sollte ich hinbekommen.

Danke im Voraus für deine Hilfe.

lg

 

{$AktuelleKategorie = $sCategoryCurrent|string_format:„%s“}
{if „|9|24|31|38|40|“|strstr:$AktuelleKategorie}

@Günther schrieb:

…Für bestimmte Artikel-Kategorien soll auf der Artikel-Detailseite ein Hinweistext über dem „In den Warenkorb“ Button erscheinen…

 

Also wenn es nur um eine „Handvoll“ Kategorien geht, und wenn der Text jeweils der gleiche ist, dann könntest Du das doch auch über eine IF-Abfrage im Template regeln?

Auf der Detailseite hast Du ja die Variable sCategoryCurrent. Und Du kannst zum Beispiel mit einer strstr-Abfage:

{$AktuelleKategorie = $sCategoryCurrent|string_format:"%s"}
{if "|9|24|31|38|40|"|strstr:$AktuelleKategorie} 

den zusätzlichen Text über dem Button einblenden - alternativ eben über das Template.

Es muss ja nicht immer ein Plugin sein - das Template muss an dieser Stelle ohnehin erweitert werden. Ist natürlich aber eine Frage der Praktikabilität  Wink

Hallo jor,

Danke für deine Antwort.

Angedacht war ein Kategorie-Freitextfeld als Checkbox anzulegen. Wenn die Checkbox aktiviert ist, soll dieser Hinweistext angegeben werden. Dann kann er selbst entscheiden welche Kategorie den Text angezeigt bekommen soll.

{if $sCategoryContent.attribute.attribute1 == true}

Dann soll hier der Text stehen…

Allerdings funktioniert das so nicht

@Günther schrieb:

…{if $sCategoryContent.attribute.attribute1 == true}

Dann soll hier der Text stehen…

Allerdings funktioniert das so nicht

Ich hab jetzt in meinem Beispiel keine Checkbox angelegt, sondern nur die Voreinstellung mit dem größeren Text übernommen, aber ich denke, dass Du davon sinngemäß ableiten kannst.

$sCategoryContent steht Dir, soweit ich weiß, auf der Detailseite gar nicht zur Verfügung.

Du hast aber Zugriff auf den Array $sCategories. Und hier wiederum jeweils auf den Array attribute. Also wäre ein Möglichkeit:

{$sCategories[$sCategoryCurrent].attribute.attribute1}

und bei mir wird dann eben, bei Artikeln in dieser Kategorie, der Text aus dem Kategorie-Freitextfeld angezeigt (blauer Rahmen):

1 „Gefällt mir“

Vielen Dank jor!

Habs jetzt geschafft.

Falls wer das ganze brauchen kann:

Ich habe ein Kategorie-Freitextfeld als Checkbox erstellt (attribute1).

In den Kategorien wo der Zusatztext kommen soll, die Checkbox aktivieren.

Hier mein Code:

{extends file="parent:frontend/detail/content/buy_container.tpl"}
  
{block name="frontend_detail_index_configurator"}
{$smarty.block.parent}

{if $sCategories[$sCategoryCurrent].attribute.attribute1 == true || $sCategories[$sCategoryCurrent].attribute.attribute1 == "true" || $sCategories[$sCategoryCurrent].attribute.attribute1 == 1 || $sCategories[$sCategoryCurrent].attribute.attribute1 == "1"}
     
   
   Hier gehts zum Zusatztext


{/if}
{/block}

Danke!

PS: gibt es eine Möglichkeit den Textabstand innerhalb der Modalbox zu ändern? padding oä?

@Günther schrieb:

{if $sCategories[$sCategoryCurrent].attribute.attribute1 == true || $sCategories[$sCategoryCurrent].attribute.attribute1 == "true" || $sCategories[$sCategoryCurrent].attribute.attribute1 == 1 || $sCategories[$sCategoryCurrent].attribute.attribute1 == "1"}...

…PS: gibt es eine Möglichkeit den Textabstand innerhalb der Modalbox zu ändern? padding oä?

Ich wundere mich ein bisschen über Deine „If-Orgie“ beim Abprüfen der Checkbox.

In der Datenbank dürfte dort doch nur entweder eine 1 oder eine 0 stehen, wenn das Feld als Checkbox angelegt wurde?

Die Modalbox ist eigentlich eine gemeine DIV. Die solltest Du per CSS formatieren können:

Funktioniert leider doch nicht so ganz.

Ich habe jetzt bei mehreren Kategorien die Checkbox aktiviert, es greift im Frontend aber nicht. Nur bei einem Artikel einer Kategorie bekomme ich den Text angezeigt…?

@Günther schrieb:

Funktioniert leider doch nicht so ganz.

Ich habe jetzt bei mehreren Kategorien die Checkbox aktiviert, es greift im Frontend aber nicht. Nur bei einem Artikel einer Kategorie bekomme ich den Text angezeigt…?

Dazu fällt mir ein Notruf ein - bewusstlose Person hieß es. Und dann kamen wir an und da saß ein Mann auf der Stufe vor der Haustür und fragte uns: „Was macht ihr denn hier?“

Ich hab eine simple Geschichte für die Detailseite gebaut - bei mir ist die Checkbox eben attribute2 :

	{if $sCategories[$sCategoryCurrent].attribute.attribute2}
		{$sCategories[$sCategoryCurrent].attribute.attribute2}
	{else}
		Kein Haken gesetzt
	{/if}

Und es funktioniert ganz prima, wenn man berücksichtigt, was da passiert…

  1. Mein Attribut sitzt in der Kategorie
  2. Die Anzeige dieses Attributes erfolgt auf der Produktdetailseite
  3. Im Produktivmodus neigt Shopware dazu, Seiten zu cachen

Das heißt, wenn ich in der Kategorie die Änderung durchführe (Haken setzen oder rausnehmen), dann holt die Produktdetailseite alle Informationen immer noch aus dem Cache - mit dem alten Stand , vor der Änderung in der Kategorie. Leere ich aber den Cache , müssen alle Informationen neu zusammengestellt werden - und damit bekommt die Produktdetailseite auch den aktuellen Stand. Gleicher Effekt wenn entsprechende Artikel übers Backend gespeichert werden (möchte ich meinen).

Ist Dein Kode korrekt, und Du leerst den Cache, sollte die Anzeige anschließend auch stimmen, weil aufgerufene Seiten dann ja komplett neu aufgebaut werden müssen.

Bei mir war es jedenfalls so  Wink

Danke jor,

aber so ist das nicht. Natürlich lösche ich immer den Cache wenn ich Änderungen vornehme.

Auf was ich jetzt drauf gekommen bin: der Code funktioniert. Aber nur wenn sich der Artikel in einer Hauptkategorie befindet. In einer Unterkategorie nicht mehr (und ja, auch in der Unterkategorie ist der Haken gesetzt)…

@Günther schrieb:

Danke jor,

aber so ist das nicht. Natürlich lösche ich immer den Cache wenn ich Änderungen vornehme.

Auf was ich jetzt drauf gekommen bin: der Code funktioniert. Aber nur wenn sich der Artikel in einer Hauptkategorie befindet. In einer Unterkategorie nicht mehr (und ja, auch in der Unterkategorie ist der Haken gesetzt)…

Da muss ich einräumen, dass ich das nicht mit Unterkategorien gemacht habe - aber das werd ich mir natürlich dann auch nochmal ansehen…

 

Sehr gut, Deine Feststellung! Trotzdem meine ich, dass die Lösung ohne Plugin - alleine im Template - möglich sein müsste. Lediglich der Ansatz sollte wohl überdacht werden.

Offenbar besteht die Notwendigkeit in zwei Schritten vorzugehen:

  1. Finde die Kategorie-Id innerhalb sCategories und sCategories[n].subcategories
  2. Prüfe DORT den Inhalt von attribute1 (bzw. in meinem Beispiel attribute2)

Milchmädchen-Modus: $sCategories[$sCategoryCurrent].subcategories[$sCategoryCurrent].attribute.attribute2

Das haut so natürlich nicht hin, aber sinngemäß läuft es darauf hinaus - erst eine rekursive Suche, dann die Auswertung des Freitextfeldes bei Übereinstimmung Kategorie-Id.

 

 

Na, das hat doch mal wieder richtig Laune gemacht  Wink

 

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

{block name="frontend_detail_buy_button_container_outer" prepend}

{function name=fcategories2}
	{foreach $categories2 as $category2}
		{if $category2.flag}
			
			{if $category2.id == $sCategoryCurrent}
				{$category2.attribute.attribute2}: Treffer Id {$category2.id}: {$category2.name}
			{else}
				{$category2.attribute.attribute2}: Nicht Kategorie Id {$category2.id}: {$category2.name}
			{/if}
			
			{if $category2.flag && $category2.subcategories}
				{call name=fcategories2 categories2=$category2.subcategories}
			{/if}
		{/if}
	{/foreach}
{/function}

{call name=fcategories2 categories2=$sCategories}

{/block}

Vielen Dank für die Fragestellung  Wink

Hallo,

nur als Randnotiz: prepend soll nicht mehr verwendet werden (schreibt auch Shopware so vor), sondern stattdessen {$smarty.block.parent}. Ebenso sollte man auch auf inline - CSS verzichten und das ganze über eine eigene CSS - Klasse lösen.

Zum eigentlichen Problem: am schnellsten wäre es wahrscheinlich über ein Artikel - Freitextfeld gegangen (über die Mehrfachänderung dann auf die entsprechenden Artikel übertragen), dafür gäbe es sogar fertige Plugins - da wäre dann auch nicht das Problem, wenn der Artikel in Kategorie A und Kategorie B (Sale) ist, der Hinweis aber nur bei Kategorie A gesetzt wurde, der Kunde aber über Kategorie B kommt, er den Hinweis gar nicht sieht (weil Kategorie B „Sale“ zu global für den Hinweis wäre, um ihn dort auch zu aktivieren).

Grüße 

Sebastian

@sschreier schrieb:

Hallo…

Absolut richtig.

Vielen Dank für die Hilfe, es klappt jetzt :wink:

Ich weiß dass es über Artikel-Freitextfelder wesentlich einfacher ginge, aber dann müsste ich hunderte Artikel bearbeiten (möglich dass es mit Mehrfachänderung schneller geht)

Hier mein Code falls es mal wer braucht:

{extends file="parent:frontend/detail/content/buy_container.tpl"}
  
{block name="frontend_detail_index_configurator"}
{$smarty.block.parent}

{function name=fcategories2}
	{foreach $categories2 as $category2}
		{if $category2.flag}
			{if $category2.id == $sCategoryCurrent}
			{if $category2.attribute.attribute1 == 1}
				 
Dieser Artikel unterliegt Erwerbsvoraussetzungen

			
			{/if}
			{/if}
			{if $category2.flag && $category2.subcategories}
				{call name=fcategories2 categories2=$category2.subcategories}
			{/if}
		{/if}
	{/foreach}
{/function}

{call name=fcategories2 categories2=$sCategories}

{/block}

Danke nochmal für die Unterstützung!