จะตรวจสอบได้อย่างไรว่าที่อยู่การเรียกเก็บเงินและที่อยู่จัดส่งเท่ากัน?


16

ฉันกำลังพยายามตรวจสอบว่าที่อยู่สำหรับการเรียกเก็บเงินและที่อยู่จัดส่งเท่ากับเมื่อสร้าง PDF ใบแจ้งหนี้หรือไม่

สิ่งที่ฉันพยายามมาแล้วคือ:

$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 เปรียบเทียบค่าเท่านั้นดังนั้นหากคุณเปลี่ยนชื่อและนามสกุลตัวอย่างเช่นที่อยู่จะยังคงได้รับการปฏิบัติเหมือนกัน
เฟเบียน Schmengler

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

แก้ไข 20 01 2016

ฉันใช้วิธีการต่อไปนี้ตั้งแต่ฉันโพสต์รุ่นด้านบนและใช้งานได้สำหรับฉัน - คิดว่ามันอาจช่วยคน:

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