điều hướng lớp không được điền bởi các thuộc tính bộ sưu tập - trang CMS


7

Tôi đang cố gắng thêm điều hướng theo lớp vào trang CMS có chứa tiện ích chứa bộ sưu tập sản phẩm tùy chỉnh (sản phẩm 'mới'). Trong tiện ích này là các phần mềm, với các tham số chính xác, sẽ lọc bộ sưu tập này. Làm cách nào để tôi chuyển bộ sưu tập này vào khối điều hướng được xếp lớp và các thuộc tính của nó hiển thị?

Đây là cách tôi gọi điều hướng lớp trong XML bố cục tùy chỉnh CMS:

<reference name="content">
        <!-- Layered Navigation Block -->
        <block type="catalog/layer_view" name="catalog.leftnav" before="-" template="catalog/layer/view.phtml" >
        </block>
</reference>

Đây là cách tôi gọi bộ sưu tập sản phẩm trên trang CMS:

{{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"}}

Đây là cách tôi tạo bộ sưu tập sản phẩm trong khối widget:

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;
}

Trang mẫu của tiện ích là một cách thực hành tiêu chuẩn để hiển thị giá, đánh giá, hình ảnh, v.v ... ở định dạng biến đổi kích thước trang.


1
Những gì bạn đang cố gắng để đạt được là không thể, bây giờ với việc sử dụng các trang và tiện ích cms và cập nhật bố cục ít nhất. Đây là lý do tại sao. Magento có mô hình 2 lớp. Một hoạt động nếu bạn ở trong ngữ cảnh của một danh mục và một hoạt động khi bạn ở trong bối cảnh của kết quả tìm kiếm. Ví dụ của bạn không thuộc một trong hai loại này. Bạn sẽ cần một mô hình lớp tùy chỉnh sẽ xử lý loại bộ sưu tập của bạn (sản phẩm mới).
Marius

1
Tôi có thể đưa ra một giải pháp nhưng điều này liên quan đến việc viết một mô-đun tùy chỉnh, với một bộ điều khiển, mô hình khối và lớp tùy chỉnh (và có thể cả những thứ khác). Nhưng trước khi tìm kiếm một giải pháp tôi muốn biết nếu điều này làm việc cho bạn. Ý tôi là bạn vẫn có thể có một url www.mysite.com/new-productsnhưng đây new-productssẽ không phải là trang cms. Nó sẽ được xử lý bởi một bộ điều khiển riêng biệt. Và nó sẽ chứa tất cả các sản phẩm mới, được phân trang (có thể với các tùy chọn sắp xếp nếu tôi tìm hiểu làm thế nào). công việc này là dành cho bạn? hoặc bạn muốn một giải pháp trang CMS đơn giản?
Marius

@Marius đó sẽ là một giải pháp hợp lý. Tôi cho rằng tôi có thể chèn giải pháp đó giống như tôi sẽ làm một widget trên trang cms, phải không?
Easymoden00b

1
Không hẳn vậy. Giải pháp tôi có trong đầu sẽ tạo một trang riêng với bộ điều khiển riêng (có thể một số tệp mẫu). không thể thay đổi như trang csm. Nó sẽ chỉ ở đó và làm việc :) Đó là nó. Nó liên quan đến việc tạo ra một mô-đun mới
Marius

@Marius Tôi thấy, điều đó có thể làm việc là tốt.
Easymoden00b

Câu trả lời:


7

Điều hướng lớp cần một thể loại hoạt động để làm việc. Thêm khối sau vào bố cục-xml trên trang cms của bạn.

<cms_page>
    <block type="catalog/layer_view" name="catalog.leftnav" before="-" template="catalog/layer/view.phtml">
        <action method="setCategoryId"><category_id>2</category_id></action>
    </block>
</cms_page>

1
Những gì khác bạn sử dụng để dân cư sản phẩm của bạn?
roman204

1
Vâng tôi thấy, trong trường hợp này, bạn phải ghi đè Mage_Catalog_Model__Layer: get SẢNtCollection ... tôi sẽ xem những gì tôi có thể làm ở đây để cung cấp giải pháp.
roman204

