Saltar al contenido

Formularios personalizados en Magento

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:

  1. llama setFormAction() en algún otro lugar de la cuadra.
  2. 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

  1. la plantilla transaccional se toma directamente de la configuración
  2. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *