Frage

Unsere Website importiert Kunden aus externen Datenquellen.Ein Teil dieses Imports besteht darin, eine Standard-Rechnungsadresse aus externen Daten zu erstellen, falls keine vorhanden ist.

Ich habe Ratschläge aus anderen Fragen sowie Tutorials befolgt, die alle das Gleiche zum Erstellen/Speichern einer Standard-Rechnungsadresse zu sagen scheinen.Das scheint zumindest teilweise funktionieren.

// $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();

Nachdem dieser Code ausgeführt wurde, ist die Adresse auf der Seite des Kunden im Backend sichtbar und als Standard-Rechnungsadresse markiert.

Die folgenden Zeitdaten werden jedoch aus unserer externen Quelle abgerufen und der Code wird ausgeführt. Die gespeicherte Adresse wird nicht abgerufen (nicht abgerufen (getPrimaryBillingAddress kehrt zurück false).Dadurch wird eine neue Adresse erstellt jedes Mal Dieser Code wird ausgeführt.

Die Ausnahme besteht, wenn ein Kunde eine Standardrechnungsadresse hat von Magento festgelegt.In diesem Fall, getPrimaryBillingAddress findet die Adresse korrekt und die Adressdaten werden aktualisiert und gespeichert.

Wie kann ich programmgesteuert eine Standard-Rechnungsadresse erstellen, sodass ich sie abrufen kann? $customer->getPrimaryBillingAddress()?

AKTUALISIEREN

Nachdem ich eine mögliche Antwort erhalten habe, habe ich den Code angepasst, um ihn an den Kunden anzupassen default_billing.Das Hauptproblem bleibt bei den Änderungen bestehen.

$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

Verweise

An folgenden Stellen wurden Variationen dieser Methode zum Erstellen/Festlegen einer Kundenstandardadresse gefunden:

War es hilfreich?

Lösung

Sie müssen es umgekehrt einstellen.Die default_billing für den Kunden.

$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();
}

Andere Tipps

Ich bin genau auf dieses Problem gestoßen.Der schwierige Teil besteht darin, dass an dem Code, den Sie angezeigt haben, nichts falsch ist. Das Problem liegt im weggelassenen Code davor (wie Sie ihn laden). $c).

Entscheidend ist, dass Sie das Kundenmodell vorher neu laden müssen $c->getPrimaryBillingAddress().In meinem Fall lag es daran, dass ich das Produkt über a geladen habe [collection]->getFirstItem() Anruf - der vermutlich die Adresse nicht geladen hat (ich bin nicht bis zur Ursache des Problems nachgedacht, nachdem es behoben wurde).Ich habe das Problem behoben, indem ich vor dem Aufruf von den folgenden Code hinzugefügt habe $c->getPrimaryBillingAddress() (Ihre erste Zeile):

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

(so schrecklich sinnlos es auch erscheinen mag).

Ihre Situation wäre vermutlich dieselbe, aber ich kann nicht sicher sein, ohne zu sehen, wie $c wurde zunächst geladen.

Ihr Problem ist höchstwahrscheinlich längst gelöst oder umgangen, aber ich dachte, diese Antwort könnte für andere wie mich nützlich sein, die mit den gleichen verwirrenden Symptomen darauf gestoßen sind.Das Problem besteht darin, dass es sich bei allen Online-Antworten zwar um korrekten Code handelt, diese aber implizit darauf basieren, dass das Kundenmodell direkt geladen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top