2
@ Easymoden00b Hãy thử thêm id danh mục gốc. Và hãy chắc chắn rằng bạn đã thực hiện 'Is Anchor' thành Có cho danh mục đó.
MagePologistso 19/2/2015

1
@MagePologistso thì các thuộc tính có thể lọc của tất cả các sản phẩm sẽ có sẵn để lọc, vì tôi hiểu câu hỏi bộ lọc chỉ nên bao gồm các sản phẩm từ tiện ích, vui lòng sửa cho tôi nếu tôi sai ...
roman204

1
AFAIK, OP muốn danh sách toàn cầu các sản phẩm mới với điều hướng lớp.
MagePologistso 19/2/2015

28

Như đã giải thích trong các bình luận, tôi không nghĩ có một cách để làm điều này bằng cách sử dụng các trang cms vì bạn không có mô hình lớp liên quan đến danh sách sản phẩm mới. Bạn chỉ có các mô hình lớp cho bối cảnh danh mục và bối cảnh tìm kiếm.
Giải pháp của tôi (đã được thử nghiệm và hoạt động) liên quan đến việc viết một mô-đun sẽ liệt kê tất cả các sản phẩm được đánh dấu là mới trong một trang và có một mô hình lớp xử lý bộ sưu tập sản phẩm mới.
Ở đây đi. hãy chuẩn bị nó một cái dài
Tôi gọi phần mở rộng StackExchange_NewProductsnhưng cảm thấy tự do để thay đổi tên.
Bạn sẽ cần các tệp sau:

app/etc/modules/StackExchange_NewProducts.xml - hồ sơ khai báo:

<?xml version="1.0"?>
<config>
    <modules>
        <StackExchange_NewProducts>
            <codePool>local</codePool>
            <active>true</active>
            <depends>
                <Mage_Catalog />
            </depends>
        </StackExchange_NewProducts>
    </modules>
</config>

app/code/local/StackExchange/NewProducts/etc/config.xml - tập tin cấu hình

<?xml version="1.0"?>
<config>
    <modules>
        <StackExchange_NewProducts>
            <version>1.0.0</version>
        </StackExchange_NewProducts>
    </modules>
    <global>
        <models>
            <stackexchange_newproducts>
                <class>StackExchange_NewProducts_Model</class>
            </stackexchange_newproducts>
        </models>
        <blocks>
            <stackexchange_newproducts>
                <class>StackExchange_NewProducts_Block</class>
            </stackexchange_newproducts>
        </blocks>
        <helpers>
            <stackexchange_newproducts>
                <class>StackExchange_NewProducts_Helper</class>
            </stackexchange_newproducts>
        </helpers>
        <events>
            <controller_front_init_routers> <!-- create a custom router to handle the 'new-products' url -->
                <observers>
                    <stackexchange_newproducts>
                        <class>StackExchange_NewProducts_Controller_Router</class>
                        <method>initControllerRouters</method>
                    </stackexchange_newproducts>
                </observers>
            </controller_front_init_routers>
        </events>
    </global>
    <frontend>
        <routers> <!-- declare a router -->
            <newproducts>
                <use>standard</use>
                <args>
                    <module>StackExchange_NewProducts</module>
                    <frontName>newproducts</frontName>
                </args>
            </newproducts>
        </routers>
        <layout>
            <updates>
                <stackexchange_newproducts>
                    <file>stackexchange_newproducts.xml</file>
                </stackexchange_newproducts>
            </updates>
        </layout>
    </frontend>
</config>

app/code/local/StackExchange/NewProducts/Controller/Router.php- bộ định tuyến tùy chỉnh xử lý url new-productsvà ánh xạ nó tới bộ điều khiển và hành động

<?php
class StackExchange_NewProducts_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract
{
    const NEW_PRODUCTS_URL_KEY = 'new-products';
    public function initControllerRouters($observer)
    {
        $front = $observer->getEvent()->getFront();
        $front->addRouter('stackexchange_newproducts', $this);
        return $this;
    }

