Tạo trang Danh mục hiển thị tất cả các sản phẩm Giá Đặc biệt


12

Về cơ bản, tôi đã tạo một danh mục 'Sản phẩm đang được bán', mà tôi muốn tự động chứa tất cả các sản phẩm trong danh mục của mình đã áp dụng Giá đặc biệt cho chúng (thông qua Danh mục> Quản lý sản phẩm). Tôi muốn trang giữ lại các khả năng điều hướngsắp xếp theo lớp mà trang Danh mục Magento tiêu chuẩn chứa.

Có vẻ như đây là thứ có giá trị đối với đa số người dùng Magento và tôi ngạc nhiên rằng nó không được bao gồm như là một phần của chức năng cốt lõi.

Tôi đã thử qua hàng tá câu trả lời Stack Exchange, bài đăng trên blog và diễn đàn và cho đến nay vẫn chưa có gì hoạt động. Có ai có một giải pháp lập trình cho việc này?

=== CHỈNH SỬA ===

Dựa trên phê bình của @ pspahn trong các bình luận bên dưới, tôi đã quyết định theo đuổi một phương pháp thay thế để đạt được chức năng tương tự. Như đã nói, nếu bạn quan tâm đến việc theo đuổi dòng này, @ sander-mangel mô tả một phương pháp có vẻ hoàn toàn khả thi.


Dường như với tôi rằng yêu cầu "tự động chứa tất cả các sản phẩm giá đặc biệt" là hơi quá. Tôi giả sử kết quả cuối cùng là bạn muốn có một trang có các sản phẩm giá đặc biệt trên đó và trông nó giống như một trang chuyên mục. Có vẻ như bạn chỉ có thể tạo mô hình / bộ sưu tập của riêng mình (dựa trên các sản phẩm có giá đặc biệt) và sử dụng bộ sưu tập đó trong (các) mẫu dựa trên các trang xem danh mục. Tôi chỉ không thấy một danh mục được phổ biến tự động như một giải pháp tốt, ví dụ: làm thế nào để bạn ngăn người dùng sửa đổi nó?
pspahn

@pspahn Cảm ơn bạn đã phản hồi của bạn. Tôi hiểu sự phê phán của bạn và đồng ý với lý luận của bạn. Tôi có thể sử dụng phương pháp được mô tả bởi Sander Mangel với một người quan sát thể loại bổ sung sau khi có biện pháp tốt, nhưng điều đó có vẻ như quá mức cần thiết. Tôi sẽ đi tiếp với một giải pháp thay thế.
rokkor

@pspahn - Tôi không hiểu ý của bạn với 'làm thế nào để bạn ngăn người dùng sửa đổi nó' - bạn có thể giải thích thêm một chút không?
ProxiBlue

@ProxiBlue Về cơ bản, nếu bạn tạo một danh mục và tự động điền các sản phẩm, người dùng quản trị có thể chỉ cần vào danh mục đó trong phần phụ trợ và thêm / xóa sản phẩm theo cách thủ công.
pspahn

@pspahn ok, với người dùng tôi hiểu nhầm là người dùng front-end.
ProxiBlue

Câu trả lời:


8

Cách dễ nhất để làm điều này là tạo một tiện ích mở rộng tùy chỉnh hoạt động với Observer và Cronjob.

Tạo một danh mục cho các sản phẩm bán hàng. Bằng cách này, bạn có thể sử dụng các chức năng Magento bình thường trong giao diện như điều hướng lớp, v.v.

Để có được các sản phẩm trong danh mục này một cách tự động, chúng tôi sẽ sử dụng người quan sát và cronjob. Người quan sát sẽ quan sát catalog_product_save_aftersự kiện được kích hoạt khi một sản phẩm được lưu trong phần phụ trợ. Khi điều này xảy ra, bạn có thể kiểm tra special_price, special_price_fromcập nhật và special_date_tongày để xác định xem bạn cần phải đặt sản phẩm trong mục bán hàng hoặc loại bỏ nó từ đó.

Các cronjob là có cho đặc biệt từ và đến ngày. Mỗi đêm sau nửa đêm đầu tiên làm trống danh mục bán hàng của tất cả các sản phẩm. Sau đó sử dụng một bộ sưu tập để lấy tất cả các sản phẩm có giá đặc biệt và nằm trong số đặc biệt từ và đến nay. Nếu vậy di chuyển chúng đến thể loại bán hàng này.


7

Giải pháp được cung cấp bởi @SanderMangel là đỉnh cao. Tôi có thể giúp mở rộng điều này bằng một số mã mà tôi hiện đang sử dụng trong các sản phẩm Mô-đun Tự động / Động của mô-đun của mình - có khả năng thực hiện các quy tắc Danh mục sản phẩm đặc biệt

Mã điều chỉnh một bộ sưu tập sản phẩm tiêu chuẩn để có được tất cả các sản phẩm với giá được đặt đặc biệt, vào ngày mã chạy. Bạn có thể sử dụng điều này trong cron để điền lại các danh mục vào lúc 00:00 và đảm bảo chúng luôn được cập nhật.

