2012-11-28 5 views
6

Ich komme aus verschiedenen MVC-Frameworks (z. B. Symfony) zu Magento. Ich lese viel über Best Practices von Magento und kann sehen, dass Magento nicht den typischen MVC-Stil verwendet. Alan Sturm schrieb das folgende:Magento - Die beste Art, Formulare in Blöcken zu bearbeiten?

es ist nicht in der Verantwortung der Steuerungsvariablen für die Ansicht, um [...] Controller hat die Aufgabe, bestimmte Dinge zu Models zu tun ist, und dann das System zu sagen, es ist das Layout-Rendering Zeit.

Ich denke, ich verstehe diesen Ansatz, da dies eine Art von Flexibilität für Blöcke bieten kann.

Rechts. Aber was ist mit Formen?

In einem typischen MVC-Framework erhalten Sie die Anforderungsparameter in der Steuerung, validieren Formulardaten in der Steuerung, machen Modelloperationen (speichern, laden, etc) oder ggf. Umleitungen, und wenn alles sauber und ordentlich ist, Sie stellen die frisch gebackenen Ausgabestücke für die Ansicht zur Verfügung.

In Magento sollte das alles innerhalb eines Blocks passieren und der (dünne) Controller soll nur das Layout vorbereiten und dann rendern. (Wenn ich das verstehe.)

Ich habe versucht einen Artikel zu finden (Handbuch, Forumthema, alles), der eine Erstellungsschritte eines separaten Moduls mit einem eigenen neuen Modell beschreibt, das über ein Formular im Frontend bearbeitet werden kann vom Benutzer. Ich würde gerne sehen, wie ein benutzerdefiniertes Formular im Frontend funktionieren sollte. Ich habe nur allgemeine Artikel über Blöcke, Formulare, Ändern oder Erstellen von Verwaltungsformularen oder Anpassen von Kontakt- oder Newsletter-Anmeldeformularen gefunden.

Ich habe es gemacht. Es funktioniert jetzt, aber ich bin nicht zufrieden. Also habe ich den Quellcode des Kontaktformulars im Core-Modul überprüft, und diese haben das ganze Bild für mich durcheinander gebracht. Das integrierte Kontaktformular verwendet den IndexController für die meisten der oben genannten Vorgänge (fast) wie einen Standard-MVC.

Könnte mir jemand eine Best Practice empfehlen, wie man einen einfachen Flow wie folgt verwaltet? (Ich habe eine Lösung für diese unten, aber ich bin mir nicht sicher, dass der „richtige Magento Weg“):

  • Wenn die Seite geladen wird, zeigen eine Form in einem Block, die in enthalten ist die separate Seite
  • Last ein Modellobjekt aus der DB durch einen Anforderungsparameter
  • Populate Objektdaten in der Form
  • Wenn der Benutzer das Formular, Prozessformulardaten legt, validieren sie
  • Wenn Validierungsfehler zeigen die Formular erneut und Popup-Fehlermeldung
  • I f OK, speichern Sie die Daten in die DB, zeigen eine Dankeschön-Seite

Meine Verwirrung vor allem um ist:

  • Wo soll ich die Anfrage Parameter erhalten und verwalten? (Ich habe es in der Block-Klassendatei gemacht)
  • Und laden Sie ein Objekt aus der DB, darauf basierend? (Auch, und dann an den phtml übergeben)
  • Wie es an die Sicht übergeben, wenn ich es dort nicht laden würde? (Ich würde einen Weg kennen, aber ich kenne den besten Weg nicht.)
  • Wo sollen die (POST-) Formulardaten verarbeitet, validiert und gespeichert werden? (Block?)
  • Wie kann ich richtig Umleitungen in einem Block verwenden? Brauche ich eine Umleitung, da die Dankeseite ein anderer Block/eine andere Seite sein sollte? Oder nur ein alternatives (bedingtes) Aussehen des gleichen Blocks?

Antwort

2

Sie können einfach in den Customer/AccountController schauen und sehen, wie die loginPost, createPost Methoden die eingehenden Formulardaten verarbeiten.

Ich würde nie die CRUD Logik zum Block hinzufügen. Sie müssen Ihre POST-Daten in Ihrem Controller überprüfen und verarbeiten. Block sollte nur sichtbezogene Logik enthalten: wie Format-URL oder bereiten Sie Collection vor.

Auch die Formularvorbereitung liegt auf den Schultern des Controllers. Sie müssen Ihr Objekt laden und innerhalb der Controller-Aktion validieren.Dann gibt es nur wenige Möglichkeiten, um es an den Block weitergeben müssen:

  • Mage::register (Registry)
  • $this->getLayout->getBlock('your_form_block')->setEntity($object) (direkt Setvariable zu blockieren)

