สร้างหน้าหมวดหมู่ซึ่งแสดงผลิตภัณฑ์ราคาพิเศษทั้งหมด


12

โดยทั่วไปฉันได้สร้างหมวดหมู่ 'ผลิตภัณฑ์ที่เกี่ยวกับการขาย' ซึ่งผมอยากจะโดยอัตโนมัติประกอบด้วยผลิตภัณฑ์ทั้งหมดในแคตตาล็อกของฉันที่มีราคาพิเศษนำไปใช้กับพวกเขา (ผ่านแคตตาล็อก> จัดการ Products) ฉันต้องการให้หน้าเว็บยังคงความสามารถในการนำทางแบบเรียงซ้อนและความสามารถในการเรียงลำดับที่หน้าหมวดหมู่วีโอไอพีมาตรฐานมี

ดูเหมือนว่านี่คือสิ่งที่จะเป็นประโยชน์ต่อผู้ใช้ Magento ส่วนใหญ่และฉันประหลาดใจที่ไม่ได้รวมอยู่ในฟังก์ชั่นหลัก

ฉันได้ลองใช้คำตอบ Stack Exchange โหลบล็อกโพสต์และฟอรัมแล้วและยังไม่ได้ผล ใครบ้างมีวิธีแก้ปัญหาเชิงโปรแกรมสำหรับสิ่งนี้?

=== แก้ไข ===

จากการวิพากษ์วิจารณ์ของ @ pspahn ในความคิดเห็นด้านล่างฉันได้ตัดสินใจที่จะใช้วิธีอื่นเพื่อให้ได้ฟังก์ชันการทำงานที่คล้ายกัน หากคุณสนใจที่จะติดตามบรรทัดนี้ @ sander-mangel จะอธิบายวิธีการที่ดูเหมือนเป็นไปได้ทั้งหมด


สำหรับฉันแล้วความต้องการของ "การบรรจุผลิตภัณฑ์ราคาพิเศษทั้งหมดโดยอัตโนมัติ" นั้นค่อนข้างมากเกินไป ฉันคิดว่าผลลัพธ์สุดท้ายคือคุณต้องการหน้าเว็บที่มีสินค้าราคาพิเศษและมีหน้าตาเหมือนหมวดหมู่ ดูเหมือนว่าคุณสามารถสร้างรูปแบบ / คอลเลกชันของคุณเอง (ขึ้นอยู่กับผลิตภัณฑ์ที่มีราคาพิเศษ) และใช้คอลเลกชันนั้นในเทมเพลตตามหน้ามุมมองหมวดหมู่ ฉันไม่เห็นหมวดหมู่ที่ได้รับการเติมโดยอัตโนมัติเป็นโซลูชันที่ดีตัวอย่างเช่นคุณจะป้องกันผู้ใช้จากการแก้ไขได้อย่างไร
pspahn

@pspahn ขอบคุณสำหรับการตอบกลับของคุณ ฉันเข้าใจคำวิจารณ์ของคุณและเห็นด้วยกับเหตุผลของคุณ ฉันสามารถใช้วิธีที่อธิบายโดย Sander Mangel กับผู้สังเกตการณ์ category_save_after เพิ่มเติมเพื่อการวัดที่ดี แต่ดูเหมือนว่าเกินความเป็นจริง ฉันจะไปข้างหน้าด้วยโซลูชันอื่น
rokkor

@pspahn - ฉันไม่เข้าใจสิ่งที่คุณหมายถึงด้วย 'คุณจะป้องกันผู้ใช้จากการแก้ไขมันได้อย่างไร' - คุณสามารถอธิบายเพิ่มเติมอีกเล็กน้อยได้ไหม?
ProxiBlue

@ProxiBlue โดยทั่วไปหากคุณสร้างหมวดหมู่และเติมสินค้าโดยอัตโนมัติผู้ใช้ที่เป็นผู้ดูแลระบบสามารถเข้าไปที่หมวดหมู่นั้นในแบ็กเอนด์และเพิ่ม / ลบผลิตภัณฑ์ด้วยตนเอง
pspahn

@pspahn ตกลงกับผู้ใช้ฉันเข้าใจผิดว่าเป็นผู้ใช้ส่วนหน้า
ProxiBlue

คำตอบ:


8

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการสร้างส่วนขยายที่กำหนดเองที่ทำงานร่วมกับผู้สังเกตการณ์และ Cronjob

สร้างหมวดหมู่สำหรับผลิตภัณฑ์การขาย วิธีนี้คุณสามารถใช้ฟังก์ชัน Magento ปกติในส่วนหน้าเช่นการนำทางแบบเลเยอร์เป็นต้น

ในการรับผลิตภัณฑ์ในหมวดหมู่นี้โดยอัตโนมัติเราจะใช้ผู้สังเกตการณ์และ cronjob ผู้สังเกตการณ์จะสังเกตเห็นcatalog_product_save_afterเหตุการณ์ที่เกิดขึ้นเมื่อมีการบันทึกผลิตภัณฑ์ในแบ็กเอนด์ เมื่อเกิดเหตุการณ์นี้คุณสามารถตรวจสอบspecial_price, special_price_fromวันที่และspecial_date_toวันที่เพื่อตรวจสอบว่าคุณจะต้องใส่สินค้าในหมวดหมู่การขายหรือเอามันออกไปจากที่นั่น