Lưu ý rằng mã được trích xuất từ ​​một mô-đun lớn hơn, do đó tôi đã nén các phần có liên quan ở đây cho bạn. Có thể có một hoặc hai biến không được biểu thị trong trích xuất thsi, nhưng chúng sẽ dễ dàng suy ra, hoặc chỉ cần hỏi :)

Đối tượng $ loại là danh mục thực tế có chứa các sản phẩm. Mã dưới đây cũng sẽ cho phép bạn chỉ định giảm giá theo% giá trị :)

$collection = $category->getProductCollection();

$todayDate = Mage::app()->getLocale()->date()->toString(Varien_Date::DATE_INTERNAL_FORMAT);
$collection->addAttributeToFilter(array(
    array(
        'attribute' => "special_to_date",
        'null' => true
    ),
    array(
        'attribute' => "special_to_date",
        'from' => $todayDate,
        //'to'      => $todayDate,
        'date' => true
    )
));
$collection->addAttributeToFilter(array(
    array(
        'attribute' => "special_from_date",
        'null' => true
    ),
    array(
        'attribute' => "special_from_date",
        //'from'    => $todayDate,
        'to' => $todayDate,
        'date' => true
    )
));

$collection->addAttributeToSelect('special_price','left');
$collection->addAttributeToSelect('price','left');
$select = $collection->getSelect();

if (strpos($value, '%') > 0) {
    $value = str_replace('%', '', $value);
    $select->where('( 100 - (( at_special_price.value * 100 ) / at_price.value ) )  ' . $operator . ' ' . $value);
} else {
    $select->where('((at_price.value - at_special_price.value)) ' . $operator . ' ' . $value);
}

Bây giờ, cần lưu ý là bộ sưu tập sẽ không trả lại sản phẩm, vì nó chứa các liên kết đến danh mục sản phẩm thông thường <-> bảng liên kết sản phẩm. Vì bạn không quan tâm đến các sản phẩm được liên kết hiện tại, bạn cần xóa mối quan hệ bảng đó ra khỏi bộ sưu tập.

Tôi sử dụng đoạn mã sau để hoàn thành nó:

/**
 * Remove Catalog Product Link elements from collection
 * 
 * @param type $collection
 * @return type
 */
public function removeCatProPart($collection)
{
    $select = $collection->getSelect();
    $fromPart = $select->getPart(Zend_Db_Select::FROM);
    $select->reset(Zend_Db_Select::FROM);

    if (array_key_exists('cat_pro', $fromPart)) {
        unset($fromPart['cat_pro']);
        // also remove any reference to the table in the rest of the query
        $columns = $select->getPart(Zend_Db_Select::COLUMNS);
        $columnRemoved = false;
        foreach ($columns as $columnKey => $column) {
            if ($column[0] == 'cat_pro') {
                unset($columns[$columnKey]);
                $columnRemoved = true;
            }
        }

        if ($columnRemoved) {
            $select->setPart(Zend_Db_Select::COLUMNS, $columns);
        }

        $orderPart = $select->getPart(Zend_Db_Select::ORDER);
        $orderRemoved = false;
        foreach ($orderPart as $orderKey => $order) {
            if ($order[0] == 'cat_pro') {
                unset($orderPart[$orderKey]);
                $orderRemoved = true;
            }
        }

        if ($orderRemoved) {
            $select->setPart(Zend_Db_Select::ORDER, $orderPart);
        }
    }
    $select->setPart(Zend_Db_Select::FROM, $fromPart);
    return $collection;
}

như một phần thưởng bổ sung, bạn có thể sử dụng cùng teqnique trong việc điều chỉnh bộ sưu tập sản phẩm danh mục và tìm các sản phẩm ở chế độ đặc biệt do quy tắc danh mục:

$storeDate = Mage::app()->getLocale()->storeTimeStamp($this->getStoreId());
$value = $this->getValue();
$conditions = 'price_rule.product_id = e.entity_id AND ';
$conditions .= "(from_time = 0
    OR from_time <= " . $storeDate . ")
    AND (to_time = 0
    OR to_time >= " . $storeDate . ") AND ";
$conditions .= "price_rule.rule_id IN (" . $value . ")";
$collection->getSelect()->joinInner(
        array('price_rule' => $collection->getTable('catalogrule/rule_product')), $conditions);
$collection->setFlag('applied_catalog_rule_id', true);
$collection->setFlag('applied_rule', true);

Khi bạn có bộ sưu tập đang hoạt động, tất cả những gì bạn cần làm là lấy tất cả các id từ bộ sưu tập, lật mảng và sử dụng $category->setPostedProducts($products);và một danh mục $ -> save () l; để hoàn thành cập nhật.

Để hoàn thiện, đây là cron hàng ngày của tôi giúp cập nhật các danh mục động. (một lần nữa, nó đề cập đến các phương pháp không được bao gồm ở đây, nhưng tôi chắc chắn rằng nó sẽ giúp bạn đi đúng hướng

Chúc vui vẻ :)

