請求先住所と配送先住所が等しいかどうかを確認する方法は?


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のみの値を比較しているため、あなたがたとえば姓と名を切り替えた場合ので、アドレスはまだ同等として扱われ、
ファビアン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

アドレスを比較する必要がありました-そのうちの1つが作成されました(保存されていません)。おそらくそれは誰かを助ける:

@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

上記のバージョンを投稿して以来、私は次の方法を使用していますが、それは私のために働いています-それは誰かを助けるかもしれないと思った:

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