2012-11-28 22 views
6

私はMagentoに異なるMVCフレームワーク(例えばSymfony)から来ています。私はMagentoのベストプラクティスについて多くを読んで、Magentoが典型的なMVCスタイルを使用していないことがわかります。アラン・ストームは、以下のことを書いた:Magento - フォームをブロックで処理する最も良い方法は?

それは ビューのための変数を設定するには、コントローラの責任ではありません[...]コントローラの仕事はモデルに特定の物事を行うことです、そして は、システムを伝えることは、レイアウトのレンダリングです時間。

これはブロックに柔軟性を提供できるので、私はこのアプローチを理解していると思います。

右。しかし、フォームはどうですか?

典型的なMVCフレームワークでは、コントローラーで要求パラメーターを取得したり、コントローラーでフォームデータを検証したり、モデル操作(保存、ロードなど)を行ったり、必要に応じてリダイレクトしたり、ビューのために焼きたての出力部分を提供します。

Magentoでは、これらはすべてブロック内で実行され、(薄い)コントローラーはレイアウトを準備してレンダリングすることになっています。 (私が分かっていれば)

私は、独自の新しいモデルを持つ別個のモジュールの作成手順を説明している記事(マニュアル、フォーラムトピックなど)を見つけようとしました。これはフロントエンドのフォームから編集できますユーザーによって。私はカスタムフォームがフロントエンドでどのように動作すべきかを見たいと思います。私は、ブロック、フォーム、adminhtmlフォームの変更や作成、連絡先やニュースレターの登録フォームのカスタマイズに関する一般的な記事だけを見つけました。

私はそれを作った。それは今働くが、私は満足していない。そこで、私はコアモジュールのContactフォームのソースコードをチェックし、それらは私のために全体の画像を乱しました。組み込みのContactフォームでは、上記の操作のほとんどにIndexControllerを使用します。(ほとんど)標準のMVCと似ています。

誰も私にベストプラクティスを提案できますか?次のような単純なフローをどのように管理するのですか? (私は以下のこれらのソリューションを持っているが、私はわからないんだけど、「右Magentoの道」ということです):

  • するとページが読み込まれると、中に含まれるブロックでフォームを表示ユーザーがフォーム、プロセス・フォーム・データを送信すると、検証エラーが表示される場合、別のページ
  • ロード
  • 移入オブジェクトデータ形式に要求パラメータによってDBからのモデルオブジェクトは、
  • それら
  • を検証します再度フォームを開き、エラーメッセージを表示します。
  • I F [OK]を、DBにデータを保存し、お礼ページ

私の混乱は主に周りで示しています

  • はどこで入手してリクエストパラメータを管理する必要がありますか? (私はブロッククラスファイルでそれをしました)
  • そして、それに基づいてDBからオブジェクトを読み込みますか? (また、phtmlに渡された)
  • 私はそこに読み込まれない場合は、ビューに渡す方法? (私は方法を知っているだろうが、私は最良の方法を知らない。)
  • (POST)フォームのデータを処理、検証、保存する場所はどこですか? (ブロック?)
  • ブロック内で適切にリダイレクトを使用するにはどうすればよいですか?感謝のページは別のブロック/ページでなければならないので、リダイレクトが必要ですか?あるいは、同じブロックのオルタナティブ(条件付き)の見た目ですか?

答えて

2

Customer/AccountControllerを調べて、loginPostcreatePostのメソッドが着信フォームデータをどのように処理しているかを確認できます。

私は決してブロックにCRUDロジックを追加しません。コントローラでPOSTデータを検証して処理する必要があります。ブロックには、フォーマット関連のロジック(フォーマットURLなど)のみが含まれているか、Collectionを用意してください。

また、フォームの準備もコントローラの肩に置いています。オブジェクトをロードし、Controllerアクション内でそのオブジェクトを検証する必要があります。

  • Mage::register(レジストリ)
  • $this->getLayout->getBlock('your_form_block')->setEntity($object)(ブロックに直接設定された変数)

任意リダイレクションのみコントローラで行われるべきである:そのブロックに渡すためにいくつかの方法があります。

更新 コントローラー内にモデルを読み込む理由はほとんどありません。

  1. オブジェクトをロードできない場合は、ユーザーが使用しているオブジェクトIDが古くなっているため、エラーのある便利なページにリダイレクトする必要がある可能性があります。
  2. 上記のとおり、すべてのリダイレクトはコントローラでのみ行う必要があります。何故ですか?現時点ではプロセスがプロセスであるため、Magentoは既にloadLayoutのような膨大なブートストラッピング作業を行い、すべてのブロックを作成しています。後でリダイレクトするだけで、ユーザーはすべての時間待機する必要はありません。
  3. また、コントローラにないリダイレクトを配置すると、アプリケーションを保守できなくなります。もちろん例外がありますが、あなたが何をしっかりしているかを知っておく必要があります。

また、もう1つ貴重な部分を忘れてしまった。コントローラ内部で検証が失敗した場合は、ユーザーが送信した値をフォームに入力する必要があります。 Zend_Formでは、Magentoフォームを使って、セッションを使用する必要があります(AccountControllerのように) - セッション内のすべてのキー値部分を保存してから、それらのセッション変数の存在をブロックチェックします。この場合も、POSTの検証が失敗し、ユーザーをフォームにリダイレクトする場合にのみ、これを行う必要があります。成功した場合は、フォームに接続しているセッション変数をクリアします。

一般的なアドバイスとして:Magentoスタイルに従いたい場合は、フォーラムやコアコードの数を減らしてください。

+0

ありがとうスレイヤー、それは私が疑うものです。それははるかに理にかなっているようです!私は上記のすべての議論に同意します。私はMVCの知識に基づいて同様のものを想定していました。これらのコアコードを確認します。とても有難い! –

0

私は、Magentoのは、どちらかのプロではないんだけど、私は私があなたの質問に答えることができると思います。

どこでリクエストパラメータを取得し、管理する必要がありますか? (私はブロッククラスファイルでそれをやった) あなたがそれらを必要としている場所で。モデルに保存する予定の場合は、コントローラを使用してください。それらをページに出力する場合は、ブロックを使用します。ほとんどの場合、このためにコントローラを使用します。

それに基づいてDBからオブジェクトを読み込みますか? (また、phtmlに渡されます) モデルをテンプレートに渡す場合は、モデルを取得する関数をブロックに書く必要があります。

ビューに渡すにはどうすればいいですか? (私は方法を知っているだろうが、私は最良の方法を知らない) 上記のように、モデルを取得する関数でブロックを作る。テンプレートから、$ model = $ this-> functionThatGetsTheModel();を使用できます。この関数に到達し、ブロックを取得します。

(POST)フォームのデータは、処理、検証、保存されるべきですか? (ブロック?) モデルを保存するのはコントローラのものです。

ブロック内で適切にリダイレクトを使用するにはどうすればよいですか?感謝のページは別のブロック/ページでなければならないので、リダイレクトが必要ですか?あるいは、同じブロックのオルタナティブ(条件付き)の見た目ですか? コントローラでリダイレクトするのが最良です。また、作成しようとしているすべてのページに対して新しいブロック/テンプレートを作成することも最善です。ブロック/テンプレートトピックについて

:ブロックテンプレート私は、これはあなたがMagentoのを始めるのに役立ちます願っていhttp://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-4-magento-layouts-blocks-and-templates

を使用するようにレイアウトXMLの使用方法についての詳細情報については、このページを読んで!

関連する問題