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.

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.

PHP Google SocialGraph API (Alpha)

Dopo l’annuncio da parte di BigG delle nuove API per la “costruzione” semantica della propria rete di contatti virtuale, ho trovato qualche minuto libero per buttar giù qualche riga in PHP per sfruttare queste nuove interessantissime API.

Potete trovare la pagina del progetto qui:

http://code.google.com/p/php-social-graph/

Al momento è solo una piccola libreria, non ho avuto il tempo di documentarla ne di fare test appronditi, al momento se ci sono programmatori in ascolto che sono interessati, il tutto è rilasciato sotto GPL3, siete i benvenuti :)

Se ancora non sapere cosa sono le SocialGraph, vi consiglio un’ottima introduzione ;)

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