यदि बिलिंग और शिपिंग पता बराबर हैं तो कैसे जांचें?


16

मैं यह जांचने की कोशिश कर रहा हूं कि चालान पीडीएफ बनाते समय बिलिंग और शिपिंग पता बराबर है या नहीं।

मैंने अब तक क्या कोशिश की है:

$order = $invoice->getOrder();
if( $order->getBillingAddress()->getData() != $order->getShippingAddress()->getData() )

या

$order = $invoice->getOrder();
if( $order->getShippingAddress()->getData('same_as_billing')!='1' )

लेकिन न तो काम करता है। मैं भी प्रयोग करके बोली प्राप्त करने की कोशिश कर रहा था, $order->getQuote()लेकिन यह भी काम नहीं किया।

क्या बिलिंग और शिपिंग पते समान हैं या नहीं, इसकी जांच करने का कोई तरीका है?

जवाबों:


10

Array_diff का उपयोग करें।

$order = $invoice->getOrder();
$billing = $order->getBillingAddress()->getData();
$shipping = $order->getShippingAddress()->getData();

$diff = array_diff($billing,$shipping);

रेफरी: http://us3.php.net/array_diff

आपको अंतर से पहले प्रत्येक सरणी के कुछ डेटा को अलग करना पड़ सकता है। मुझे यकीन है कि आप इसे काम कर सकते हैं;)


2
हालांकि यह लगभग सभी व्यावहारिक मामलों में काम करेगा, यह array_diff_assocइसलिए होना चाहिए क्योंकि array_diff केवल मूल्यों की तुलना करता है, इसलिए यदि आप उदाहरण के लिए पहले नाम और अंतिम नाम स्विच करते हैं, तो पते अभी भी समान होंगे
Fabian Schmengler

7

हालांकि पहले से ही एक स्वीकृत जवाब है, मैं इस समाधान को साझा करना चाहता हूं जिसे मैंने (समान) एक बार तृतीय पक्ष मॉड्यूल में देखा था:

function serializeAddress(Mage_Sales_Model_Quote_Address $address)  {  
        return serialize(
            array(
                 'firstname' => $address->getFirstname(),
                 'lastname'  => $address->getLastname(),
                 'street'    => $address->getStreet(),
                 'city'      => $address->getCity(),
                 'postcode'  => $address->getPostcode(),
                 //add the attributes you want to check for here for ex. company,...
            )
        );
}

जिसे तब कहा गया था:

$shippingAddress = $invoice->getShippingAddress();

if (!$shippingAddress->getSameAsBilling()) {

     $shippingData = $this->serializeAddress($shippingAddress);
     $billingData = $this->serializeAddress($invoice->getBillingAddress());

     if (strcmp($shippingData, $billingData) != 0) {
        return false;
     }
}

5

ठीक है, तो यहाँ ProxiBlue के सुझाव के बाद मेरा प्रयास है:

$excludeKeys = array('entity_id', 'customer_address_id', 'quote_address_id', 'region_id', 'customer_id', 'address_type');
$oBillingAddress = $order->getBillingAddress()->getData();
$oShippingAddress = $order->getShippingAddress()->getData();
$oBillingAddressFiltered = array_diff_key($oBillingAddress, array_flip($excludeKeys));
$oShippingAddressFiltered = array_diff_key($oShippingAddress, array_flip($excludeKeys));

$addressDiff = array_diff($oBillingAddressFiltered, $oShippingAddressFiltered);

if( $addressDiff ) { // billing and shipping addresses are different
    // Print stuff
}

मूल रूप से मैं एक $excludeKeysसरणी का उपयोग करके कुछ चाबियाँ निकाल रहा हूं , इसलिए array_diffकेवल प्रासंगिक डेटा की तुलना की जाएगी। एक लूप बनाने के बिना कई चाबियाँ निकालने के लिए, मैं अनावश्यक सरणी कुंजियों से छुटकारा पाने के लिए array_diff_keyसंयोजन में उपयोग कर रहा हूं array_flip

सुधार और प्रतिक्रिया का स्वागत करते हैं। :)


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

3

आपको उद्धरण का उपयोग करने की आवश्यकता है

$order = $invoice->getOrder();
$quote = Mage::getModel('sales/quote')->load($order->getQuoteId());

फिर आप उद्धरण से शिपिंग पता प्राप्त कर सकते हैं और जांच सकते हैं कि क्या यह बिलिंग पते के समान है:

if($quote->getShippingAddress()->getSameAsBilling()){
    // do stuff
}

इसे कहां से चिह्नित किया जा रहा है? ऐसा लगता है कि यह मेरे लिए काम नहीं कर रहा है, क्योंकि ग्राहक ने हमेशा इसे उसी तरह से चिह्नित किया है, भले ही डिफ़ॉल्ट पते स्पष्ट रूप से भिन्न हों।
TheKitMurkit

0

पते की तुलना करना था - उनमें से एक बस बनाया गया था (बचाया नहीं गया)। शायद यह किसी की मदद करता है:

@Alphawolf जवाब पर आधारित:

public function isDifferentAddresses(Mage_Customer_Model_Address $adr1, Mage_Customer_Model_Address $adr2, array $excludeKeys = array())
{
    if (!count($excludeKeys)) {
        $excludeKeys = array(
            'entity_id',
            'entity_type_id',
            'attribute_set_id',
            'is_active',
            'increment_id',
            'parent_id',
            'created_at',
            'updated_at',
            'customer_id',
            'customer_address_id',
            'quote_address_id',
            'region_id',
            'address_type',
            'is_default_billing',
            'is_default_shipping',
            'save_in_address_book'
        );
    }
    $excludeKeys = array_flip($excludeKeys);
    $adr1Filtered = array_diff_key($adr1->getData(), $excludeKeys);
    $adr2Filtered = array_diff_key($adr2->getData(), $excludeKeys);
    $diff = array_diff_assoc($adr1Filtered, $adr2Filtered); 
    return !empty($diff);
}

EDIT 20 01 2016

निम्नलिखित विधि का उपयोग करके im जब से मैंने संस्करण को पोस्ट किया है और यह मेरे लिए काम करता है - सोचा कि यह किसी की मदद कर सकता है:

/**
 * returns if address 1 is different to address 2
 *
 * @param Mage_Customer_Model_Address $adr1
 * @param Mage_Customer_Model_Address $adr2
 * @param array                       $excludeKeys
 *
 * @return bool
 */
public function isDifferentAddresses(Mage_Customer_Model_Address $adr1,
    Mage_Customer_Model_Address $adr2, array $excludeKeys = array()
) {
    if (!count($excludeKeys)) {
        $excludeKeys = array(
            'prefix',
            'suffix',
            //'region',
            //'region_id',
            'entity_id',
            'vat_id',
            'entity_type_id',
            'attribute_set_id',
            'is_active',
            'increment_id',
            'parent_id',
            'created_at',
            'updated_at',
            'customer_id',
            'customer_address_id',
            'quote_address_id',
            'address_type',
            'is_default_billing',
            'is_default_shipping',
            'save_in_address_book'
        );
    }
    $excludeKeys = array_flip($excludeKeys);
    $adr1Filtered = array_diff_key($adr1->getData(), $excludeKeys);
    $adr2Filtered = array_diff_key($adr2->getData(), $excludeKeys);
    $diff = array_diff_assoc($adr1Filtered, $adr2Filtered);
    return !empty($diff);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.