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