2012-05-29 7 views
7

Sto sviluppando un modulo Magento personalizzato che deve salvare un elenco di indirizzi e-mail in una tabella personalizzata. Il codice in questione è simile al seguente:

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

Il metodo getNewSubscriptionsForAPI() sta tornando dati validi, e la $requestModel è un modello Magento valido.

Quando si esegue questo ciclo, tuttavia, l'adattatore di database sovrascrive semplicemente ciascun record in cima al precedente. Cioè, se premo ripetutamente 'browse' in phpMyAdmin, posso vedere diversi indirizzi email scritti nel database ma sempre nella stessa riga, sovrascrivendo la voce precedente. Il campo id è impostato correttamente: come chiave primaria, impostato su AUTO_INCREMENT e contrassegnato come campo id nel modello risorsa.

Ciò che è interessante è che posso usare il ciclo sopra per scrivere i record successivi nella tabella centrale newsletter/subscriber senza problemi.

ho potuto, ovviamente, semplicemente unset() il modello e farlo di nuovo fuori dalla Mage::getModel() ad ogni ciclo del ciclo, ma questo (a) sembra estremamente dispendiosa, e (b) Spoils mio setup Dependency Injection per la prova (dove non voglio che il codice instanzia i propri modelli, ma usando quelli che passo ad esso).

Qualcuno può indicarmi la giusta direzione?

+0

Perché è stato downvoted ?! – MJA

risposta

13

Quando Magento salva un nuovo oggetto genera automaticamente un ID per l'oggetto. Dopo aver salvato l'oggetto, viene generato un ID. Per fare in modo che Magento riconosca nuovamente i tuoi dati come nuovo modello, devi semplicemente disinserire il modello id. Penso comunque che unsetData sia più elegante in quanto cancella anche tutti i dati che potrebbero essere stati creati per l'oggetto precedente :-).

6

Ah, sembra che possa aver risposto alla mia domanda. Includendo una chiamata allo $requestModel->unsetData(); subito dopo la chiamata allo $requestModel->save(), il ciclo funziona come previsto.

unsetData è un metodo reso disponibile da Varien_Object, da cui Mage_Core_Model_Abstract eredita.

Sono felice che qualcuno possa contribuire con una soluzione più elegante, sono felice di sentirlo.

1

Non so se questo è più elegante o meno, ma è riuscito a risolvere il tuo problema con questo codice. Ad ogni ciclo verrà aggiunta una nuova riga con le nuove informazioni.

Considerando "email", "azione" e "pubblicato" sono i nomi dei campi della tabella del database.

Problemi correlati