Newsgroup: it.comp.www.php
Titolo: Zend Framework controller e form

ciao a tutti, ho ancora qualche grosso dubbio su come utilizzare zend 
framework.
Sto sviluppando un applicativo in cui gli utenti devono poter manipolare 
una ventina di tabelle. Quindi per ognuna di queste dovrei fare nel 
rispettivo controller la addAction, editAction, deleteAction ecc ecc.
Il codice sarebbe quasi tutto uguale tra le varie classi, quindi ho 
pensato di fare un FormController "globale" a cui passo le richieste con 
un parametro che mi dica di quale tabella voglio la form.
Esempio:
dal metodo addAction del controller della tabella1 ci metto un forward 
al metodo add del controller FormController a cui passo come parametro 
tabella1.
dal metodo addAction del controller della tabella2 ci metto un forward 
al metodo add del controller FormController a cui passo come parametro 
tabella2 ecc ecc.
Nel FormController switcho sul parametro e so quale classe istanziare 
per chiamare la getForm.
Ma questo mi crea un problema con i permessi, perche' se do il permesso 
ad un utente per accedere al metodo add di FormController in realta' 
questo cambiando il parametro accede alle form di TUTTE le tabelle e 
questo non mi va bene.
I permessi sono gia' implementati, per cui se uno arriva dentro la 
addAction del controller di tabella1 significa che ne ha il permesso, 
quindi se potessi chiamare la addAction del FormController passandogli 
un parametro "direttamente" ovvero non via get o post sarei a posto.
Qualcuno mi sa dire come si fa oppure se ci sono metodi migliori per 
fare quello che vorrei?
grazie, ciao
Mauro

 parametro che mi dica di quale tabella voglio la form.
Piuttosto che fare un FormController globale, io farei un "proxy" per le 
tabelle, quindi un "model globale", non accessibile come view, ma appunto 
come model.
Poi nei vari controller, invece di fare un forward dell'action, richiami 
i metodi di questo oggetto (anche statici, al limite), DOPO aver fatto i 
controlli sui permessi dell'utente.
Per esempio in questo proxy potresti avere
static add($table, $data)
{
 $t = new $table();
 $t->add($data);
}
Nelle varie tabelle devi implementare le relative funzioni (add, delete, 
update, ecc. ecc.). Se vuoi puoi "forzarti a farlo" creando una Interface 
e implementandola sia nelle tabelle che nel proxy.
E nel Tabella1Controller lo richiami cosi`:
public addAction()
{
  if (permessi corretti) {
    TableProxy::add("Tabella1", $this->getRequest->getParams());
  } else {
    $this->view->errors[] = "Permessi insufficienti";
  }
}
Naturalmente ho semplificato molto, ma dovresti validare i parametri e 
passargli solo i campi del form che interessano quella tabella.
Bye.

 }
Ciao Alessandro,
grazie mille per la risposta. Forse non mi sono spiegato bene (oppure non 
ho capito la soluzione che mi hai proposto tu), ma non e' questo quello 
di cui ho bisogno.
Seguendo questa guida: 
http://akrabat.com/zend-framework-tutorial/
si trova che nel controller della tabella devi fare dei controlli del 
tipo:
function editAction()
{
    $this->view->title = "Edit album";
    $this->view->headTitle($this->view->title, 'PREPEND');
    $form = new Form_Album();
    $form->submit->setLabel('Save');
    $this->view->form = $form;
    if ($this->getRequest()->isPost()) {
        $formData = $this->getRequest()->getPost();
        if ($form->isValid($formData)) {
             $id = (int)$form->getValue('id');
             $artist = $form->getValue('artist');
             $title = $form->getValue('title');
             $albums = new Model_DbTable_Albums();
             $albums->updateAlbum($id, $artist, $title);
             $this->_redirect('/');
        } else {
             $form->populate($formData);
        }
    } else {
        $id = $this->_getParam('id', 0);
        if ($id > 0) {
             $albums = new Model_DbTable_Albums();
             $form->populate($albums->getAlbum($id));
        }
    }
}
...
e una cosa molto simile va fatta per il metodo addAction.
Io vorrei evitare di implementare questi controlli in ogni controller di 
ogni tabella. Ma questi controlli non li posso fare tutti nel model, 
perche' devo poter accedere ai metodi della view per popolare la form, 
mostrare i messaggi di errore, redirigere alla pagina opportuna ecc 
ecc .... per questo pensavo al "controller globale".
I permessi li controllo con un plugin PRIMA che l'utente arrivi nel 
metodo addAction, se il php arriva fino li so già che l'utente ha i 
permessi necessari, quindi quel controllo non mi serve, mi servono solo 
tutti i controlli sulla correttezza della form, sul capire se va fatto un 
add oppure un edit ecc ecc.
Tutto questo sarebbe meglio farlo nel controller vero?
ciao
Mauro

 correttezza della form, sul capire se va fatto un add oppure un edit
Con questo sistema centralizzi tutti i controlli.
Io nei form, di solito, unifico add e edit, perche` si tratta 
semplicemente di avere il form precompilato con valori dal DB o con 
stringhe vuote, compreso il campo hidden "id".
L'implementazione e` un po' grezza, potresti ripulirla un po', per esempio 
sollevando un'eccezione invece di tornare null (e rivedendo la logica, 
visto che qui "null = tutto bene!"), o cose del genere.
Bye.

 eventualmente aggiorni il DB.
Giustissimo.
Ti ringrazio molto per il suggerimento, me lo studio per bene e provo ad 
implementarlo.
grazie ancora
Mauro