Может ли кто-нибудь предоставить фиктивный путеводитель\фрагменты кода о том, как создать форму интерфейса в Magento, которая отправляет данные в действие контроллера.
Я пытаюсь написать вариант контакта с нами. (Я знаю, что его легко изменить форму контакта, как описано здесь). Я также пытаюсь создать форму обратной связи с дополнительными полями.
Каков основной шаг, который мне нужно предпринять, чтобы получить введенное имя для действия контроллера для обработки?
Ответ 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 в разных представлениях хранилища, это не должно быть большой проблемой.