Jede Umleitung sollte nur in-Controller erfolgen.

UPDATE Ein paar Worte darüber, warum das Modell in den Controller laden.

  1. Wenn Sie Ihr Objekt zu laden, bedeutet dies, dass der URL Benutzer (mit Objekt-ID) wird unter Verwendung ist veraltet und es ist möglich, Sie werden den Kunden bis zu einem gewissen bequemen Seite mit Fehlern umleiten müssen.
  2. Wie ich oben sagte, sollten alle Weiterleitungen nur im Controller durchgeführt werden. Warum das? Da im Moment Blockprozesse sind, wurde bereits eine große Menge von Bootstrapping-Aufgaben von Magento ausgeführt - wie loadLayout und alle Blöcke erstellen. Sie möchten nicht, dass der Benutzer die ganze Zeit warten muss, um ihn anschließend umzuleiten.
  3. Das Weiterleiten von Weiterleitungen an einen beliebigen Ort außerhalb des Controllers macht die Anwendung nicht wartbar. Natürlich gibt es Ausnahmen, aber du solltest wissen, was du gut machst.

Auch Sie haben noch einen wertvollen Teil vergessen. Wenn die Validierung in Ihrem Controller fehlschlägt, müssen Sie das Formular mit den Werten ausfüllen, die der Benutzer gesendet hat. In Zend_Form ist das schön gemacht, aber mit Magento-Formularen müssen Sie die Session verwenden (wie es in AccountController gemacht wird) - alle Schlüssel-Wert-Teile in der Sitzung speichern und dann bei der Block-Prüfung nach den Existenz dieser Sitzungsvariablen suchen. Auch dies sollten Sie nur tun, wenn Ihre POST-Validierung fehlgeschlagen ist und Sie den Benutzer zurück zu Ihrem Formular leiten. Im Erfolgsfall löschen Sie die Sitzungsvariablen, die mit dem Formular verbunden sind.

Als allgemeine Empfehlung: Wenn Sie dem Magento-Stil folgen möchten, lesen Sie weniger Foren und mehr Kerncode.

+0

Danke Slayer, das habe ich vermutet. Das scheint viel sinnvoller zu sein! Ich stimme all Ihren Argumenten zu. Ich nahm etwas Ähnliches an, basierend auf meinem MVC-Wissen. Ich werde diese Kerncodes überprüfen. Sehr geschätzt! –

0

Ich bin kein magento pro entweder, aber ich denke, dass ich Ihre Fragen beantworten können:

Wo soll ich die Anfrage Parameter erhalten und verwalten? (Ich habe es in der Block-Class-Datei gemacht) Depens auf, wo Sie sie brauchen. Wenn Sie planen, sie in einem Modell zu speichern, verwenden Sie den Controller. Wenn Sie sie auf einer Seite ausgeben möchten, verwenden Sie einen Block. In den meisten Fällen möchten Sie den Controller dafür verwenden.

Und laden Sie ein Objekt aus der DB, basierend darauf? (Auch, und dann an den phtml weitergegeben) Wenn Sie ein Modell an eine Vorlage übergeben möchten, sollten Sie eine Funktion auf Ihrem Block schreiben, die das Modell erhält.

Wie es an die Ansicht übergeben, wenn ich es dort nicht laden würde? (Ich würde einen Weg kennen, aber ich weiß nicht den besten Weg.) Wie oben erwähnt, machen Sie einen Block mit einer Funktion, die das Modell bekommt. Dann können Sie von Ihrer Vorlage aus $ model = $ this-> functionThatGetsTheModel(); um diese Funktion zu erreichen und den Block zu bekommen.

Wo sollen die (POST-) Formulardaten verarbeitet, validiert und gespeichert werden? (Block?) Dinge wie Modelle zu speichern ist Controller Zeug.

Wie kann ich richtig Umleitungen in einem Block verwenden? Brauche ich eine Umleitung, da die Dankeseite ein anderer Block/eine andere Seite sein sollte? Oder nur ein alternatives (bedingtes) Aussehen des gleichen Blocks? Es ist am besten, Redirects in Ihrem Controller zu tun. Und es ist auch am besten, einen neuen Block/eine neue Vorlage für jede Seite zu erstellen, die Sie planen.

Über den Block/template Thema: Lesen Sie diese Seite für weitere Informationen über die Verwendung von Layout-XML-Blöcke zu verwenden und Vorlage http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-4-magento-layouts-blocks-and-templates

Ich hoffe, das Sie mit magento loszulegen hilft!