    public function match(Zend_Controller_Request_Http $request)
    {
        if (!Mage::isInstalled()) {
            Mage::app()->getFrontController()->getResponse()
                ->setRedirect(Mage::getUrl('install'))
                ->sendResponse();
            exit;
        }
        $urlKey = trim($request->getPathInfo(), '/');
        if ($urlKey == self::NEW_PRODUCTS_URL_KEY) {
            $request->setModuleName('newproducts')
                ->setControllerName('index')
                ->setActionName('index');
            $request->setAlias(
                Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
                $urlKey
            );
            return true;
        }
        return false;
    }
}

app/code/local/StackExchange/NewProducts/controllers/IndexController.php - bộ điều khiển thực tế hiển thị các sản phẩm mới

<?php
class StackExchange_NewProducts_IndexController extends Mage_Core_Controller_Front_Action
{
    public function indexAction()
    {
        $this->loadLayout();
        $this->renderLayout();
    }
}

app/code/local/StackExchange/NewProducts/Helper/Data.php - người trợ giúp chung mô-đun

<?php
class StackExchange_NewProducts_Helper_Data extends Mage_Core_Helper_Abstract
{

}

app/design/frontend/base/default/layout/stackexchange_newproducts.xml - tệp bố trí mô-đun xác định nội dung của trang

<?xml version="1.0"?>
<layout>
    <newproducts_index_index>
        <reference name="root">
            <action method="setTemplate">
                <template>page/2columns-left.phtml</template>
            </action>
        </reference>
        <reference name="left">
            <block type="stackexchange_newproducts/layer_new" name="catalog.leftnav" before="-" template="catalog/layer/view.phtml" />
        </reference>
        <reference name="content">
            <block type="core/template" name="new_products_container" as="new_products_container" template="stackexchange_newproducts/container.phtml">
                <action method="setTitle" translate="title" module="stackexchange_newproducts">
                    <title>New Products</title>
                </action>
                <block type="stackexchange_newproducts/new" name="new_product" as="new_products" template="catalog/product/list.phtml">
                    <block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml">
                        <block type="page/html_pager" name="product_list_toolbar_pager"/>
                    </block>
                    <action method="addColumnCountLayoutDepend"><layout>empty</layout><count>6</count></action>
                    <action method="addColumnCountLayoutDepend"><layout>one_column</layout><count>5</count></action>
                    <action method="addColumnCountLayoutDepend"><layout>two_columns_left</layout><count>4</count></action>
                    <action method="addColumnCountLayoutDepend"><layout>two_columns_right</layout><count>4</count></action>
                    <action method="addColumnCountLayoutDepend"><layout>three_columns</layout><count>3</count></action>
                    <action method="setToolbarBlockName"><name>product_list_toolbar</name></action>
                </block>
            </block>
        </reference>

    </newproducts_index_index>
</layout>

app/code/local/StackExchange/NewProducts/Block/New.php - khối sẽ kết xuất bộ sưu tập sản phẩm mới:

<?php
class StackExchange_NewProducts_Block_New extends Mage_Catalog_Block_Product_List
{
    public function __construct()
    {
        parent::__construct();
    }
    public function getModuleName()
    {
        return 'Mage_Catalog';
    }
    protected function _getProductCollection()
    {
        if (is_null($this->_productCollection)) {
            $this->_productCollection = $this->getLayer()->getProductCollection();
        }
        return $this->_productCollection;
    }
    public function getLayer()
    {
        $layer = Mage::registry('current_layer');
        if ($layer) {
            return $layer;
        }
        return Mage::getSingleton('stackexchange_newproducts/layer');
    }
}

app/code/local/StackExchange/NewProducts/Block/Layer/New.php - khối lớp sẽ được hiển thị ở phía bên trái (bộ lọc)

