Вопрос по php, magento, forms, controller – Нестандартные формы в Magento

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>

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

Ваш Ответ

2   ответа
13

я решил эту проблему, создав собственный модуль, основанный наMagento_Contacts модуль.

Вот несколько ссылок, которые помогли мне разобраться.

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

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

Моя форма обратной связи:dropbox.com/sh/32zqgejubfllz0h/AACkB_iIh-KJQxtEUikZ8i9Na?dl=0   Как я могу отобразить на всех страницах, включая домашнюю страницу @Dan
4

$this->getFormAction() вернуть URL на ваш пользовательский контроллер, у вас есть два варианта:

call setFormAction() somewhere else on the block. use a custom block type that implements getFormAction().

(1) это то, что происходит вMage_Contacts_IndexController::indexAction(), но (2) - более чистый подход, и я собираюсь объяснить его подробно:

Create a custom module

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 имя для собственных контроллеров.

Create custom block

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).

Create custom controller

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

If you look at the contacts controller used in the form action, you will find that

the transactional template is taken directly from the configuration all POST data is passed to the template (as template variable data), so that you can add any additional fields to the form template and use them in the email template. But validation is hard coded for "name", "comment", "email" and "hideit".

So, if you need a completely different email template or additional/changed input validation, your best bet is to create a custom controller with a modified copy of the postAction of Mage_Contacts_IndexController.

But there is another solution that is a bit limited but without any custom code involved:

create a hidden input that determines the type of the form. It could be just <input type="hidden" name="custom" value="1" />.

in the contact transactional email template, use the if directive to show different content based on the form type:

{{if data.custom}}
    ... custom contact form email ...
{{else}}
    ... standard contact form email ...
{{/if}}
How to use this custom block

Вы можете добавить форму в любом месте CMS, используя этот код (директива CMS):

{{block type="stack_form/form" template="path/to/your/form.phtml"}}

Если вы сделаете это, вам нужно добавить & quot; stack_form / form & quot; в белый список блоков подSystem > Permissions > Blocks!

Или в макете, используя этот код (макет XML):

<block type="stack_form/form" name="any_unique_name" template="path/to/your/form.phtml" />
Solution without custom module

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

Я попробовал ваш учебник, но я просто вижу пустую страницу! Должен ли я включить что-нибудь внутриpublic function postAction()? Я создал копию stack_form.phtmlapp\design\frontend\base\default\template\contacts\form.phml и попробовал {{block ... way на новой странице cms
Теперь я получаю фатальную ошибку: вызов функции-члена setFormAction () для логического значения вapp/code/core/Mage/Contacts/controllers/IndexController.php on line 55
ОК, я должен был сделать белый список блока stack_form / form
Я добавил его, но с теми же результатами ... Как насчет функции getFormAction? Может ли это быть пустым?
Да, метод postAction должен содержать ваш собственный код, чтобы создать электронное письмо из формы ввода и показать пользователю сообщение об успехе. Как указано выше, это может быть измененная копия постаMage_Contacts_IndexController

Похожие вопросы