Пользовательские формы в 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> 

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

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

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

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

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

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

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

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

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

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