청구 지 주소와 배송 주소가 같은지 확인하는 방법


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

diff 전에 각 배열의 일부 데이터를 제거해야 할 수도 있습니다. 나는 당신이 그것을 해결할 수 있다고 확신합니다.)


2
이것은 거의 모든 실제적인 경우에 효과가 있지만, array_diff_assocarray_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_assocarray_diff는 값만 비교하기 때문입니다. 예를 들어 이름과 성을 전환하는 경우 주소는 여전히 동일하게 취급됩니다.
Fabian 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);
}

2016 년 01 월 20 일 수정

위의 버전을 게시 한 후 다음 방법을 사용하여 메신저가 작동합니다. 누군가에게 도움이 될 것이라고 생각했습니다.

/**
 * 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.