2012-11-28 24 views
6

Vengo da diversi framework MVC (ad esempio Symfony) a Magento. Ho letto molto sulle best practice di Magento e posso vedere che Magento non usa il tipico stile MVC. Alan tempesta ha scritto quanto segue:Magento - Il modo migliore per gestire i moduli in blocchi?

Non è la responsabilità del controllore per impostare le variabili per la vista [...] Il lavoro di controllo è quello di fare certe cose per modelle, e poi dire il sistema è il rendering di layout tempo.

Penso di capire questo approccio in quanto ciò può fornire una certa flessibilità per i blocchi.

Diritto. Ma per quanto riguarda le forme?

In un tipico framework MVC si ottengono i parametri di richiesta nel controller, si convalidano i dati del modulo nel controller, si effettuano le operazioni del modello (salvataggio, caricamento, ecc.) O i reindirizzamenti se necessario, e quando tutto è pulito e ordinato, fornirai i pezzi di uscita appena sfornati per la vista.

In Magento tutto ciò dovrebbe accadere all'interno di un blocco e il controller (sottile) dovrebbe solo preparare il layout e quindi renderlo. (Se capisco.)

Ho cercato di trovare un articolo (manuale, argomento del forum, qualsiasi cosa), che descrive le fasi di creazione di un modulo separato con un proprio nuovo modello, che può essere modificabile tramite un modulo nel frontend dall'utente. Mi piacerebbe vedere come un modulo personalizzato dovrebbe funzionare nel frontend. Ho trovato solo articoli generali su blocchi, moduli, modifiche o creazione di moduli adminhtml o personalizzazione di moduli di iscrizione a contatti o newsletter.

L'ho fatto. Funziona ora, ma non sono soddisfatto. Quindi, ho controllato il codice sorgente del modulo di contatto nel modulo principale, e quelli che hanno incasinato l'intera immagine per me. Il modulo di contatto integrato utilizza IndexController per la maggior parte delle operazioni sopra menzionate, (quasi) come un MVC standard.

Qualcuno potrebbe suggerirmi una buona pratica, come gestire un flusso semplice come il seguente? (Ho una soluzione per questi sotto, ma non sono sicuro, è il "giusto modo Magento"):

  • Quando la pagina viene caricata, mostra un modulo in un blocco, che è incluso in la pagina separata
  • carico un oggetto del modello dal DB da un parametro di richiesta
  • dati dell'oggetto Popola nella forma
  • Quando l'utente invia il form, i dati dei moduli di processo, li
  • convalidare Se errore di validazione, mostrano la form di nuovo, e compare il messaggio di errore
  • I f OK, memorizzare i dati nel DB, mostrare una pagina di ringraziamento

