Symfony 1.2: Salvare relazioni M-M con admin generator ed Embedded Forms

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):
  1. Schema con 1 relazione M-M
  2. Modulo generato con l'admin generator
  3. Embed sulla form principale di un'altra form a cui è associata la relazione M-M (Category <-> Article)
Quindi prendiamo questo schema:
  1. anagrafica: 
  2. id: ~
  3. nome: { type: varchar(255), required: true }
  4. cognome: { type: varchar(255), required: true }
  5. sesso: { type: varchar(255), required: true }
  6. eta: { type: integer, required: true }
  7. caratteristica_id: ~
  8.  
  9. caratteristica:
  10. id: ~
  11. nome: { type: varchar(255), required: true }
  12.  
  13. malattia:
  14. id: ~
  15. nome: { type: varchar(255), required: true }
  16.  
  17. caratteristica_malattia:
  18. caratteristica_id: { type: integer, foreignTable: caratteristica, foreignReference: id, required: true, primaryKey: true, onDelete: cascade }
  19. malattia_id: { type: integer, foreignTable: malattia, foreignReference: id, required: true, primaryKey: true, onDelete: cascade }
2) Generiamo un modulo di amministrazione per la tabella Anagrafica:
  1. symfony propel:generate-admin Anagrafica --module=anagrafica
3) Facciamo l'embed dal modulo anagrafica della form caratteristica:
  1. class AnagraficaForm extends BaseAnagraficaForm
  2. {
  3. public function configure()
  4. {
  5.  
  6. // get Related Object model
  7. $caratteristica = $this->getObject()->getCaratteristica();
  8.  
  9. if (is_null($caratteristica)) {
  10. $caratteristica = new Caratteristica();
  11. $caratteristica->setAnagrafica($this->getObject());
  12. $this->getObject()->setCaratteristica($caratteristica);
  13. }
  14. $caratteristica_form = new CaratteristicaForm($caratteristica);
  15. $this->embedForm('Caratteristica', $caratteristica_form);
  16.  
  17. parent::configure();
  18. }
  19. }
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:
  1. class CaratteristicaForm extends BaseCaratteristicaForm
  2. {
  3.  
  4. public function updateObject($values = null)
  5. {
  6. $this->updateCaratteristicaMalattia();
  7. parent::updateObject($values);
  8. }
  9.  
  10. public function updateCaratteristicaMalattie() {
  11. $con = $this->getConnection();
  12. $c = new Criteria();
  13. $c->add(CaratteristicaMalattiaPeer::CARATTERISTICA_ID, $this->object-&gt;getPrimaryKey());
  14. CaratteristicaMalattiaPeer::doDelete($c, $con);
  15.  
  16. $values = $values['caratteristica_malattia_list'];
  17.  
  18. if (is_array($values))
  19. {
  20. foreach ($values as $value)
  21. {
  22. $obj = new CaratteristicaMalattia();
  23. $obj->setCaratteristicaId($this->object->getPrimaryKey());
  24. $obj->setMalattiaId($value);
  25. $obj->save();
  26. }
  27. }
  28. }
  29. }
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.

1 comment for 'Symfony 1.2: Salvare relazioni M-M con admin generator ed Embedded Forms'

anonimo's picture

non ti cospargere troppo la

non ti cospargere troppo la testa si cenere pero!!! dopo ti pia la coccia!!!:-)

Post new comment

The content of this field is kept private and will not be shown publicly. If you have a Gravatar account, used to display your avatar.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <quote> <blockquote>
  • Lines and paragraphs break automatically.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <pre>, <c>, <cpp>, <drupal5>, <drupal6>, <java>, <javascript>, <php>, <python>, <ruby>. The supported tag styles are: <foo>, [foo].

More information about formatting options

By submitting this form, you accept the Mollom privacy policy.