Entfernen Sie statische Blöcke oder Banner-Widgets durch benutzerdefinierte Layout-Aktualisierung

magento.stackexchange https://magento.stackexchange.com//questions/52081

Frage

Alle Produktkategorieseiten in unserem Shop haben ein zweispaltiges Format (Navigation links).In einer unserer Kategorien muss ein Element in der linken Spalte entfernt werden.Jede einzelne andere Seite, die diese linke Spalte enthält, enthält dieses Element und muss dies auch weiterhin tun, mit Ausnahme dieser wenigen kleineren Unterkategorien.

Der vorherige Entwickler hatte es so eingerichtet, dass sich das Element in einem Banner befand, und über das CMS mit einem Widget positioniert.Es ist so eingerichtet, dass es auf vielen verschiedenen Seiten angezeigt wird (z. B.:„Kategorien“ ist auf „Alle“ eingestellt, und wir möchten, dass dies so bleibt, damit wir keine neuen Kategorien zu einer bestimmten Liste hinzufügen müssen, wenn neue Kategorien von Produktmanagern usw. erstellt werden.

Ich konnte keine Möglichkeit finden, Banner oder Widgets aus einer bestimmten Kategorie zu entfernen, also habe ich das Banner als statischen Block neu erstellt und wollte es mithilfe des benutzerdefinierten Layout-Updates anhand seines Namens entfernen.

<reference name="left">
<remove name="my_static_block_id"></remove>
</reference> 

Das funktioniert nicht!

Ich habe auch unsetChildren ausprobiert:

<action method="unsetChildren"/>

Dadurch wurde alles aus der linken Spalte entfernt (nicht wünschenswert)

Gibt es eine Möglichkeit, dies zu tun?Vielleicht irgendwo, wo ich nicht gesucht habe?Danke schön.

War es hilfreich?

Lösung

Was Sie also erreichen wollen, ist aufgrund der Art und Weise, wie Widgets zur Seite hinzugefügt werden, schwierig. Wenn ein Widget gespeichert wird, wird dessen Layout-XML-Aktualisierung automatisch generiert. Der generierte Name ist jedoch nur ein zufälliger Hash, der in der folgenden Datei generiert wird.

Mage_Widget_Model_Widget_Instance::generateLayoutUpdateXml

$hash = Mage::helper('core')->uniqHash();
$xml .= '<block type="' . $this->getType() . '" name="' . $hash . '"' . $template . '>';

Dies wird dann später in der Datenbank gespeichert. In meinem Fall war der zufällige Name beispielsweise 9d10a0d6931d18586a907b201633d878, was Sie im folgenden Bild sehen können.

enter image description here

Obwohl dies theoretisch wahrscheinlich nicht sehr praktisch ist, gibt es eine Möglichkeit, dies zu tun, ohne Code zu berühren: Sie könnten die Widget-Suche nach dem Aktualisierungsdatensatz in der Datenbanktabelle erstellen core_layout_update Holen Sie sich Ihren neuen Blocknamen und machen Sie es dann zum Beispiel <remove name="9d10a0d6931d18586a907b201633d878"/> Wenn Sie jedoch Änderungen am Widget vornehmen, werden XML und Name aktualisiert und Sie müssen die Namensverweise erneut aktualisieren.Ich habe unsetChild ausprobiert und das schien nicht zu funktionieren. Ich vermute, dass das an der Reihenfolge liegt, in der das XML für Widgets verarbeitet wird.

Ich denke, Sie haben zwei echte Optionen:

1) Fügen Sie eine neue Textliste zur linken Spalte, rechten Spalte oder an einer anderen Stelle hinzu, an der Sie Widgets hinzufügen möchten, und entfernen Sie sie dann möglicherweise auf einer Seite.Sie können dies in Ihren Themes local.xml wie folgt tun.

    <reference name="left">
<block type="core/text_list" name="widgets_left" as="widgets_left" translate="label">
                        <label>Widgets Left</label>
                    </block>
</reference>

Dadurch wird im Backend eine neue Option wie im Bild hinzugefügt, mit der Sie dann auch Widget-Instanzen hinzufügen oder diese bei Bedarf einfach nach Namen entfernen können, da Sie den Namen widgets_left als Referenz haben.

z.Benter image description here

Sie können dann in der spezifischen Kategorie, aus der Sie sie entfernen möchten, eine der folgenden Aktionen ausführen:

<reference name="left">
<action method="unsetChild"><name>widgets_left</name></action>
</reference>

<remove name="widgets_left"/>

2) Alternativ könnten Sie sie einfach wie unten beschrieben in Via XML hinzufügen, aber für mich hört es sich so an, als ob Sie so viel Kontrolle wie möglich über das CMS wünschen und warum nicht, für mich werden Widgets zu wenig genutzt.

<reference name="left">
            <block type="cms/block" name="cms_left_block_name">
                <action method="setBlockId"><block_id>my_block_identifier_from_magento_backend</block_id></action>
            </block>
        </reference>

Sie erhalten dann eine Referenz, die als „cms_left_block_name“ festgelegt ist und die Sie entweder zum Entfernen oder UnsetChild verwenden können.

Andere Tipps

Sie sind schließen, Sie müssen den Namen des hinzugefügten Blocks kennen, und der Name des Elternteils.

Beispielsweise wird ein Block, der dem übergeordneten Block "links" hinzugefügt wird, wie folgt: generasacodicetagpre.

würde wie folgt entfernt: generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top