Как проверить, равны ли платежные и адрес доставки?

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()но это тоже не сработало.

Есть ли способ проверить, совпадают ли адрес выставления счета и адрес доставки?

oschloebe
источник

Ответы:

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

Возможно, вам придется удалить некоторые данные каждого массива перед различий. Я уверен, что вы можете решить это;)

ProxiBlue
источник
2
Хотя это будет работать практически во всех практических случаях, это должно быть array_diff_assocпотому, что array_diff сравнивает только значения, поэтому, если вы, например, поменяете имя и фамилию, адреса будут по-прежнему рассматриваться как равные
Фабиан Шменглер,
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чтобы избавиться от ненужных ключей массива.

Улучшения и отзывы приветствуются. :)

oschloebe
источник
1
Хотя это будет работать практически во всех практических случаях, это должно быть array_diff_assocпотому, что array_diff сравнивает только значения, поэтому, если вы, например, поменяете имя и фамилию, адреса будут по-прежнему рассматриваться как равные.
Фабиан Шменглер
3

Вы должны получить цитату, используя

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

Затем вы можете получить адрес доставки из предложения и проверить, не помечен ли он как адрес для выставления счета:

if($quote->getShippingAddress()->getSameAsBilling()){
    // do stuff
}
gebrial
источник
Где это помечено как то же самое? Кажется, что это не работает для меня, потому что клиент всегда помечает его одинаково, даже если адреса по умолчанию явно разные.
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);
}
cottton
источник