Solución:
Si alguien está interesado, lo resolví construyendo mi propio módulo, que se basaba en gran medida en el Magento_Contacts
módulo.
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 hacer $this->getFormAction()
devolver la URL a su controlador personalizado, tiene dos opciones:
- llama
setFormAction()
en algún otro lugar de la cuadra. - utilizar 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 voy a explicar en detalle:
Crea un módulo personalizado
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>
Esta configuración registra el stack_form
alias de bloque para bloques propios y el feedback
nombre frontal para controladores propios.
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 de 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 debe comportarse exactamente como el formulario de contacto, solo con una plantilla de correo electrónico diferente y campos de formulario adicionales, hay dos soluciones que he descrito en https://magento.stackexchange.com/q/79602/243 donde solo una de ellos realmente requieren una acción de controlador personalizada para enviar el formulario:
Si observa el controlador de contactos utilizado en la acción del formulario, encontrará que
- la plantilla transaccional se toma directamente de la configuración
- todos los datos POST se pasan a la plantilla (como variable de plantilla
data
), para que pueda agregar campos adicionales a la plantilla de formulario y usarlos en la plantilla de correo electrónico. Pero la validación está codificada de forma rígida para “nombre”, “comentario”, “correo electrónico” y “ocultarlo”.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 del
postAction
de
Mage_Contacts_IndexController
.Pero hay otra solución que es un poco limitada pero sin ningún código personalizado involucrado:
- cree una entrada oculta que determine el tipo de formulario. Podría ser solo
<input type="hidden" name="custom" value="1" />
.en la plantilla de correo electrónico transaccional de contacto, utilice el
if
directiva 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 utilizando este código (directiva 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 debajo Sistema> Permisos> Bloques!
O en el diseño usando este código (diseño XML):
<block type="stack_form/form" name="any_unique_name" template="path/to/your/form.phtml" />
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 del formulario utilizando XML de diseño.
Para lograr esto, usamos la función para llamar a los ayudantes como parámetros para las acciones de bloqueo. Desafortunadamente, el asistente principal no tiene un método público para obtener una URL, pero el asistente de Mage_XmlConnect
tiene, por lo que puede usar ese:
<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>
En la directiva CMS no puede usar ayudantes, por lo que deberá colocar la URL real:
{{block type="stack_form/form" template="path/to/your/form.phtml" form_action="/feedback/index/post"}}
Dado que probablemente tenga diferentes páginas / bloques de CMS en diferentes vistas de la tienda, esto no debería ser un gran problema.