Formas personalizadas en magento

¿Puede alguien proporcionar una guía ficticia \ fragmentos de código sobre cómo crear un formulario de front-end en Magento que publique datos en una acción del controlador.

Estoy tratando de escribir una variante del contacto de. (Sé que es fácil modificar el formulario de contacto, como se describe aquí ). También estoy intentando crear un formulario de comentarios con campos adicionales.

Dada esta forma básica:

<form action="getFormAction(); ?>" id="feedbackForm" method="post"> 

<input name="name" id="name" title="__('Name') ?>" value="htmlEscape($this->helper('contacts')->getUserName()) ?>" class="required-entry input-text" type="text" />

__('* Required Fields') ?>

¿Cuáles son los pasos básicos que debo seguir para ingresar el nombre a una acción del controlador para su procesamiento?

Si alguien está interesado, resolví esto construyendo mi propio módulo que se basó en gran medida en el módulo Magento_Contacts .

Aquí hay algunos enlaces que me ayudaron a resolver las cosas.

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

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

Para que $this->getFormAction() devuelva la URL a su controlador personalizado, tiene dos opciones:

  1. llame a setFormAction() algún otro lugar del bloque.
  2. use un tipo de bloque personalizado que implemente getFormAction() .

(1) es lo que sucede en Mage_Contacts_IndexController::indexAction() , pero (2) es el enfoque más limpio y lo explicaré en detalle:

Crear un módulo personalizado

app/etc/modules/Stack_Form.xml :

 < ?xml version="1.0"?>    true local    

app/code/local/Stack/Form/etc/config.xml :

 < ?xml version="1.0"?>    0.1.0      standard  Stack_Form feedback        Stack_Form_Block     

Esta configuración registra el alias del bloque stack_form para los propios bloques y el nombre del frente de feedback para los propios controladores.

Crear bloque personalizado

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`); } } 

Aquí implementamos getFormAction() para generar la URL para nuestro controlador personalizado (el resultado será BASE_URL / feedback / index / post ).

Crear controlador personalizado

app/code/local/Stack/Form/controllers/IndexController.php

 class Stack_Form_IndexController extends Mage_Contacts_IndexController { public function postAction() { // your custom post action } } 

Si el formulario se comporta exactamente como el formulario de contacto, solo con una plantilla de correo electrónico diferente y campos de formulario adicionales, hay dos soluciones que describí en https://magento.stackexchange.com/q/79602/243 donde solo una de ellos realmente requieren una acción de controlador personalizado para enviar el formulario:

Si observa el controlador de contactos utilizado en la acción de formulario, encontrará que

  1. La plantilla transaccional se toma directamente de la configuración.
  2. todos los datos POST se pasan a la plantilla (como data variables de la plantilla), de modo que puede agregar campos adicionales a la plantilla de formulario y usarlos en la plantilla de correo electrónico. Pero la validación está codificada para “nombre”, “comentario”, “correo electrónico” y “hideit”.

Por lo tanto, si necesita una plantilla de correo electrónico completamente diferente o una validación de entrada adicional / modificada, su mejor opción es crear un controlador personalizado con una copia modificada de la postAction de Mage_Contacts_IndexController .

Pero hay otra solución que es un poco limitada pero sin ningún código personalizado involucrado:

  • crear una entrada oculta que determina el tipo de formulario. Podría ser solo .
  • en la plantilla de correo electrónico transaccional de contacto, use la directiva if para mostrar contenido diferente según el tipo de formulario:

     {{if data.custom}} ... custom contact form email ... {{else}} ... standard contact form email ... {{/if}} 

Cómo usar este bloque personalizado

Puede agregar el formulario en cualquier lugar del CMS usando este código (directiva de CMS):

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

Si hace esto, debe agregar “stack_form / form” a la lista blanca de bloques en Sistema> Permisos> Bloques .

O en el diseño utilizando este código (diseño XML):

  

Solución sin módulo personalizado.

Si usa la solución sin un controlador personalizado y una sola plantilla de correo electrónico mencionada anteriormente, también puede configurar la acción de formulario utilizando el diseño XML.

Para lograr esto, usamos la función para llamar a los ayudantes como parámetros para acciones de bloque. Desafortunadamente, el ayudante principal no tiene un método público para obtener una URL, pero sí el ayudante de Mage_XmlConnect , por lo que puede usar ese:

    contacts/index/post   

En la directiva de CMS no puedes usar ayudantes, por lo que allí necesitarías poner la URL real:

 {{block type="stack_form/form" template="path/to/your/form.phtml" form_action="/feedback/index/post"}} 

Debido a que probablemente tenga diferentes páginas / bloques de CMS en diferentes vistas de la tienda, esto no debería ser un gran problema.