अक्सर, कई प्रकार की कीमतें ऑनलाइन थोक स्टोर पर पाई जा सकती हैं - उन्हें आमतौर पर OPT1, OPT2, OPT3, आदि के रूप में संदर्भित किया जाता है। यह निर्भर करता है कि खरीदार ने टोकरी और (या) अन्य स्थितियों में कितनी अच्छाई जमा की है, इस या उस प्रकार की कीमत उसके लिए शुरू हो जाती है।
दुर्भाग्य से, सभी साइट इंजन एक बार में एक उत्पाद के लिए कई प्रकार की कीमतों की उपस्थिति के लिए प्रदान नहीं करते हैं, और यहां तक कि उन इंजनों में जिनमें उत्पाद के लिए एक से अधिक मूल्य निर्धारित करना संभव है, अक्सर उनके स्विच करने के लिए लचीले तंत्र नहीं होते हैं। उत्तरार्द्ध बहुत लोकप्रिय है "1C-Bitrix"। एक ओर, इस सीएमएस में पहले से ही "बॉक्सिंग" संस्करण ("व्यापार" संस्करण और उससे ऊपर) में कई प्रकार की कीमतों के लिए समर्थन है, और दूसरी तरफ, यह पूरी तरह से स्पष्ट नहीं है कि विशेष परिस्थितियों के आधार पर इन कीमतों के गतिशील स्विचिंग को कैसे सेट किया जाए। इस भाग के लिए नियमित मैनुअल भी मौन रहता है। मुझे उम्मीद है कि बिट्रिक्स से कामरेड इस कष्टप्रद गलतफहमी को सही करेंगे, लेकिन मैंने इस खुशी के पल का इंतजार नहीं करने का फैसला किया, और मैं एक स्पष्ट-कट बैसाखी निर्णय के साथ आया, जिसे मैंने वास्तव में हब्रसोकेबिलिटी के साथ साझा करने का फैसला किया था।
तो चलिए जाने ...
सबसे पहले, आपको
OnGetOptimalPrice हैंडलर पर ध्यान देना चाहिए। इस तथ्य के बावजूद कि यह फ़ंक्शन लंबे समय तक कर्नेल में दिखाई दिया, इसका विवरण हाल ही में ऑनलाइन प्रलेखन में जोड़ा गया था। इस बीच, इस हैंडलर को ट्रिगर किया जाता है जब किसी विशेष उत्पाद के लिए इष्टतम मूल्य का एक स्वचालित चयन होता है और आपको इसके लिए कीमत को फिर से परिभाषित करने की अनुमति देता है। हम कुल खरीद राशि के आधार पर टोकरी में सभी कीमतों को पुनः प्राप्त करने के लिए इसका उपयोग करने का प्रयास करेंगे।
हम हैंडलर को फ़ाइल /php_interface/init.php में कनेक्ट करते हैं (स्वयं द्वारा, यदि यह फ़ाइल मौजूद नहीं है, तो आपको इसे बनाने की आवश्यकता है - बिट्रिक्स इसे स्वचालित रूप से कनेक्ट करेगा)
AddEventHandler("catalog", "OnGetOptimalPrice", "MyGetOptimalPrice");
इनपुट मापदंडों के साथ MyGetOptimalPrice फ़ंक्शन की घोषणा इस तरह दिखाई देगी:
function MyGetOptimalPrice($productID, $quantity = 1, $arUserGroups = array(), $renewal = "N", $arPrices = array(), $siteID = false, $arDiscountCoupons = false)
जैसा कि उपरोक्त कोड से देखा जा सकता है, फ़ंक्शन को टोकरी में माल की लागत की कुल राशि इनपुट के रूप में नहीं मिलती है, लेकिन केवल एक विशिष्ट उत्पाद का डेटा। इसलिए, आपको डेटाबेस को क्वेरी करके बास्केट डेटा प्राप्त करना होगा। क्योंकि चूंकि हैंडलर को टोकरी में उत्पादों की संख्या के आधार पर एक चक्र में कहा जाता है, यह एक वैश्विक चर को परिभाषित करने के लिए समझ में आता है जिसमें हम टोकरी की सामग्री की कुल मात्रा को रिकॉर्ड करेंगे जब हम पहली बार ऑनगेट ओप्टीमलप्राइस हैंडलर कहते हैं।
आउटपुट कुछ इस तरह होना चाहिए:
वैश्विक $ लोकलप्राइस;
$ लोकलप्रीस = 0;
फ़ंक्शन MyGetOptimalPrice ($ productID, $ मात्रा = 1, $ arUserGroups = array (), $ नवीकरण = "N", $ arPrices = array (), $ siteID = false, $DDiscountCoupons = false)
{
वैश्विक $ लोकलप्राइस;
अगर ($ लोकलप्राइस <= 0)
{
// वर्तमान उपयोगकर्ता के लिए वर्तमान टोकरी प्राप्त करें
$ dbBasketItems = CSaleBasket :: GetList (झूठा,
सरणी (
"FUSER_ID" => CSaleBasket :: GetBasketUserID (),
"LID" => SITE_ID,
"ORDER_ID" => "NULL"
)
झूठी,
झूठी,
सरणी ("ID", "MODULE", "PRODUCT_ID", "CALLBACK_FUNC", "गुणवत्ता", "DELAY", "CAN_BUY", "PRICE")
);
जबकि ($ arItem = $ dbBasketItems-> Fetch ())
{
if ($ arItem ['DELAY'] == 'N' && $ arItem ['CAN_BUY'] == 'Y')
{
$ LocalPrice + = $ arItem ['PRICE'] * $ arItem ['QUANTITY'];
}
}
}
// ऑप्ट 1, 10,000 रूबल तक की ऑर्डर राशि के साथ
// ऑप्ट 2, 20,000 रूबल तक की ऑर्डर राशि के साथ
// OPT 3, 20,000 से अधिक रूबल की ऑर्डर राशि के साथ
// इस उत्पाद के लिए सभी प्रकार की कीमतें संभव हैं
$ arOptPrices = CCatalogProduct :: GetByIDEx ($ productID);
अगर ($ लोकलप्राइस <10000) {
$ मूल्य = $ arOptPrices ['मूल्य'] [1] ['मूल्य'];
$ कैटलॉग_ग्रुप_िड = 1;
}
अन्य ($ LocalPrice> = 10000 और $ LocalPrice <20000) {
$ मूल्य = $ arOptPrices ['मूल्य'] [2] ['मूल्य'];
$ कैटलॉग_ग्रुप_िड = 2;
}
अन्य ($ लोकलप्राइस> = २००००) {
$ मूल्य = $ arOptPrices ['कीमतें'] [3] ['मूल्य'];
$ कैटलॉग_ग्रुप_िड = 3;
}
वापसी सरणी (
'मूल्य' => सरणी (
"ID" => $ productID,
'CATALOG_GROUP_ID' => $ कैटलॉग_ग्रुप_आईडी,
'मूल्य' => $ मूल्य,
'CURRENCY' => "RUB",
'ELEMENT_IBLOCK_ID' => $ productID,
'VAT_INCLUDED' => "Y":
)
'छूट' => सरणी (
'VALUE' => $ छूट,
'CURRENCY' => "RUB",
)
);
}
यदि आप चाहें, तो आप मूल्य के नमूने को संग्रहीत करने के लिए कैशिंग जोड़कर कोड को अनुकूलित कर सकते हैं, शर्तों की हार्ड-कोड सेटिंग से छुटकारा पा सकते हैं और शर्तों को कॉन्फ़िगरेशन फ़ाइलों या डेटाबेस में स्थानांतरित कर सकते हैं। सिद्धांत रूप में, टोकरी से डेटा का बहुत चयन हैंडलर फ़ंक्शन के दायरे के बाहर भी लिया जा सकता है और सत्र, कुकीज़ या एक वैश्विक चर (जैसा कि आप इसे पसंद करते हैं और सही मानते हैं) में कहीं न कहीं धागे के योग को संग्रहीत करते हैं। बेशक, एक केस स्टडी के लिए मैंने यह सब करना शुरू नहीं किया। स्वास्थ्य के लिए उपयोग करें!