cronjob อยู่ที่นั่นสำหรับพิเศษจากและวันที่ ทุกคืนหลังเที่ยงคืนจะทำให้หมวดหมู่การขายของผลิตภัณฑ์ทั้งหมดว่างเปล่า จากนั้นใช้คอลเลกชันเพื่อดึงผลิตภัณฑ์ทั้งหมดที่มีราคาพิเศษและตกอยู่ภายในพิเศษจากวันที่ ถ้าเป็นเช่นนั้นย้ายพวกเขาไปที่หมวดหมู่การขายนี้


7

โซลูชันที่นำเสนอโดย @SanderMangel นั้นยอดเยี่ยมที่สุด ฉันสามารถช่วยขยายโค้ดนี้ได้ด้วยซึ่งตอนนี้ฉันใช้ในโมดูลหมวดหมู่อัตโนมัติ / ไดนามิกหมวดหมู่ - ซึ่งมีความสามารถในการทำหมวดหมู่กฎของผลิตภัณฑ์พิเศษ

รหัสจะปรับชุดผลิตภัณฑ์มาตรฐานเพื่อให้ได้ผลิตภัณฑ์ทั้งหมดพร้อมชุดราคาพิเศษในวันที่มีการเรียกใช้รหัส คุณสามารถใช้สิ่งนี้ใน cron เพื่อเติมข้อมูลหมวดหมู่อีกครั้งในเวลา 00:00 น. และตรวจสอบให้แน่ใจว่าพวกเขาได้รับการปรับปรุงอยู่เสมอ

โปรดทราบว่ารหัสถูกดึงออกมาจากโมดูลขนาดใหญ่ขึ้นดังนั้นฉันจึงทำการกระชับส่วนที่เกี่ยวข้องให้กับคุณ อาจมีตัวแปรหนึ่งหรือสองตัวที่ไม่ได้แสดงในสารสกัด thsi แต่พวกเขาจะง่ายต่อการอนุมานหรือเพียงแค่ถาม :)

ออบเจกต์ $ category เป็นหมวดหมู่จริงที่จะมีผลิตภัณฑ์ รหัสด้านล่างจะช่วยให้คุณสามารถระบุส่วนลดในค่า% เช่นกัน :)

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

ตอนนี้สิ่งที่ควรทราบก็คือคอลเลกชันจะไม่ส่งคืนผลิตภัณฑ์เนื่องจากมีลิงก์ไปยังตารางปกติของแคตตาล็อก <-> เนื่องจากคุณไม่ได้สนใจผลิตภัณฑ์ที่เชื่อมโยงอยู่ในปัจจุบันคุณจำเป็นต้องล้างความสัมพันธ์ของตารางนั้นออกจากการรวบรวม

ฉันใช้รหัสต่อไปนี้เพื่อให้เสร็จ:

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

เป็นโบนัสที่เพิ่มเข้ามาคุณสามารถใช้ teqnique เดียวกันในการปรับการรวบรวมผลิตภัณฑ์แคตตาล็อกและค้นหาผลิตภัณฑ์ที่อยู่ในโหมดพิเศษเนื่องจากกฎแคตตาล็อก:

$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);

เมื่อคุณมีคอลเลกชันที่ใช้งานได้สิ่งที่คุณต้องทำคือรับรหัสทั้งหมดจากคอลเลกชันพลิกอาร์เรย์และใช้$category->setPostedProducts($products);และ $ category-> save () l; เพื่อให้การอัปเดตเสร็จสมบูรณ์

เพื่อความสมบูรณ์นี่คือ cron รายวันของฉันที่ทำให้หมวดหมู่ที่เป็นปัจจุบันอยู่เสมอ (อีกครั้งมันหมายถึงวิธีการที่ไม่รวมอยู่ที่นี่ แต่ฉันแน่ใจว่ามันจะพาคุณไปในทิศทางที่ถูกต้อง

มีความสุข :)

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

อ้างอิง: http://www.proxiblue.com.au/magento-dynamic-category-products.html


5

นี่คือชุดสะสมที่จะให้ผลการค้นหาสินค้าราคาพิเศษทั้งหมดในแคตตาล็อกของคุณซึ่งคุณสามารถแสดงได้ในหน้าเดียว

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

มีหลายวิธีที่คุณสามารถทำได้เช่นสร้างโมดูลใหม่ที่มีตัวควบคุมบล็อกและโมเดลคล้ายกับโมดูลหมวดหมู่ Mage หรือคุณแทนที่โมดูลหมวด Mage เพื่อเรียกใช้คอลเลกชันด้านบนเฉพาะเมื่อลูกค้าเลือกหมวดหมู่พิเศษ สามารถกำหนดค่านี้ได้อย่างง่ายดายในระบบ -> การกำหนดค่าโมดูลของคุณ

หากคุณสามารถใช้จ่ายไม่กี่ quid แล้วฉันจะแนะนำส่วนขยายต่อไปนี้ใน Magento เชื่อมต่อ

สำหรับวีโอไอพี 1 -:

http://www.magentocommerce.com/magento-connect/dynamic-sale-category.html ( http://www.scommerce-mage.co.uk/magento-connect/cons.html )

สำหรับ Magento 2 -:

https://www.scommerce-mage.com/magento2-dynamic-sale-category.html

หวังว่ามันจะช่วย!

ไชโย


0

ฉันสร้างส่วนขยายสำหรับ Magento 2 ซึ่งแสดงผลิตภัณฑ์เป็นพิเศษภายใต้คอนโทรลเลอร์ของตัวเองพร้อมการนำทางแบบเลเยอร์ ดังนั้นไม่จำเป็นต้องใช้หมวดหมู่หรือ cron

https://github.com/DominicWatts/Special

หวังว่านี่จะช่วยใครซักคน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.