Как я могу программно создать и получить платежный адрес по умолчанию?
Наш сайт импортирует клиентов из внешних источников данных. Частью этого импорта является создание платежного адреса по умолчанию из внешних данных, если такового не существует.
Я следовал советам по другим вопросам, а также учебным пособиям, все из которых, похоже, говорят одно и то же для создания/сохранения платежного адреса по умолчанию. Это , похоже, работает, по крайней мере, частично.
// $c is the customer
$data_source = array(
'street' => '',
'city' => '',
'postcode' => '',
);
$a = $c->getPrimaryBillingAddress();
// Create a new default billing if none found
if (!$a)
{
$a = Mage::getModel("customer/address");
$a->setCustomerId($c->getId())
->setIsDefaultBilling('1')
->setSaveInAddressBook('1');
}
foreach ($data_source as $k => $d) $a->setData($k, $d);
$a->save();
После выполнения этого кода адрес отображается на странице клиента в серверная часть и помечена как выставление счетов по умолчанию.
Однако в следующий раз данные извлекаются из нашего внешнего источника и выполняется код,
сохраненный адрес не извлекается (getPrimaryBillingAddress
возвращает false
).
Это приводит к созданию нового адреса при каждом запуске этого кода.
Исключением является случай, когда у клиента есть платежный адрес по умолчанию , установленный magento .
В этом случае getPrimaryBillingAddress
правильно находит адрес, и данные адреса обновляются и сохраненный.
Как я могу программно создать платежный адрес по умолчанию таким образом, чтобы я мог получить его с помощью $customer->getPrimaryBillingAddress()
?
ОБНОВЛЕНИЕ
Получив возможный ответ, я скорректировал код, чтобы задать default_billing
клиента.
Основная проблема сохраняется с изменениями.
$a = $c->getPrimaryBillingAddress();
// Create a new default billing if none found
if (!$a)
{
$a = Mage::getModel("customer/address");
$a->setCustomerId($c->getId()) // <-- variations of customer/customerID
->setCustomer($c) // don't seem to affect
->setIsDefaultBilling('1')
->setSaveInAddressBook('1')
->save(); // <--- SAVE SO WE CAN ACCESS ID
$c->addAddress($a) // <--|
->setDefaultBilling($a->getId()) // <--+ SAVE default_billing IN CUSTOMER
->save(); // <--|
}
foreach ($data_source as $k => $d) $a->setData($k, $d);
$a->save();
// ---------------- SUBSEQUENT RUNS --------------
$c->getDefaultBilling(); // null
$c->getPrimaryBillingAddress(); // false
Ссылки
Варианты этого метода создания/установки адреса клиента по умолчанию были найдены в следующих местах:
2 answers
Вам нужно установить его наоборот. Значение по умолчанию для клиента.
$customerId = 1234; // Customer id
$data = array(); // Address data
$customer = Mage::getModel('customer/customer');
// Load customer
$customer->load($customerId);
// Get current address
$address = $customer->getPrimaryBillingAddress();
// Do we add a new address
$isNewAddress = false;
if (!$address) {
$address = Mage::getModel('customer/address');
$address->setCustomer($customer);
$isNewAddress = true;
}
// Append data
$address->addData($data);
$address->save();
if ($isNewAddress) {
// Add address to customer and save
$customer->addAddress($address)
->setDefaultBilling($address->getId())
->save();
}
Я столкнулся именно с этой проблемой.
Сложность заключается в том, что в показанном вами коде нет ничего плохого - проблема заключается в пропущенном коде перед ним (как вы загружаете $c
).
Крайне важно, чтобы вы перезагрузили модель клиента до $c->getPrimaryBillingAddress()
. В моем случае это было связано с тем, что я загружал продукт с помощью вызова [collection]->getFirstItem()
, который, по-видимому, не загружал адрес (я не дошел до источника проблемы, как только она была исправлена). Я исправил это, добавив следующее код перед вызовом $c->getPrimaryBillingAddress()
(ваша первая строка):
$c = Mage::getModel('customer/customer')->load($c->getId());
(как бы ужасно бессмысленно это ни казалось).
Ваша ситуация, по-видимому, была бы такой же, но я не могу быть уверен, не увидев, как $c
был изначально загружен.
Ваша проблема, скорее всего, уже давно решена или обойдена, но я подумал, что этот ответ может быть полезен для таких, как я, которые наткнулись на него с такими же запутанными симптомами. Проблема в том, что, хотя все ответы в Интернете являются правильным кодом, все они неявно полагайтесь на то, что модель клиента загружается напрямую.