10

誰でも、データをコントローラーアクションに投稿するフロントエンドフォームをMagentoで作成する方法に関するダミーガイド\コードスニペットを提供できますか?

お問い合わせのバリエーションを書き込もうとしています。(ここで概説されているように、お問い合わせフォームを簡単に変更できることを私は知っています)。追加のフィールドを含むフィードバックフォームも作成しようとしています。

この基本的な形式を考えると:

<form action="<?php echo $this->getFormAction(); ?>" id="feedbackForm" method="post">   
                <div class="input-box">
                    <label for="name"><?php echo Mage::helper('contacts')->__('Name') ?> <span class="required">*</span></label><br />
                    <input name="name" id="name" title="<?php echo Mage::helper('contacts')->__('Name') ?>" value="<?php echo $this->htmlEscape($this->helper('contacts')->getUserName()) ?>" class="required-entry input-text" type="text" />
                </div>

    <div class="button-set">
        <p class="required"><?php echo Mage::helper('contacts')->__('* Required Fields') ?></p>
        <button class="form-button" type="submit"><span><?php echo Mage::helper('contacts')->__('Submit') ?></span></button>
    </div>
</form>

入力された名前をコントローラーアクションに取得して処理するために必要な基本的な手順は何ですか?

4

2 に答える 2

13

誰かが興味を持っている場合は、モジュールに大きく基づいた独自のモジュールを構築することでこれを解決しましたMagento_Contacts

ここに私が物事を理解するのを助けたいくつかのリンクがあります.

http://www.magentocommerce.com/wiki/custom_module_with_custom_database_table

http://inchoo.net/ecommerce/magento/magento-custom-emails/

于 2009-07-07T22:58:11.453 に答える
4

URLを$this->getFormAction()カスタム コントローラーに返すには、次の 2 つのオプションがあります。

  1. ブロックの別の場所を呼び出しsetFormAction()ます。
  2. を実装するカスタム ブロック タイプを使用します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 つのソリューションがあります。実際には、フォームを送信するためのカスタム コントローラー アクションが必要です。

フォーム アクションで使用されている連絡先コントローラーを見ると 、次のことがわかります。

  1. トランザクション テンプレートは構成から直接取得されます
  2. すべての POST データが (テンプレート変数としてdata) テンプレートに渡されるため、フォーム テンプレートに追加のフィールドを追加して、それらを電子メール テンプレートで使用できます。ただし、「name」、「comment」、「email」、および「hideit」の検証はハードコーディングされています。

そのため、完全に異なる電子メール テンプレートまたは追加/変更された入力検証が必要な場合はpostActionMage_Contacts_IndexController.

ただし、少し制限されていますが、カスタム コードが含まれていない別のソリューションがあります。

  • フォームのタイプを決定する隠し入力を作成します。それはただかもしれません<input type="hidden" name="custom" value="1" />
  • コンタクト トランザクション メール テンプレートで、ifディレクティブを使用して、フォーム タイプに基づいて異なるコンテンツを表示します。

    {{if data.custom}}
        ... custom contact form email ...
    {{else}}
        ... standard contact form email ...
    {{/if}}
    

このカスタム ブロックの使用方法

このコード (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 ページ/ブロックがある可能性が高いため、これは大きな問題にはなりません。

于 2015-09-16T13:41:13.580 に答える