Làm thế nào để kiểm tra nếu hóa đơn và địa chỉ giao hàng bằng nhau?


16

Tôi đang cố kiểm tra xem địa chỉ thanh toán và giao hàng có bằng nhau không khi tạo tệp PDF hóa đơn.

Những gì tôi đã thử cho đến nay là:

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

hoặc là

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

Nhưng không hoạt động. Tôi cũng đã cố gắng để có được báo giá bằng cách sử dụng $order->getQuote()nhưng điều đó cũng không hoạt động.

Có cách nào để kiểm tra xem hóa đơn và địa chỉ giao hàng có bằng nhau không?

Câu trả lời:


10

Sử dụng mảng_diff.

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

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

tham chiếu: http://us3.php.net/array_diff

bạn có thể phải loại bỏ một số dữ liệu của từng mảng, trước khi tìm khác biệt. Tôi chắc chắn bạn có thể làm việc đó;)


2
Mặc dù điều này sẽ hoạt động trong hầu hết các trường hợp thực tế, nhưng đó là array_diff_assocvì mảng_diff chỉ so sánh các giá trị, vì vậy, nếu bạn ví dụ đổi tên và họ, các địa chỉ sẽ vẫn được coi là bằng nhau
Fabian Schmengler

7

Mặc dù đã có câu trả lời được chấp nhận, tôi muốn chia sẻ giải pháp này mà tôi đã thấy (tương tự) một lần trong mô-đun của bên thứ 3:

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

Sau đó được gọi là:

$shippingAddress = $invoice->getShippingAddress();

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

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

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

5

Được rồi, đây là nỗ lực của tôi theo đề xuất của 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
}

Về cơ bản, tôi đang loại bỏ một số khóa bằng cách sử dụng một $excludeKeysmảng, do đó array_diffsẽ chỉ so sánh các dữ liệu liên quan. Để loại bỏ một số khóa mà không phải tạo vòng lặp, tôi đang sử dụng array_diff_keykết hợp với array_flipđể loại bỏ các khóa mảng không cần thiết.

Cải tiến và phản hồi chào mừng. :)


1
Mặc dù điều này sẽ hoạt động trong hầu hết các trường hợp thực tế, nhưng điều đó là array_diff_assocdo mảng_diff chỉ so sánh các giá trị, vì vậy nếu bạn ví dụ chuyển tên và họ, thì các địa chỉ sẽ vẫn được coi là bằng nhau.
Fabian Schmengler

3

Bạn cần lấy báo giá bằng cách sử dụng

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

Sau đó, bạn có thể lấy địa chỉ giao hàng từ báo giá và kiểm tra xem địa chỉ đó có được đánh dấu giống với địa chỉ thanh toán không:

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

Trường hợp nó được đánh dấu là như nhau? Có vẻ như nó không hoạt động đối với tôi, bởi vì khách hàng luôn có nó được đánh dấu giống nhau ngay cả khi địa chỉ mặc định rõ ràng khác nhau.
TheKitMurkit

0

phải so sánh các địa chỉ - một trong số chúng vừa được tạo (chưa được lưu). Có lẽ nó giúp được ai đó:

dựa trên câu trả lời của @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

Tôi đang sử dụng phương pháp sau kể từ khi tôi đăng phiên bản ở trên và nó hoạt động với tôi - nghĩ rằng nó có thể giúp được ai đó:

/**
 * 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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.