URLを$this->getFormAction()
カスタム コントローラーに返すには、次の 2 つのオプションがあります。
- ブロックの別の場所を呼び出し
setFormAction()
ます。
- を実装するカスタム ブロック タイプを使用します
getFormAction()
。
(1) は で起こることですがMage_Contacts_IndexController::indexAction()
、(2) はよりクリーンなアプローチであり、詳細に説明します。
カスタム モジュールを作成する
app/etc/modules/Stack_Form.xml
:
<?xml version="1.0"?>
<config>
<modules>
<Stack_Form>
<active>true</active>
<codePool>local</codePool>
</Stack_Form>
</modules>
</config>
app/code/local/Stack/Form/etc/config.xml
:
<?xml version="1.0"?>
<config>
<modules>
<Stack_Form>
<version>0.1.0</version>
</Stack_Form>
</modules>
<frontend>
<routers>
<stack_form>
<use>standard</use>
<args>
<module>Stack_Form</module>
<frontName>feedback</frontName>
</args>
</stack_form>
</routers>
</frontend>
<global>
<blocks>
<stack_form>
<class>Stack_Form_Block</class>
</stack_form>
</blocks>
</global>
</config>
この構成により、自ブロックのstack_form
ブロック エイリアスとfeedback
自コントローラーのフロント名が登録されます。
カスタム ブロックの作成
app/code/local/Stack/Form/Block/Form.php
class Stack_Form_Block_Form extends Mage_Core_Block_Template
{
public function getFormAction()
{
return $this->getUrl('stack_form/index/post`);
}
}
ここではgetFormAction()
、カスタム コントローラーの URL を生成するために実装しました (結果はBASE_URL/feedback/index/postになります)。
カスタム コントローラーを作成する
app/code/local/Stack/Form/controllers/IndexController.php
class Stack_Form_IndexController extends Mage_Contacts_IndexController
{
public function postAction()
{
// your custom post action
}
}
フォームが連絡先フォームとまったく同じように動作する必要がある場合は、別の電子メール テンプレートと追加のフォーム フィールドを使用するだけで、 https://magento.stackexchange.com/q/79602/243で概説した 2 つのソリューションがあります。実際には、フォームを送信するためのカスタム コントローラー アクションが必要です。
フォーム アクションで使用されている連絡先コントローラーを見ると
、次のことがわかります。
- トランザクション テンプレートは構成から直接取得されます
- すべての POST データが (テンプレート変数として
data
) テンプレートに渡されるため、フォーム テンプレートに追加のフィールドを追加して、それらを電子メール テンプレートで使用できます。ただし、「name」、「comment」、「email」、および「hideit」の検証はハードコーディングされています。
そのため、完全に異なる電子メール テンプレートまたは追加/変更された入力検証が必要な場合はpostAction
、
Mage_Contacts_IndexController
.
ただし、少し制限されていますが、カスタム コードが含まれていない別のソリューションがあります。
このカスタム ブロックの使用方法
このコード (CMS ディレクティブ) を使用して、CMS の任意の場所にフォームを追加できます。
{{block type="stack_form/form" template="path/to/your/form.phtml"}}
これを行う場合は、System > Permissions > Blocksの下のブロック ホワイトリストに「stack_form/form」を追加する必要があります。
または、このコードを使用したレイアウト (レイアウト XML):
<block type="stack_form/form" name="any_unique_name" template="path/to/your/form.phtml" />
カスタム モジュールを使用しないソリューション
上記のカスタム コントローラーと単一の電子メール テンプレートを使用せずにソリューションを使用する場合は、レイアウト XML を使用してフォーム アクションを設定することもできます。
これを実現するために、ブロック アクションのパラメータとしてヘルパーを呼び出す機能を使用します。残念ながら、コア ヘルパーには URL を取得するパブリック メソッドがありませんが、ヘルパーにMage_XmlConnect
はあるため、それを使用できます。
<block type="core/template" name="any_unique_name" template="path/to/your/form.phtml">
<action method="setFormAction">
<param helper="xmlconnect/getUrl">
<route>contacts/index/post</route>
</param>
</action
</block>
CMS ディレクティブではヘルパーを使用できないため、実際の URL を配置する必要があります。
{{block type="stack_form/form" template="path/to/your/form.phtml" form_action="/feedback/index/post"}}
異なるストア ビューには異なる CMS ページ/ブロックがある可能性が高いため、これは大きな問題にはなりません。