Как проверить, равны ли выставление счетов и доставки?
-
16-10-2019 - |
Вопрос
Я пытаюсь проверить, равны ли выставление счетов и доставки при создании PDF -файлов.
Я пробовал до сих пор:
$order = $invoice->getOrder();
if( $order->getBillingAddress()->getData() != $order->getShippingAddress()->getData() )
или же
$order = $invoice->getOrder();
if( $order->getShippingAddress()->getData('same_as_billing')!='1' )
Но ни один не работает. Я также пытался получить цитату, используя $order->getQuote()
Но это тоже не сработало.
Есть ли способ проверить, равны ли выставление счетов и доставки?
Решение 3
Итак, вот моя попытка после предложения 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
Чтобы избавиться от ненужных клавиш массива.
Улучшения и обратная связь приветствуются. :)
Другие советы
Используйте array_diff.
$order = $invoice->getOrder();
$billing = $order->getBillingAddress()->getData();
$shipping = $order->getShippingAddress()->getData();
$diff = array_diff($billing,$shipping);
ref: http://us3.php.net/array_diff
Возможно, вам придется лишить некоторые данные каждого массива, перед Diff. Я уверен, что вы можете решить это;)
Несмотря на то, что уже есть общепринятый ответ, я хотел бы поделиться этим решением, которое я видел (аналогично) один раз в стороннем модуле:
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;
}
}
Вам нужно получить цитату, используя
$order = $invoice->getOrder();
$quote = Mage::getModel('sales/quote')->load($order->getQuoteId());
Затем вы можете получить адрес доставки из цитаты и проверить, помечен ли он как такой же, как и платежный адрес:
if($quote->getShippingAddress()->getSameAsBilling()){
// do stuff
}
Пришлось сравнивать адреса - один из них был только что создан (не сохранен). Возможно, это поможет кому -то:
на основе @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);
}