<?php
class StackExchange_NewProducts_Block_Layer_New extends Mage_Catalog_Block_Layer_View
{
    public function getLayer()
    {
        if (!$this->hasData('_layer')){
            $layer = Mage::getSingleton('stackexchange_newproducts/layer');
            $this->setData('_layer', $layer);
        }
        return $this->getData('_layer');
    }
    protected function _initBlocks()
    {
        parent::_initBlocks();
        $this->_attributeFilterBlockName    = 'stackexchange_newproducts/layer_filter_attribute';
        $this->_priceFilterBlockName        = 'stackexchange_newproducts/layer_filter_price';
        $this->_decimalFilterBlockName      = 'stackexchange_newproducts/layer_filter_decimal';
    }
    protected function _prepareLayout()
    {
        $stateBlock = $this->getLayout()->createBlock($this->_stateBlockName)
            ->setLayer($this->getLayer());
        $this->setChild('layer_state', $stateBlock);

        $filterableAttributes = $this->_getFilterableAttributes();
        foreach ($filterableAttributes as $attribute) {
            if ($attribute->getAttributeCode() == 'price') {
                $filterBlockName = $this->_priceFilterBlockName;
            } elseif ($attribute->getBackendType() == 'decimal') {
                $filterBlockName = $this->_decimalFilterBlockName;
            } else {
                $filterBlockName = $this->_attributeFilterBlockName;
            }

            $this->setChild($attribute->getAttributeCode() . '_filter',
                $this->getLayout()->createBlock($filterBlockName)
                    ->setLayer($this->getLayer())
                    ->setAttributeModel($attribute)
                    ->init());
        }

        $this->getLayer()->apply();
        return $this;
    }
}

bây giờ mỗi loại thuộc tính cần một khối bộ lọc liên quan đến nó:

app/code/local/StackExchange/NewProducts/Block/Layer/Filter/Attribute.php - khối bộ lọc chung cho các thuộc tính

<?php 
class StackExchange_NewProducts_Block_Layer_Filter_Attribute extends Mage_Catalog_Block_Layer_Filter_Attribute
{
    public function __construct()
    {
        parent::__construct();
        $this->_filterModelName = 'stackexchange_newproducts/layer_filter_attribute';
    }
}

app/code/local/StackExchange/NewProducts/Block/Layer/Filter/Decimal.php - khối bộ lọc cho các thuộc tính thập phân

<?php 
class StackExchange_NewProducts_Block_Layer_Filter_Decimal extends Mage_Catalog_Block_Layer_Filter_Decimal
{
    public function __construct()
    {
        parent::__construct();
        $this->_filterModelName = 'stackexchange_newproducts/layer_filter_decimal';
    }
}

app/code/local/StackExchange/NewProducts/Block/Layer/Filter/Price.php - khối bộ lọc cho thuộc tính giá

<?php 
class StackExchange_NewProducts_Block_Layer_Filter_Price extends Mage_Catalog_Block_Layer_Filter_Price
{
    public function __construct()
    {
        parent::__construct();
        $this->_filterModelName = 'stackexchange_newproducts/layer_filter_price';
    }
}

app/code/local/StackExchange/NewProducts/Model/Layer.php - mô hình lớp để xử lý các sản phẩm mới

<?php
class StackExchange_NewProducts_Model_Layer extends Mage_Catalog_Model_Layer
{
    public function getStateKey()
    {
        if ($this->_stateKey === null) {
            $this->_stateKey = 'STORE_'.Mage::app()->getStore()->getId()
                . '_NEW_PRODUCTS_'
                . '_CUSTGROUP_' . Mage::getSingleton('customer/session')->getCustomerGroupId();
        }

        return $this->_stateKey;
    }

    public function getStateTags(array $additionalTags = array())
    {
        $additionalTags = array_merge($additionalTags, array('new_products'));
        return $additionalTags;
    }

    public function getProductCollection()
    {
        if (isset($this->_productCollections['new_products'])) {
            $collection = $this->_productCollections['new_products'];
        } else {
            $collection = $this->_getCollection();
            $this->prepareProductCollection($collection);
            $this->_productCollections['new_products'] = $collection;
        }

        return $collection;
    }
    public function prepareProductCollection($collection)
    {
        $collection
            ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
            ->addMinimalPrice()
            ->addFinalPrice()
            ->addTaxPercents()
            ->addUrlRewrite();

        Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
        Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
        return $this;
    }

