私はさまざまな MVC フレームワーク (Symfony など) から Magento に移行しています。Magento のベスト プラクティスについてよく読んでいますが、Magento が典型的な MVC スタイルを使用していないことがわかります。アラン・ストームは次のように書いています。
ビューの変数を設定するのはコントローラーの責任ではありません[...]コントローラーの仕事は、モデルに対して特定のことを行い、システムにレイアウトレンダリング時間であることを伝えることです。
これはブロックに一種の柔軟性を提供できるため、このアプローチを理解していると思います。
右。しかし、フォームはどうですか?
典型的な MVC フレームワークでは、コントローラーでリクエスト パラメーターを取得し、コントローラーでフォーム データを検証し、必要に応じてモデル操作 (保存、読み込みなど) またはリダイレクトを行います。ビューの焼きたての出力ピース。
Magento では、これらすべてがブロック内で発生する必要があり、(シン) コントローラーはレイアウトを準備してからレンダリングすることのみを想定しています。(わかれば。)
ユーザーがフロントエンドのフォームを介して編集できる、独自の新しいモデルを持つ別のモジュールの作成手順を説明する記事 (マニュアル、フォーラムのトピック、その他) を見つけようとしました。カスタムフォームがフロントエンドでどのように機能するかを確認したいと思います。ブロック、フォーム、adminhtml フォームの変更または作成、連絡先またはニュースレターのサインアップ フォームのカスタマイズに関する一般的な記事しか見つかりませんでした。
やった。現在は機能していますが、満足していません。それで、コア モジュールの Contact フォームのソース コードを確認したところ、全体像が台無しになりました。組み込みの Contact フォームは、(ほぼ) 標準の MVC のように、上記の操作のほとんどに IndexController を使用します。
次のような単純なフローを管理する方法を教えてください。(以下にこれらの解決策がありますが、それが「正しいMagentoの方法」であるかどうかはわかりません):
- ページが読み込まれると、別のページに含まれるブロックにフォームを表示します
- リクエストパラメータでDBからモデルオブジェクトをロード
- オブジェクト データをフォームに入力する
- ユーザーがフォームを送信すると、フォーム データが処理され、検証されます
- 検証エラーの場合は、フォームを再度表示し、エラー メッセージをポップアップ表示します
- OKならデータをDBに保存し、サンキューページを表示
私の混乱は主に次のとおりです。
- リクエスト パラメータはどこで取得して管理すればよいですか? (ブロッククラスファイルで行いました)
- それに基づいて、DB からオブジェクトをロードしますか? (また、phtmlに渡されます)
- そこにロードしない場合、ビューに渡す方法は? (私は方法を知っているだろうが、私は最善の方法を知らない。)
- (POST) フォーム データを処理、検証、保存する場所は? (ブロック?)
- ブロックで適切にリダイレクトを使用するにはどうすればよいですか? お礼のページは別のブロック/ページにする必要があるため、リダイレクトが必要ですか? それとも、同じブロックの代替 (条件付き) 外観ですか?