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.

SolarPHP: Un nuovo potente framework per PHP5

Ecco il nuovo arrivato, SolarPHP, che si va ad aggiungere alla vasta schiera di Framework Rails-like per PHP.

Attualmente alla versione 1.0.0alpha1 , il framework ricalca esattamente la tipica struttura MVC che gia conosciamo, quindi Controller Modelli e Viste in package separati, un sistema ORM (Solar_sql_model) (ispirato ad ActiveRecord) che si aggancia alla factory Solar_sql che al momento garantisce la compatibliltà con Mysql, Pgsql e Sqlite (nelle prossime versioni sarà aggiunto il supporto ad Oracle e a MsSQL), tutta una serie di classi per le Viste (Solar_View) e ovviamente una serie di Controller (Solar_Controller).

Il tutto sembra molto interessante, ad una prima occhiata il codice è molto pulito e ben strutturato, i package sono molti (interessanti i package di Validazione http://solarphp.com/package/Solar_Filter e l’ORM nativo).

Personalmente non l’ho testato e non penso di farlo a breve termine, ma è sempre bene avere tutto questo codice a portata di mano, sia per studio che per avere ispirazione :)

Il tutto è rilasciato sotto licenza BSD.

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 ;)

sfSpyPlugin: Una spia nelle tue applicazioni

Il buon Francois ha rilasciato qualche giorno fa uno dei plugin IMHO più interessanti mai sviluppati per Symfony, come suggerisce il nome, questo plugin permette di “spiare” nel vero senso della parola i movimenti dell’utente all’interno della nostra applicazione, praticamente facendo il lavoro di molti servizi a pagamento (e anche molto a pagamento) a costo zero, magia di Symfony e dell’ottima libreria JS Jquery.

Il risultato dunque sarà una comoda interfaccia di amministrazione, con tutte le sessioni degli accessi e della navigazione degli utenti, con i tipici comandi che possiamo trovare su una periferica di registrazione come un VCR dunque: Playback, (fast) Rewind/ (fast) Forward e Pausa e la possibilità di etichettarle con un nome. Non è strepitoso ?

Se volete vederlo in azione non perdete questo screencast:

http://screencast.com/t/tnhx8kBl5P1

E la guida di uso e installazione nel wiki di Symfony

Per i più geek a cui piace fare tutto da terminale (mi metto in questo simpatico gruppetto) c’è anche la possibilità di rivedere tutto, invece che con un filmato point-and-click, dal codice.

E’ una vera innovazione, permetterà di tenere traccia in maniera più approfondita di come l’utente realmente interagisce con l’applicazione e quindi tirarne fuori una strategia tra coders e designer di maggiore impatto.

Molti dicono che Symfony è lento, molti altri invece non aspettano altro che buttare fango su PHP, non credo che sia quello il punto, è la creatività il cuore pulsante di ogni progetto e con Symfony di creatività e talento ne abbiamo a volontà.

Al momento ancora non l’ho provato, purtroppo nei miei progetti ho lavorato sempre con prototype che almeno per la versione 1.0.x di Symfony è la libreria di default, ma ho in cantiere alcuni nuovi progetti e sicuramente non mi farò scappare l’occasione di utilizzarla.

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