2012-05-29 9 views
7

Ich entwickle ein benutzerdefiniertes Magento-Modul, das eine Liste von E-Mail-Adressen in einer benutzerdefinierten Tabelle speichern muss. Der entsprechende Code sieht wie folgt aus:

foreach($this->getNewSubscriptionsForAPI() as $email){ 
      $requestModel->setEmail($email); 
      $requestModel->setAction('subscribe'); 
      $requestModel->setPosted(date('Y-m-d H:i:s')); 
      $requestModel->save(); 
     } 

Die getNewSubscriptionsForAPI() Methode gültige Daten zurückgibt, und die $requestModel ist ein gültiges Magento-Modell.

Wenn diese Schleife ausgeführt wird, überschreibt der Datenbankadapter jedoch einfach jeden Datensatz über dem vorherigen. Dh, wenn ich in phpMyAdmin wiederholt auf 'browse' klicke, kann ich verschiedene E-Mail-Adressen sehen, die in die Datenbank geschrieben werden, aber immer in derselben Zeile, wobei der vorherige Eintrag überschrieben wird. Das ID-Feld ist korrekt eingerichtet: als Primärschlüssel auf AUTO_INCREMENT gesetzt und als ID-Feld im Ressourcenmodell gekennzeichnet.

Interessant ist, dass ich die Schleife oben verwenden kann, um aufeinanderfolgende Datensätze in der Kern newsletter/subscriber Tabelle ohne Problem zu schreiben.

konnte ich natürlich, einfach unset() das Modell und bekommen es wieder aus dem Mage::getModel() bei jedem Zyklus der Schleife, aber das (a) scheint äußerst verschwenderisch, und (b) verdirbt meine Dependency Injection-Setup für den Test (wo ich nicht möchte, dass der Code seine eigenen Modelle instanziiert, sondern die verwendet, die ich an ihn weitergebe).

Kann mir jemand in die richtige Richtung zeigen?

+0

Warum wurde das abgelehnt ?! – MJA

Antwort

13

Wenn Magento ein neues Objekt speichert, generiert es automatisch eine ID für das Objekt. Nachdem Sie das Objekt gespeichert haben, wird eine ID generiert. Damit Magento Ihre Daten wieder als neues Modell erkennt, müssen Sie lediglich das Modell id deaktivieren. Ich denke jedoch, unsetData ist eleganter, da es auch alle Daten löscht, die für das vorherige Objekt erstellt worden sein könnten :-).

6

Ah, es scheint, als ob ich meine eigene Frage beantwortet haben könnte. Durch Einbeziehen eines Anrufs zu $requestModel->unsetData(); unmittelbar nach dem Anruf zu $requestModel->save() arbeitet die Schleife wie beabsichtigt.

unsetData ist eine Methode, die von Varien_Object zur Verfügung gestellt wird, von der Mage_Core_Model_Abstract erbt.

Ich freue mich für jemanden, der eine elegantere Lösung beisteuern kann. Ich freue mich, das zu hören.

1

Ich weiß nicht, ob dies eleganter ist oder nicht, aber es ist gelungen, Ihr Problem mit diesem Code zu lösen. Bei jeder Schleife wird eine neue Zeile mit den neuen Informationen hinzugefügt.

Betrachtet man "E-Mail", "Aktion" und "gepostet" sind die Feldnamen Ihrer Datenbanktabelle.

Verwandte Themen