श्रेणी पृष्ठ बनाएँ जो सभी विशेष मूल्य उत्पादों को प्रदर्शित करता है


12

असल में, मैंने एक श्रेणी 'सेल ऑन प्रोडक्ट्स' बनाई है, जिसे मैं अपने कैटलॉग में उन सभी उत्पादों को स्वचालित रूप से शामिल करना चाहूंगा जिनके लिए एक विशेष मूल्य लागू किया गया है (कैटलॉग> मैनेज प्रोडक्ट्स के माध्यम से)। मैं पेज को स्तरित नेविगेशन और छँटाई क्षमताओं को बनाए रखने के लिए चाहूँगा जो एक मानक मैगनेटो श्रेणी के पेज में हैं।

ऐसा लगता है कि यह कुछ ऐसा है जो मैगेंटो उपयोगकर्ताओं के बहुमत के लिए मूल्यवान होगा, और मुझे आश्चर्य है कि यह कोर कार्यक्षमता के हिस्से के रूप में शामिल नहीं है।

मैंने एक दर्जन से अधिक स्टैक एक्सचेंज उत्तर, ब्लॉग पोस्ट और फ़ोरम पर प्रयास किया है, और इस प्रकार अब तक कुछ भी काम नहीं किया है। क्या किसी के पास इसके लिए प्रोग्रामेटिक सॉल्यूशन है?

=== EDIT ===

नीचे टिप्पणी में @ pspahn की आलोचना के आधार पर, मैंने इसी तरह की कार्यक्षमता को प्राप्त करने की एक वैकल्पिक पद्धति को आगे बढ़ाने का फैसला किया है। इसके साथ ही, यदि आप इस पंक्ति को आगे बढ़ाने में रुचि रखते हैं, तो @ सैंडर-मंगल एक ऐसी विधि का वर्णन करता है जो पूरी तरह से संभव लगती है।


यह मुझे लगता है कि "स्वचालित रूप से सभी विशेष मूल्य वाले उत्पादों की आवश्यकता है" की आवश्यकता थोड़ी अधिक है। मुझे लगता है कि अंतिम परिणाम यह है कि आप उस पर विशेष मूल्य के उत्पादों के साथ एक पृष्ठ चाहते हैं और यह एक श्रेणी पृष्ठ की तरह दिखता है। लगता है कि आप इसके बजाय सिर्फ अपना मॉडल / संग्रह (विशेष मूल्य वाले उत्पादों पर आधारित) बना सकते हैं और उस संग्रह को श्रेणी दृश्य पृष्ठों के आधार पर टेम्पलेट (ओं) में उपयोग कर सकते हैं। मैं बस एक श्रेणी नहीं देखता हूं जो एक अच्छा समाधान के रूप में स्वचालित रूप से आबाद हो जाती है, उदाहरण के लिए, आप किसी उपयोगकर्ता को इसे संशोधित करने से कैसे रोक सकते हैं?
pspahn

@pspahn आपकी प्रतिक्रिया के लिए धन्यवाद। मैं आपकी आलोचना को समझता हूं और आपके तर्क से सहमत हूं। मैं सैंडर मैंगेल द्वारा बताई गई विधि का उपयोग अतिरिक्त श्रेणी_save_after पर्यवेक्षक के साथ अच्छे उपाय के लिए कर सकता हूं, लेकिन यह ओवरकिल जैसा लगता है। मैं एक वैकल्पिक समाधान के साथ आगे बढ़ूंगा।
23

@pspahn - मुझे समझ में नहीं आ रहा है कि आप 'उपयोगकर्ता को इसे संशोधित करने से कैसे रोकें' - क्या आप इसे थोड़ा और समझा सकते हैं?
ProxiBlue

@ProxiBlue मूल रूप से, यदि आप एक श्रेणी बनाते हैं और उत्पादों के साथ स्वचालित रूप से पॉप्युलेट करते हैं, तो एक व्यवस्थापक उपयोगकर्ता बस बैकएंड में उस श्रेणी में जा सकता है और मैन्युअल रूप से उत्पादों को जोड़ / हटा सकता है।
pspahn

@pspahn ठीक है, उपयोगकर्ता के साथ मैं फ्रंट-एंड उपयोगकर्ता के रूप में गलत समझा।
14

जवाबों:


8

ऐसा करने का सबसे आसान तरीका एक कस्टम एक्सटेंशन बनाना है जो ऑब्जर्वर और क्रोनजॉब के साथ काम करता है।

बिक्री उत्पादों के लिए एक श्रेणी बनाएँ। इस तरह आप सामान्य मैगनेटो फंक्शंस का उपयोग कर सकते हैं जैसे कि लेयर्ड नेविगेशन आदि।

