7

私はさまざまな MVC フレームワーク (Symfony など) から Magento に移行しています。Magento のベスト プラクティスについてよく読んでいますが、Magento が典型的な MVC スタイルを使用していないことがわかります。アラン・ストームは次のように書いています。

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

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

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

典型的な MVC フレームワークでは、コントローラーでリクエスト パラメーターを取得し、コントローラーでフォーム データを検証し、必要に応じてモデル操作 (保存、読み込みなど) またはリダイレクトを行います。ビューの焼きたての出力ピース。

Magento では、これらすべてがブロック内で発生する必要があり、(シン) コントローラーはレイアウトを準備してからレンダリングすることのみを想定しています。(わかれば。)

ユーザーがフロントエンドのフォームを介して編集できる、独自の新しいモデルを持つ別のモジュールの作成手順を説明する記事 (マニュアル、フォーラムのトピック、その他) を見つけようとしました。カスタムフォームがフロントエンドでどのように機能するかを確認したいと思います。ブロック、フォーム、adminhtml フォームの変更または作成、連絡先またはニュースレターのサインアップ フォームのカスタマイズに関する一般的な記事しか見つかりませんでした。

やった。現在は機能していますが、満足していません。それで、コア モジュールの Contact フォームのソース コードを確認したところ、全体像が台無しになりました。組み込みの Contact フォームは、(ほぼ) 標準の MVC のように、上記の操作のほとんどに IndexController を使用します。

次のような単純なフローを管理する方法を教えてください。(以下にこれらの解決策がありますが、それが「正しいMagentoの方法」であるかどうかはわかりません):

  • ページが読み込まれると、別のページに含まれるブロックにフォームを表示します
  • リクエストパラメータでDBからモデルオブジェクトをロード
  • オブジェクト データをフォームに入力する
  • ユーザーがフォームを送信すると、フォーム データが処理され、検証されます
  • 検証エラーの場合は、フォームを再度表示し、エラー メッセージをポップアップ表示します
  • OKならデータをDBに保存し、サンキューページを表示

私の混乱は主に次のとおりです。

  • リクエスト パラメータはどこで取得して管理すればよいですか? (ブロッククラスファイルで行いました)
  • それに基づいて、DB からオブジェクトをロードしますか? (また、phtmlに渡されます)
  • そこにロードしない場合、ビューに渡す方法は? (私は方法を知っているだろうが、私は最善の方法を知らない。)
  • (POST) フォーム データを処理、検証、保存する場所は? (ブロック?)
  • ブロックで適切にリダイレクトを使用するにはどうすればよいですか? お礼のページは別のブロック/ページにする必要があるため、リダイレクトが必要ですか? それとも、同じブロックの代替 (条件付き) 外観ですか?
4

2 に答える 2

3

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

CRUDブロックにロジックを追加することはありません。Controller で POST データを検証して処理する必要があります。ブロックには、フォーマット url や prepare などのビュー関連のロジックのみを含める必要がありますCollection

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

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

リダイレクトはコントローラーでのみ行う必要があります。

更新 コントローラー内にモデルをロードする理由についてのいくつかの言葉。

  1. オブジェクトの読み込みに失敗した場合は、ユーザーが使用している (オブジェクト ID を持つ) URL が古くなっていることを意味し、顧客をエラーのある便利なページにリダイレクトする必要がある可能性があります。
  2. 上で述べたように、すべてのリダイレクトはコントローラーでのみ行う必要があります。何故ですか?現時点ではブロックはプロセスであるため、膨大な量のブートストラップ作業が Magento によって既に行われています。つまり、loadLayoutすべてのブロックを作成します。後でリダイレクトするためだけに、ユーザーをずっと待たせたくありません。
  3. また、コントローラー以外の場所にリダイレクトを配置すると、アプリケーションが保守できなくなります。もちろん例外もありますが、自分が何をうまくやっているのかを知っておく必要があります。

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

一般的なアドバイスとして、Magento スタイルに従いたい場合は、フォーラムを少なくして、より多くのコア コードを読んでください。

于 2012-11-28T14:58:41.187 に答える
0

私もマジェントのプロではありませんが、あなたの質問に答えることができると思います:

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

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

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

(POST) フォーム データを処理、検証、保存する場所は? (ブロック?) モデルの保存などはコントローラーのようなものです。

ブロックで適切にリダイレクトを使用するにはどうすればよいですか? お礼のページは別のブロック/ページにする必要があるため、リダイレクトが必要ですか? それとも、同じブロックの代替 (条件付き) 外観ですか? コントローラーでリダイレクトを行うのが最善です。また、作成するページごとに新しいブロック/テンプレートを作成することもお勧めします.

ブロック/テンプレートのトピックについて: レイアウト xml を使用してブロックとテンプレートを使用する方法の詳細については、このページをお読みください http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-4- magento-layouts-blocks-and-templates

これが、magento を使い始めるのに役立つことを願っています!

于 2012-11-28T14:57:27.030 に答える