Пользовательские формы в Magento

Может ли кто-нибудь предоставить фиктивный путеводитель\фрагменты кода о том, как создать форму интерфейса в 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>

Каков основной шаг, который мне нужно предпринять, чтобы получить введенное имя для действия контроллера для обработки?

Ответ 2

Чтобы $this->getFormAction() вернуть URL-адрес вашему настраиваемому контроллеру, у вас есть два варианта:

  • вызов 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/обратная связь/индекс/сообщение).

Создать пользовательский контроллер

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 где только один из них на самом деле требует специального действия контроллера для отправки формы:

Если вы посмотрите на контакты контроллериспользуемый в форме action, вы обнаружите, что

  • шаблон транзакции берется непосредственно из конфигурации
  • все данные POST передаются в шаблон (в качестве переменной шаблона data), поэтому вы можете добавлять любые дополнительные поля в форму шаблон и использовать их в шаблоне электронной почты. Но проверка достоверна закодированные для "имени", "комментариев", "email" и "hideit".

Итак, если вам нужен совершенно другой шаблон электронной почты или дополнительной/измененной проверки ввода, лучше всего создать пользовательский контроллер с измененной копией postAction Mage_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"}}

Если вы сделаете это, вам нужно добавить "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 в разных представлениях хранилища, это не должно быть большой проблемой.

Ответ 3

Самый простой способ - использовать такие модули, как этот: Пользовательская форма. Это помогает создать любую веб-форму для поддержания контакта с вашими посетителями, сбора дополнительной информации и создания базы данных электронной почты с легкостью.