Newsgroup: it.comp.www.php
Titolo: [ZF1.11] Passaggio da sito semplice a gestione moduli

Salve a tutti
 
	Su un sito che sto completando ho sempre gestito i controller, le view 
e il resto delle pagine in maniera semplice mettendo tutto nelle 
cartelle di default che si generano con il progetto.
Poi la scorsa settimana un collega mi ha chiesto alcune implementazioni 
che ho fatto per metterle da lui e io ho subito capito di essere in 
leggera difficoltï¿œ. Non perchï¿œ la cosa non si possa fare, anzi, ma 
perchï¿œ richiede comunque un certo lavoro di personalizzazione.
Percui mi ï¿œ venuta l'idea di rendere ogni parte extra un modulo e 
lasciare le parti comuni nella struttura attuale.
 
Vorrei sapere da qualcuno piï¿œ esperto se e come affronterebbe il problema.
 
Es: un modulo comune per le news sfrutta la tabella e le risorse comuni 
per gli utenti e la login(quest'ultima potrebbe essere tra l'altro un 
altro modulo), ma sarebbe utile che se io consegnassi la cartella/modulo 
"News" al collega, lui cambiando ad esempio un file di config con il 
nome della tabella utenti e il nome del campo ID, potesse gestire le 
news correttamente(aggiungendo chiaramente le tabelle nel database).
 
Inoltre, come faccio a trasformare i miei controller per fargli gestire 
i dati condivisi e quelli di altri moduli?
 
Mi potete aiutare con qualche documentazione che spiega, se possibile, 
come affrontare un passaggio del genere senza stravolgere tutto?
 
1000 Grazie per l'aiuto e i consigli.

 come affrontare un passaggio del genere senza stravolgere tutto?
 
Senza stravolgere e` difficile, anche perche` c'e` un po' di magia nei 
fallback delle route di ZF, se mischi moduli (con controller, model e 
view) con la struttura non-modulare (controller, model e view nella 
"root").
 
E tieni sempre conto che e` un framework. Non avrai un'integrazione 
automatica dei moduli in altri moduli.
 
La cosa migliore che puoi fare e` definire delle funzionalita` "core" del 
sito (utenti, principalmente, ma anche permessi e poco altro), e tutto il 
resto sara` modulare.
 
Finche` i moduli usano i model del core non ci sono problemi, mentre 
quando iniziano ad interagire tra loro devi studiare un sistema di 
dipendenze, che non e` banale e nemmeno facile da implementare.
 
Un esempio di struttura puo` essere
 
app
  - modules
    - core
      - controllers
      - views 
      - models
    - news
      - controllers
      - views 
      - models
    - ...
 
dentro app/modules/core/models avrai, per esempio, User.php e 
UserList.php:
 
class Core_Model_User extends Zend_Db_TableRow { ... }
class Core_Model_UserList extends Zend_Db_Table { ... }
 
Se usi Zend_Application l'autoloader trovera` i model da solo, se li 
chiami cosi` ({nomemodulo}_Model_{nomemodel}, e i nomi delle directory 
devono essere quelli che ho scritto sopra), altrimenti devi definirti un 
autoloader apposito.
 
A quel punto, in app/news/controller potresti avere qualcosa tipo 
ViewController.php:
 
class News_Controller_ViewController extends Zend_Controller_Action
{
 public function byUserAction()
 {
   $userlist = new Core_Model_UserList();
   $newslist = new News_Model_NewsList();
   $users = $userlist->find();
   foreach ($users as $user) {
     $thisusernews = $newslist->findByUser($user->id);
     ...
   }
 }
}
 
Esempio stupido e poco efficiente, mi rendo conto, ma e` per dare l'idea.
 
Tutto il resto e` roba che devi costruirti tu. Per esempio, se vuoi fare 
un modulo che "estenda" il model User integrando le news, in modo che tu 
possa fare, per esempio
 
foreach ($users as $user) {
 $thisusernews = $user->getAll_News_News();
}
 
puoi, dentro Core_Model_User.php, fare qualcosa tipo:
 
public function __call($f, $params)
{
 if (substr($f, 0, 7) == 'getAll_') {
  $pieces = explode('_', $f);
  $modelname = $pieces[1] . '_Model_' .$pieces[2] .'List';
  $model = new $modelname();
  return $model->find(
   $model->select()->where('uid = ?', $this->id)
  );
 }
}
 
Molto grezza, manca la gestione degli errori ma, come sopra, e` per dare 
l'idea.
 
Naturalmente devi definire delle convenzioni: tutti i model che si 
riferiscono a un utente devono avere il campo "uid" nel DB che contiene 
l'id utente.
 
E se manca il model (o il modulo) ti becchi una bella exception. :)
 
Bye.