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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
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 }

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class AnagraficaForm extends BaseAnagraficaForm
{
   public function configure()
  { 
 
     // get Related Object model
     $caratteristica = $this->getObject()->getCaratteristica();
 
      if (is_null($caratteristica)) {
	$caratteristica = new Caratteristica();
	$caratteristica->setAnagrafica($this->getObject());
	$this->getObject()->setCaratteristica($caratteristica);
    }
    $caratteristica_form = new CaratteristicaForm($caratteristica);
    $this->embedForm('Caratteristica',  $caratteristica_form);
 
     parent::configure();
  }
}

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
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-&gt;getPrimaryKey());
    CaratteristicaMalattiaPeer::doDelete($c, $con);
 
    $values = $values['caratteristica_malattia_list'];
 
    if (is_array($values))
    {
      foreach ($values as $value)
      {
        $obj = new CaratteristicaMalattia();
        $obj->setCaratteristicaId($this->object->getPrimaryKey());
        $obj->setMalattiaId($value);
        $obj->save();
      }
    }
  }
}

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.

The “symfony Forms in Action” book is online

Con questo annuncio dal blog ufficiale del noto framework ad oggetti PHP, che sta per raggiungere la maturità nella nuova versione 1.1, viene annunciato finalmente un primo assaggio (ma fondamentale) di quello che sarà il nuovo libro dedicato al sotto framework per le Form nuovo di zecca.

Per lo sviluppo, questo nuovo framework è una manna dal cielo ed agganciandosi alla perfezione con Symfony, lo portano nell’olimpo dei Framework PHP, superando a piè pari tutte le limitazioni (tante volte incredibili assenze) della versione 1.0 (oltre a gli helpers non c’era quasi niente per gestire in MVC le forms).

I capitoli rilasciati sono questi:

Sicuramente buonissimi per iniziare a sviluppare, ma per i più intrepidi, ci sarà da aspettare ancora un po che vengano rilasciati i nuovi capitoli, anche se farsi un giro nelle API (tra l’altro anche questa sezione totalmente rinnovata) può rendere tutto più semplice :)

Per chi invece (come me…) non è riuscito ad andare al PHPDAY, può gustarsi il talk di Fabien sul nuovo framework da qui.

Per ora è tutto, spero di mantenero il blog un pochino più aggiornato e raccontare un pò del mio nuovo lavoro :)

Rilasciato Symfony 1.1 Beta 2

Ci siamo, finalmente una nuova versione del ramo 1.1 vede la luce, si puo definire una reale beta, infatti le API del framework ora sono stabili e non verranno ulteriormento modificate, si procedere ora al testing, debugging e aggiornamento documentazione, stringendo definitvamente i tempi in 1 mese o 2 ci sarà il rilascio della versione stabile.

Non aggiungo altro, potete vedere qui tutte le novità introdotte con questa nuova release.

Symfony 1.1 in Beta

Dopo duri mesi di lavoro, finalmente è arrivata la prima Beta del tanto atteso rilascio 1.1, la principale novità di questo rilascio è l’arrivo di una nuova serie di classi sfConfiguration che vanno a rimpiazzare completamente il vecchio sistema di configurazione, basato su file statici (config.php ad esempio).

Il nuovo sistema ha permesso, oltre a superare un problema molto grave nella registrazione dei Plugin e delle route nel ramo 1.1, anche di avere maggiore flessibilità a runtime per quanto riguarda le configurazioni del core.

 Qui trovate tutta la documentazione necessaria per fare l’upgrade del vostro progetto 1.x alla versione 1.1 (anche se ovviamente essendo ancora in beta vi consiglio di non usarlo in produzione, come dice lo stesso Fabien anche se ben 7700 test vengono superato senza problemi), mentre qui il repository dove potete fare il checkout del codice.

Oramai i pezzi ci sono tutti, sono sicuro che in meno di 2 settimane, ci sarà definitivamente il rilascio almeno di una RC per poi passare in Stable quando anche la documentazione sarà completamente aggiornata.

Per i più curiosi, consiglio di farsi un giro nella documentazione delle API 1.1 

Che posso dire, oltre ringraziare il team di Symfony per il tempo e il denaro che stanno investendo sul progetto, che sta diventando sempre di più il riferimento Enterprise dello sviluppo PHP.

Next Page →

  • Cerca


  • About me

    Benvenuto nel mio Blog, un piccolo spazio virtuale in continua evoluzione che mi permette di condividere con voi tutto ciò che ritengo interessante. Sentiti libero di esplorare liberamente ogni contenuto di questo sito. Se vuoi altre informazioni su di me, puoi scaricare qui il mio curriculum aggiornato. Oppure scrivimi

  • Iscriviti ai feed

  • Archivi