    protected function _getCollection()
    {
        $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);

        $collection = Mage::getModel('catalog/product')->getCollection()
            ->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'))
                )
            )
            ->addAttributeToSort('news_from_date', 'desc');
        return $collection;
    }
}

Giống như mỗi thuộc tính cần một khối cho các bộ lọc, nó cũng cần một mô hình để xử lý các bộ lọc:

app/code/local/StackExchange/NewProducts/Model/Layer/Filter/Attribute.php - mô hình bộ lọc thuộc tính chung

<?php 
class StackExchange_NewProducts_Model_Layer_Filter_Attribute extends Mage_Catalog_Model_Layer_Filter_Attribute
{
    protected function _createItem($label, $value, $count = 0)
    {
        return Mage::getModel('stackexchange_newproducts/layer_filter_item')
            ->setFilter($this)
            ->setLabel($label)
            ->setValue($value)
            ->setCount($count);
    }
}

app/code/local/StackExchange/NewProducts/Model/Layer/Filter/Decimal.php - mô hình bộ lọc thuộc tính thập phân

<?php 
class StackExchange_NewProducts_Model_Layer_Filter_Decimal extends Mage_Catalog_Model_Layer_Filter_Attribute
{
    protected function _createItem($label, $value, $count = 0)
    {
        return Mage::getModel('stackexchange_newproducts/layer_filter_item')
            ->setFilter($this)
            ->setLabel($label)
            ->setValue($value)
            ->setCount($count);
    }
}

app/code/local/StackExchange/NewProducts/Model/Layer/Filter/Price.php - mô hình bộ lọc thuộc tính giá

<?php 
class StackExchange_NewProducts_Model_Layer_Filter_Price extends Mage_Catalog_Model_Layer_Filter_Price
{
    protected function _createItem($label, $value, $count = 0)
    {
        return Mage::getModel('stackexchange_newproducts/layer_filter_item')
            ->setFilter($this)
            ->setLabel($label)
            ->setValue($value)
            ->setCount($count);
    }
}

app/code/local/StackExchange/NewProducts/Model/Layer/Filter/Item.php- các bộ lọc yêu cầu một bộ sưu tập các đối tượng mục. đây là đối tượng mục - không chắc chắn nếu điều này là cần thiết. Tôi nghĩ rằng mô hình mục danh mục mặc định có thể được sử dụng.

<?php 
class StackExchange_NewProducts_Model_Layer_Filter_Item extends Mage_Catalog_Model_Layer_Filter_Item
{

}

app/design/frontend/base/default/template/stackexchange_newproducts/container.phtml - một tệp mẫu hoạt động như một thùng chứa cho các sản phẩm mới để bạn có thể đặt tiêu đề và hiển thị thông báo phiên.

<?php if ($this->getTitle()) : ?>
    <div class="page-title category-title">
        <h1><?php echo $this->getTitle() ?></h1>
    </div>
<?php endif;?>
<?php echo $this->getMessagesBlock()->getGroupedHtml() ?>
<?php echo $this->getChildHtml();?>

Đó là nó. Xóa bộ nhớ cache sau khi bạn tạo tất cả các tệp và vô hiệu hóa quá trình biên dịch.
Đây là một ảnh chụp màn hình về phía nó trông như thế nào
ảnh chụp màn hình. (sử dụng ce 1.7 với dữ liệu mẫu)


4
Điều duy nhất còn thiếu là tập tin dịch.
Marius

1
đặt tên mô-đun tốt ở đó :)
David Manners

3
@DavidManners. Vâng. Tôi không biết tên đó đến từ đâu, nhưng nó cứ đánh tôi :). Tôi hy vọng bạn không yêu cầu bồi thường bản quyền.
Marius

3
một ly bia sẽ làm;)
David Manners

2
ngồi lên @Marius - + 1votw
Amit Bera
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.