La mia confusione è principalmente attorno:

  • Dove dovrei ottenere e gestire il parametro di richiesta? (L'ho fatto nel file di classe del blocco)
  • E caricare un oggetto dal DB, in base ad esso? (Inoltre, e poi passato al phtml)
  • Come passare alla vista, se non volessi caricarlo lì? (Vorrei sapere un modo, ma non conosco il modo migliore.)
  • Dove devono essere elaborati, convalidati e archiviati i dati del modulo (POST)? (Block?)
  • Come posso utilizzare correttamente i reindirizzamenti in un blocco? Ho bisogno di reindirizzamento, perché la pagina di ringraziamento dovrebbe essere un blocco/pagina diversa? O solo un aspetto alternativo (condizionale) dello stesso blocco?

risposta

2

È possibile controllare il Cliente/AccountController e vedere come i metodi loginPost, createPost gestiscono i dati del modulo in entrata.

Non aggiungerei mai la logica CRUD al blocco. È necessario convalidare ed elaborare i dati POST nel controller. Il blocco dovrebbe contenere solo la logica relativa alla vista: come il formato url o preparare Collection.

Anche la preparazione del modulo si estende anche alle spalle del Controller. È necessario caricare l'oggetto e convalidarlo all'interno dell'azione Controller.Poi ci sono alcuni modi per passare al blocco:

  • Mage::register (Registro)
  • $this->getLayout->getBlock('your_form_block')->setEntity($object) (variabile impostata direttamente per bloccare)

Qualsiasi reindirizzamento dovrebbe essere fatto in un solo controller.

UPDATE Poche parole sul perché caricare il modello all'interno del controller.

  1. Se non si riesce a caricare l'oggetto, esso significa che l'utente sta usando url (con oggetto id) è obsoleto ed è possibile è necessario reindirizzare il cliente a qualche pagina conveniente con l'errore.
  2. Come detto sopra, tutti i reindirizzamenti devono essere eseguiti solo in Controller. perché? Perché al momento il blocco è un processo, Magento ha già fatto un enorme lavoro di bootstrap, come loadLayout e crea tutti i blocchi. Non vuoi far aspettare l'utente per tutto quel tempo solo per reindirizzare in seguito.
  3. Anche il reindirizzamento di posizioni non nel Controller rende l'applicazione non gestibile. Ovviamente ci sono delle eccezioni, ma dovresti sapere cosa stai facendo molto bene.

Inoltre, hai dimenticato una parte più preziosa. Se la convalida non riesce all'interno del controller, è necessario compilare il modulo con i valori inviati dall'utente. In Zend_Form è fatto abbastanza, ma con i moduli Magento dovrai usare la sessione (come è fatto in AccountController) - salvare tutte le parti chiave-valore nella sessione e poi nel blocco verificare la presenza di tali variabili di sessione. Anche in questo caso, dovresti farlo solo se la convalida del POST non è riuscita e stai reindirizzando l'utente al modulo. In caso di successo cancellare le variabili di sessione connesse al modulo.

Come consiglio generale: se si desidera seguire lo stile Magento, leggere meno forum e altro codice di base.

+0

Grazie Slayer, questo è quello che sospettavo. Sembra molto più sensato! Sono d'accordo con tutti i tuoi argomenti sopra. Ho assunto qualcosa di simile, basato sulla mia conoscenza MVC. Controllerò quei codici base. Molto apprezzato! –

0

Io non sono un professionista Magento sia, ma penso di poter rispondere alle vostre domande:

Dove dovrei ottenere e gestire il parametro di richiesta? (L'ho fatto nel file di classe del blocco) Depense su dove ti servono. Se si prevede di salvarli in un modello, utilizzare il controller. Se vuoi aprirli su una pagina, usa un blocco. La maggior parte dei casi si desidera utilizzare il controller per questo.

E caricare un oggetto dal DB, basato su di esso? (Inoltre, e poi passato al phtml) Se si desidera passare un modello a un modello, è necessario scrivere una funzione sul blocco che ottiene il modello.

Come passare alla vista, se non lo volessi caricare lì? (Vorrei sapere un modo, ma non so il modo migliore.) Come detto sopra, crea un blocco con una funzione che ottiene il modello. Quindi dal tuo modello puoi usare $ model = $ this-> functionThatGetsTheModel(); per raggiungere questa funzione e ottenere il blocco.

Dove devono essere elaborati, convalidati e archiviati i dati del modulo (POST)? (Block?) Cose come il salvataggio dei modelli è roba del controller.

Come è possibile utilizzare correttamente i reindirizzamenti in un blocco? Ho bisogno di reindirizzamento, perché la pagina di ringraziamento dovrebbe essere un blocco/pagina diversa? O solo un aspetto alternativo (condizionale) dello stesso blocco? È meglio eseguire reindirizzamenti nel controller. Ed è anche meglio creare un nuovo blocco/modello per ogni pagina che si intende realizzare.

Circa il tema del blocco/template: Leggere questa pagina per maggiori informazioni circa l'uso di file XML di layout da utilizzare blocchi e modello http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-4-magento-layouts-blocks-and-templates

Spero che questo aiuta a iniziare con Magento!

Problemi correlati