Как я могу программно создать и получить платежный адрес по умолчанию?


Наш сайт импортирует клиентов из внешних источников данных. Частью этого импорта является создание платежного адреса по умолчанию из внешних данных, если такового не существует.

Я следовал советам по другим вопросам, а также учебным пособиям, все из которых, похоже, говорят одно и то же для создания/сохранения платежного адреса по умолчанию. Это , похоже, работает, по крайней мере, частично.

// $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

Ссылки

Варианты этого метода создания/установки адреса клиента по умолчанию были найдены в следующих местах:

Author: Community, 2015-03-11

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();
}
 4
Author: Jeroen, 2015-03-11 12:30:11

Я столкнулся именно с этой проблемой. Сложность заключается в том, что в показанном вами коде нет ничего плохого - проблема заключается в пропущенном коде перед ним (как вы загружаете $c).

Крайне важно, чтобы вы перезагрузили модель клиента до $c->getPrimaryBillingAddress(). В моем случае это было связано с тем, что я загружал продукт с помощью вызова [collection]->getFirstItem(), который, по-видимому, не загружал адрес (я не дошел до источника проблемы, как только она была исправлена). Я исправил это, добавив следующее код перед вызовом $c->getPrimaryBillingAddress() (ваша первая строка):

$c = Mage::getModel('customer/customer')->load($c->getId());

(как бы ужасно бессмысленно это ни казалось).

Ваша ситуация, по-видимому, была бы такой же, но я не могу быть уверен, не увидев, как $c был изначально загружен.

Ваша проблема, скорее всего, уже давно решена или обойдена, но я подумал, что этот ответ может быть полезен для таких, как я, которые наткнулись на него с такими же запутанными симптомами. Проблема в том, что, хотя все ответы в Интернете являются правильным кодом, все они неявно полагайтесь на то, что модель клиента загружается напрямую.

 1
Author: C. Brown, 2016-06-16 14:56:03