public static function rebuildAllDynamic($schedule)
{
    try {
        $tempDir = sys_get_temp_dir() . "/";
        $fp = fopen($tempDir . "dyncatprod_rebuild.lock", "w+");
        if (flock($fp, LOCK_EX | LOCK_NB)) {
            if (Mage::getStoreConfig('dyncatprod/debug/enabled')) {
                   mage::log("DynCatProd - rebuildAllDynamic");
            }
            if (!Mage::getStoreConfig('dyncatprod/rebuild/max_exec')) {
                ini_set('max_execution_time', 3600); // 1 hour
            }
            $categories = Mage::getModel('catalog/category')
                ->getCollection()
                ->addAttributeToSelect('*')
                ->addIsActiveFilter()
                ->addAttributeToFilter('dynamic_attributes', array('notnull' => true));

            foreach ($categories as $category) {
                $products = Mage::helper('dyncatprod')->getDynamicProductIds($category);
                if (is_array($products)) {
                    if (Mage::getStoreConfig('dyncatprod/debug/enabled')) {
                        mage::log("rebuilding :" . $category->getName() . ' ' . $category->getPath() );
                    }
                    $products = array_flip($products);
                    $category->setPostedProducts($products);
                    $category->setIsDynamic(true);
                    $category->save();
                }
            }
            flock($fp, LOCK_UN); 
            unlink($tempDir . "dyncatprod_rebuild.lock");
        } else {
            mage::log('Could not execute cron for rebuildAllDynamic -file lock is in place, job may be running');
        }
    } catch (Exception $e) {
        flock($fp, LOCK_UN); 
        unlink($tempDir . "dyncatprod_rebuild.lock");
        mage::logException($e);
        return $e->getMessage();
    }
}

ref: http://www.proxiblue.com.au/magento-dynamic-carget-products.html


5

Dưới đây là bộ sưu tập sẽ cung cấp cho bạn tập kết quả của tất cả các sản phẩm giá đặc biệt trong danh mục của bạn mà bạn có thể hiển thị trong một trang

$collection = Mage::getResourceModel('catalog/product_collection')
    ->addAttributeToSelect('price')
    ->setStoreId($this->getStoreId());

$date = strtotime(date('Y-m-d')); $current_date = date("Y-m-d hh:mm:ss",$date);

$collection = $collection
    ->addAttributeToFilter('price',
        array('gt'=>0))
    ->addAttributeToFilter('visibility',
        array('neq'=>Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE));

if (Mage::getStoreConfigFlag(Mage_Catalog_Helper_Product_Flat::XML_PATH_USE_PRODUCT_FLAT, $this->getStoreId())){
    $collection = $collection->addAttributeToFilter('special_price',array('lt'=>new Zend_Db_Expr('e.price')));
}
else{
    $collection = $collection->addAttributeToFilter(array(
        array('attribute'=>'special_price','lt'=>new Zend_Db_Expr('at_price.value'))
    ));
}

$collection = $collection->addAttributeToFilter(array(
        array('attribute'=>'special_from_date','lteq'=>$current_date),
        array('attribute'=>'special_from_date','eq'=>''),
        array('attribute'=>'special_from_date','null'=>true)
    ),'','left')
    ->addAttributeToFilter(array(
        array('attribute'=>'special_to_date','gteq'=>$current_date),
        array('attribute'=>'special_to_date','eq'=>''),
        array('attribute'=>'special_to_date','null'=>true)
            ),'','left');

$collection->getSelect()->group('e.entity_id');

return $collection;

Có một số cách bạn có thể thực hiện việc này, hoặc tạo một mô-đun mới có bộ điều khiển, khối và mô hình riêng rất giống với mô-đun danh mục Mage hoặc bạn ghi đè mô-đun danh mục Mage để chỉ chạy bộ sưu tập trên khi khách hàng chọn loại đặc biệt. Điều này có thể dễ dàng được cấu hình trong hệ thống -> cấu hình mô-đun của bạn.

Nếu bạn có thể dành vài câu hỏi thì tôi khuyên bạn nên mở rộng phần sau trên Magento kết nối

Đối với Magento 1 -:

http: //www.magentoc Commerce.com/magento-connect/dynamic-sale-carget.html ( http: //www.sc Commerce-mage.co.uk/magento-dynamic-sale-carget.html )

Đối với Magento 2 -:

https://www.sc Commerce-mage.com/magento2-dynamic-sale-carget.html

Hy vọng nó giúp!

Chúc mừng S


0

Tôi đã tạo một tiện ích mở rộng cho Magento 2 để hiển thị các sản phẩm đặc biệt trong bộ điều khiển riêng với điều hướng phân lớp. Vì vậy, không cần thể loại hoặc cron.

https://github.com/DominicWatts/ Đặc biệt

Hy vọng điều này sẽ giúp ai đó

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.