इस श्रेणी में उत्पादों को स्वचालित रूप से प्राप्त करने के लिए हम पर्यवेक्षक और क्रोनजॉब का उपयोग करेंगे। पर्यवेक्षक उस catalog_product_save_afterघटना का निरीक्षण करेगा जो एक उत्पाद को बैकएंड में सहेजे जाने पर चालू हो जाता है। जब ऐसा होता है special_price, तो आप यह निर्धारित करने के लिए कि आप को बिक्री की श्रेणी में डाल सकते हैं या वहां से हटा सकते हैं, यह निर्धारित करने के लिए तारीख , special_price_fromतारीख और special_date_toतारीख की जांच कर सकते हैं ।

क्रोनजॉब विशेष से और खजूर के लिए है। आधी रात के बाद हर रात पहले सभी उत्पादों की बिक्री श्रेणी खाली कर देते हैं। फिर उन सभी उत्पादों को पुनर्प्राप्त करने के लिए एक संग्रह का उपयोग करें जिनकी एक विशेष कीमत है और विशेष से और आज तक गिर रहे हैं। यदि हां, तो उन्हें इस बिक्री श्रेणी में ले जाएं।


7

@SanderMangel द्वारा प्रस्तुत समाधान शीर्ष पायदान है। मैं कुछ कोड के साथ इस पर विस्तार करने में मदद कर सकता हूं, जो मैं वर्तमान में अपने मॉड्यूल में उपयोग करता हूं स्वचालित / गतिशील श्रेणी के उत्पाद - जो विशेष पर उत्पादों के श्रेणी नियमों को करने की क्षमता रखता है

जिस दिन कोड चलता है, विशेष मूल्य सेट के साथ सभी उत्पादों को प्राप्त करने के लिए कोड एक मानक उत्पाद संग्रह को समायोजित करता है। आप 00:00 बजे श्रेणियों को फिर से आबाद करने के लिए क्रोन में इसका उपयोग कर सकते हैं, और सुनिश्चित कर सकते हैं कि वे अपडेट रहें।

ध्यान दें कि कोड एक बड़े मॉड्यूल से निकाला जाता है, इस प्रकार मैंने आपके लिए यहां प्रासंगिक भागों को संकुचित कर दिया था। एक चर या दो हो सकता है जो thsi अर्क में प्रतिनिधित्व नहीं करता है, लेकिन वे कटौती करना आसान होगा, या बस पूछें :)

$ श्रेणी वस्तु वास्तविक श्रेणी है जो उत्पादों को शामिल करने के लिए है। नीचे दिया गया कोड आपको% मान में छूट निर्दिष्ट करने की भी अनुमति देगा :)

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

अतिरिक्त बोनस के रूप में, आप कैटलॉग उत्पाद संग्रह को समायोजित करने में एक ही टेकनीक का उपयोग कर सकते हैं, और उन उत्पादों को पा सकते हैं जो कैटलॉग नियमों के कारण विशेष मोड में हैं:

$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);और एक $ श्रेणी-> सहेजें () एल; अद्यतन पूरा करने के लिए।

पूर्णता के लिए, यहां मेरा दैनिक क्रोन है जो गतिशील श्रेणियों को अप-टू-डेट रखता है। (फिर से, यह उन तरीकों को संदर्भित करता है जो यहां शामिल नहीं हैं, लेकिन मुझे यकीन है कि यह आपको सही दिशा में ले जाएगा

मज़े करो :)

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 श्रेणी मॉड्यूल को ओवरराइड करने के लिए केवल उपर्युक्त संग्रह को चलाते हैं जब ग्राहक द्वारा विशेष श्रेणी का चयन किया जाता है। यह आपके मॉड्यूल के सिस्टम -> कॉन्फ़िगरेशन में आसानी से कॉन्फ़िगर किया जा सकता है।

यदि आप कुछ क्विड खर्च कर सकते हैं तो मैं Magento कनेक्ट पर निम्नलिखित विस्तार की सिफारिश करूंगा

Magento 1 के लिए -:

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

Magento 2 के लिए -:

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

आशा करता हूँ की ये काम करेगा!

चीयर्स एस


0

मैंने Magento 2 के लिए एक एक्सटेंशन बनाया जो विशेष रूप से स्तरित नेविगेशन के साथ अपने नियंत्रक के तहत उत्पादों को प्रदर्शित करता है। इसलिए श्रेणी या क्रोन की कोई आवश्यकता नहीं है।

https://github.com/DominicWatts/Special

आशा है कि यह किसी की मदद करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.