Ich versuche, einer CMS-Seite, die ein Widget enthält, das eine benutzerdefinierte Produktsammlung enthält (Produkte, die "neu" sind), eine geschichtete Navigation hinzuzufügen. In diesem Widget befinden sich Funktionen, die diese Sammlung mit den richtigen Parametern filtern. Wie übergebe ich diese Sammlung an den mehrschichtigen Navigationsblock und lasse deren Attribute angezeigt werden?
So rufe ich die geschichtete Navigation im benutzerdefinierten CMS-Layout-XML auf:
<reference name="content">
<!-- Layered Navigation Block -->
<block type="catalog/layer_view" name="catalog.leftnav" before="-" template="catalog/layer/view.phtml" >
</block>
</reference>
So rufe ich die Produktkollektion auf die CMS-Seite auf:
{{widget type="catalog/product_widget_new" display_type="new_products" show_pager="1" products_count="60" template="catalog/product/widget/new/content/new_grid.phtml"}}
So generiere ich die Produktkollektion im Widgets-Block:
protected function _getProductCollection()
{
$todayStartOfDayDate = Mage::app()->getLocale()->date()
->setTime('00:00:00')
->toString(Varien_Date::DATETIME_INTERNAL_FORMAT);
$todayEndOfDayDate = Mage::app()->getLocale()->date()
->setTime('23:59:59')
->toString(Varien_Date::DATETIME_INTERNAL_FORMAT);
/** @var $collection Mage_Catalog_Model_Resource_Product_Collection */
$collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('*')->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());
$this->_addProductAttributesAndPrices($collection)
->addStoreFilter()
->addAttributeToFilter('news_from_date', array('or' => array(
0 => array('date' => true, 'to' => $todayEndOfDayDate),
1 => array('is' => new Zend_Db_Expr('null')))
), 'left')
->addAttributeToFilter('news_to_date', array('or' => array(
0 => array('date' => true, 'from' => $todayStartOfDayDate),
1 => array('is' => new Zend_Db_Expr('null')))
), 'left')
->addAttributeToFilter(
array(
array('attribute' => 'news_from_date', 'is' => new Zend_Db_Expr('not null')),
array('attribute' => 'news_to_date', 'is' => new Zend_Db_Expr('not null'))
)
)
->setPageSize($this->getProductsCount())
->setCurPage(1);
return $collection;
}
Die Vorlagenseite des Widgets ist eine Standardmethode zum Anzeigen von Preisen, Bewertungen, Bildern usw. in einem variablen Seitenformat.
attributes
collection
cms
layered-navigation
easymoden00b
quelle
quelle
www.mysite.com/new-products
aber diesnew-products
wird keine CMS-Seite sein. Es wird von einem separaten Controller verwaltet. Und es wird alle neuen Produkte enthalten, paginiert (vielleicht mit Sortieroptionen, wenn ich herausfinde, wie). Geht das für dich? oder möchten Sie eine einfache CMS-Seitenlösung?Antworten:
Die geschichtete Navigation benötigt eine aktive Kategorie, um zu funktionieren. Fügen Sie den folgenden Block zu Ihrer layout-xml auf Ihren cms-Seiten hinzu.
quelle
Wie in den Kommentaren erläutert, gibt es meines Erachtens keine Möglichkeit, dies mithilfe der CMS-Seiten zu tun, da der Liste der neuen Produkte kein Ebenenmodell zugeordnet ist. Sie haben nur Ebenenmodelle für den Kategoriekontext und den Suchkontext.
Meine Lösung (getestet und funktioniert) besteht darin, ein Modul zu schreiben, das alle auf einer Seite als neu gekennzeichneten Produkte auflistet und über ein Ebenenmodell verfügt, das die Sammlung neuer Produkte verwaltet.
Hier geht. Seien Sie vorbereitet, es ist lang.
Ich habe die Nebenstelle angerufen, kann
StackExchange_NewProducts
aber den Namen jederzeit ändern.Sie benötigen folgende Dateien:
app/etc/modules/StackExchange_NewProducts.xml
- die Deklarationsdatei:app/code/local/StackExchange/NewProducts/etc/config.xml
- die Konfigurationsdateiapp/code/local/StackExchange/NewProducts/Controller/Router.php
- Der benutzerdefinierte Router, der die URL verarbeitetnew-products
und sie einem Controller und einer Aktion zuordnetapp/code/local/StackExchange/NewProducts/controllers/IndexController.php
- die tatsächliche Steuerung, die die neuen Produkte anzeigtapp/code/local/StackExchange/NewProducts/Helper/Data.php
- der allgemeine Helfer des Modulsapp/design/frontend/base/default/layout/stackexchange_newproducts.xml
- die Modullayoutdatei, die den Inhalt der Seite definiertapp/code/local/StackExchange/NewProducts/Block/New.php
- der Block, der die neue Produktkollektion rendern soll:app/code/local/StackExchange/NewProducts/Block/Layer/New.php
- der Ebenenblock, der auf der linken Seite angezeigt werden soll (Filter)Jetzt benötigt jeder Attributtyp einen Filterblock:
app/code/local/StackExchange/NewProducts/Block/Layer/Filter/Attribute.php
- allgemeiner Filterblock für Attributeapp/code/local/StackExchange/NewProducts/Block/Layer/Filter/Decimal.php
- Filterblock für Dezimalattributeapp/code/local/StackExchange/NewProducts/Block/Layer/Filter/Price.php
- Filterblock für Preisattributapp/code/local/StackExchange/NewProducts/Model/Layer.php
- das Schichtmodell für den Umgang mit neuen ProduktenWie jedes Attribut einen Block für Filter benötigt, benötigt es auch ein Modell für die Behandlung von Filtern:
app/code/local/StackExchange/NewProducts/Model/Layer/Filter/Attribute.php
- das allgemeine Attributfiltermodellapp/code/local/StackExchange/NewProducts/Model/Layer/Filter/Decimal.php
- das Filtermodell für Dezimalattributeapp/code/local/StackExchange/NewProducts/Model/Layer/Filter/Price.php
- das Preisattributfiltermodellapp/code/local/StackExchange/NewProducts/Model/Layer/Filter/Item.php
- Die Filter erfordern eine Sammlung von Objektobjekten. Dies ist das Objekt Objekt - nicht sicher, ob dies benötigt wird. Ich denke, dass das Standard-Katalogelementmodell verwendet werden kann.app/design/frontend/base/default/template/stackexchange_newproducts/container.phtml
- Eine Vorlagendatei, die als Container für die neuen Produkte fungiert, sodass Sie einen Titel festlegen und Sitzungsnachrichten anzeigen können.Das ist es. Leeren Sie den Cache, nachdem Sie alle Dateien erstellt und die Kompilierung deaktiviert haben.
Hier ist ein Screenshot, wie es auf meiner Seite aussieht
. (unter Verwendung von ce 1.7 mit Beispieldaten)
quelle