Symfony 1.2: Salvare relazioni M-M con admin generator ed Embedded Forms
Submitted by paolomainardi on Mon, 02/09/2009 - 01:10
Last updated on Fri, 10/29/2010 - 00:16
Scusate per il titolo criptico, ma non trovato altro modo per semplificare la questione che mi ha fatto perdere non poco tempo.
La questione è questa (caso base):
2) Generiamo un modulo di amministrazione per la tabella Anagrafica:
3) Facciamo l'embed dal modulo anagrafica della form caratteristica:
3) A questo punto, la form è completa, sulla form Anagrafica avremo la form caratteristica correttamente "embeddata", l'unico problema (che è poi il cuore di questo articolo) è che la relazione M-M non verrà correttamente salvata.
Perchè ? In realtà ci sono già alcuni ticket aperti:
http://trac.symfony-project.org/ticket/4850
Quando la form embeddata viene salvata, non viene chiamata la funzione doSave(), ma l'oggetto viene salvato direttamente, è stata proposta la patch di cui sopra, ma il buon Fabien ci fa sapere che in questo caso è bene utilizzare l'override della funzione updateObject(), quindi la soluzione potrebbe essere questa:
Dove la funzione updateCaratteristicaMalattie() non è altro che un piccolo refactoring della funzione "saveCelgeneCaratteristicaMalattiaList()" che gia troviamo nella classe "BaseCaratteristicaForm".
Non aggiungo altro, qui c'è tutto per risolvere questo strano comportamento di sfPropel.
- Schema con 1 relazione M-M
- Modulo generato con l'admin generator
- Embed sulla form principale di un'altra form a cui è associata la relazione M-M (Category <-> Article)
anagrafica: id: ~ nome: { type: varchar(255), required: true } cognome: { type: varchar(255), required: true } sesso: { type: varchar(255), required: true } eta: { type: integer, required: true } caratteristica_id: ~ caratteristica: id: ~ nome: { type: varchar(255), required: true } malattia: id: ~ nome: { type: varchar(255), required: true } caratteristica_malattia: caratteristica_id: { type: integer, foreignTable: caratteristica, foreignReference: id, required: true, primaryKey: true, onDelete: cascade } malattia_id: { type: integer, foreignTable: malattia, foreignReference: id, required: true, primaryKey: true, onDelete: cascade }
symfony propel:generate-admin Anagrafica --module=anagrafica
class AnagraficaForm extends BaseAnagraficaForm { public function configure() { // get Related Object model $caratteristica = $this->getObject()->getCaratteristica(); $caratteristica = new Caratteristica(); $caratteristica->setAnagrafica($this->getObject()); $this->getObject()->setCaratteristica($caratteristica); } $caratteristica_form = new CaratteristicaForm($caratteristica); $this->embedForm('Caratteristica', $caratteristica_form); parent::configure(); } }
class CaratteristicaForm extends BaseCaratteristicaForm { public function updateObject($values = null) { $this->updateCaratteristicaMalattia(); parent::updateObject($values); } public function updateCaratteristicaMalattie() { $con = $this->getConnection(); $c = new Criteria(); $c->add(CaratteristicaMalattiaPeer::CARATTERISTICA_ID, $this->object->getPrimaryKey()); CaratteristicaMalattiaPeer::doDelete($c, $con); $values = $values['caratteristica_malattia_list']; { foreach ($values as $value) { $obj = new CaratteristicaMalattia(); $obj->setCaratteristicaId($this->object->getPrimaryKey()); $obj->setMalattiaId($value); $obj->save(); } } } }

1 comment for 'Symfony 1.2: Salvare relazioni M-M con admin generator ed Embedded Forms'
non ti cospargere troppo la
non ti cospargere troppo la testa si cenere pero!!! dopo ti pia la coccia!!!:-)
Post new comment