Sviluppare applicazioni Facebook usando Drupal

Sviluppare applicazioni Facebook utilizzando Drupal

View more documents from Stefano Mainardi.

Riporto (con tremendo ritardo) le slides del nostro intervento al PHPDAY e al Drupal Social Club (in forma ridotta).

Read more

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.

La mia nuova casa

Tanto per precisare, il vecchio dominio “mainardipaolo.org” non e’ (purtroppo) piu’ in mio possesso.

Il nuovo nome “www.paolomainardi.com“, se incappate nel mio clone, siete avvertiti, non sono io :)

Creare un social network con Drupal

Erano anni che mi ripromettevo (rimandando in continuazione) di approfondire e di sviluppare qualcosa di un pochino complesso con il CMF in questione, finalmente l’occasione giusta è arrivata (grazie alla nostra piccola startup, Ideato e Mikamai) e solo grazie ad un lavoro di questa portata, siamo riusciti ad apprezzare in pieno, le potenzialità di un framework di sviluppo ben modellato come Drupal, che vanta più di ogni altro, una libreria pressochè immensa di moduli che permettono out-of-the-box di avere immediatamente un mare di funzionalità aggiuntive.

Anche se è da dire che il primo approccio con Drupal, è un esperienza disarmante e frustrante, putroppo la documentazione ufficiale è troppo lacunosa, vengono date per scontate sezioni fondamentali e non esiste un workflow logico da seguire per capire il complesso sistema di Hook e ovverride che il core di Drupal innesca ad ogni chiamata.

Comunque con qualche buon libro e una pagina sempre aperta sulle API (qui documentazione ottima), si riesce in brevtempo ad entrare con semplicità nei meccanismi (tante volte un pochino strani) ed essere subito produttivi.

Tornando al tema del post, come sviluppare un Social Network con Drupal ?

Prima sarebbe da chiederci quali sono le caratteristiche base che un Social network dovrebbe assolutamente avere ?

Ovviamente, senza menzionare i moduli “standard” che non fanno parte del core, ma sono assolutamente indispensabili:

Alcuni moduli, sono un pochino “scarni” di funzionalità, ad esempio Privatemsg, non permette di inviare il messaggio via mail, o selezionare i contatti dalla propria buddylist, per questo ho sviluppato un modulo di estensione:

http://drupal.org/node/293854

Ho avuto da pochi giorni l’accesso al CVS Drupal, appena ho qualche minuto libero, gli darò un posto più dignitoso :)

Che features aggiunge privatemsg-ng ?

  1. Integrazione con OG, Buddylist, User roles (core)
  2. File attachment (viene inviato all’utente insieme al messaggo un link da dove scaricare l’allegato, ovviamente sarà scaricabile solo da chi ha i permessi)
  3. Mailing out integrato con job_queue

Per ora è tutto, se ancora non avete provate Drupal, questo è il momento giusto ;)

Ciau

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