Domanda

Qualcuno può fornire un manichino di guida \ frammenti di codice su come creare un front-end forma in Magento che invia i dati a un controller di azione.

Im cercando di scrivere una variante del contatto che ci da.(So che è facile modificare il modulo di contatto che, come illustrato qui).Sto cercando di creare un modulo di feedback con i campi aggiuntivi.

Dato questo form:

<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>

Quali sono gli step fondamentali che ho bisogno di prendere per ottenere il nome inserito per azione controller per l'elaborazione?

È stato utile?

Soluzione

Se uno è interessato, ho risolto il problema il mio modulo che è stato pesantemente basato sul Magento_Contacts modulo.

Qui ci sono alcuni link che mi ha aiutato a capire le cose.

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

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

Altri suggerimenti

Per rendere $this->getFormAction() restituire la URL per il controllore, si hanno due opzioni:

  1. chiamata setFormAction() da qualche altra parte sul blocco.
  2. utilizzare un blocco personalizzato tipo che implementa getFormAction().

(1) è quello che succede in Mage_Contacts_IndexController::indexAction(), ma, (2) è l'approccio più "pulito" e ho intenzione di spiegare in dettaglio:

Creazione di un modulo personalizzato

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>

Questa configurazione registra il stack_form blocco alias per i propri blocchi e i feedback nome anteriore per il proprio controller.

Creare un blocco personalizzato

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

Qui abbiamo implementato getFormAction() per generare l'URL per il nostro controllore (il risultato sarà Base_url gli/feedback/index/post).

Creare personalizzato controller

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

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

Se il modulo dovrebbe comportarsi esattamente come il modulo di contatto, con un diverso modello di e-mail e ulteriori campi del modulo, ci sono due soluzioni che ho sottolineato in https://magento.stackexchange.com/q/79602/243 dove solo uno di loro in realtà richiede un controllore di azione per l'invio del modulo:

Se si guarda il contatti controller utilizzato in forma di azione, troverete che

  1. il modello transazionale è preso direttamente dalla configurazione
  2. tutti i dati POST è passati al modello (come variabile di modello data), in modo che è possibile aggiungere ulteriori campi del form modello e il loro utilizzo nel modello e-mail.Ma la convalida è difficile codificato per il "nome", "commento", "email" e "hideit".

Quindi, se avete bisogno di un completamente diverso modello di e-mail o aggiuntive/cambiato la validazione dell'input, la vostra scommessa migliore è quello di creare un controllore con una copia modificata del postAction di Mage_Contacts_IndexController.

Ma c'è un'altra soluzione che è un po ' limitata, ma senza alcun codice personalizzato coinvolti:

  • creare un input nascosto che determina il tipo di modulo.Potrebbe essere solo <input type="hidden" name="custom" value="1" />.
  • il contatto e-mail di servizio modello, utilizzare il if direttiva per mostrare contenuti diversi in base al tipo di modulo:

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

Come utilizzare questo blocco personalizzato

È possibile aggiungere il modulo ovunque nel CMS utilizzando questo codice CMS (direttiva):

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

Se si esegue questa operazione, è necessario aggiungere "stack_form/form" per il blocco whitelist sotto Sistema > Autorizzazioni > Blocchi!

O nel layout utilizzando questo codice (layout XML):

<block type="stack_form/form" name="any_unique_name" template="path/to/your/form.phtml" />

Soluzione senza modulo personalizzato

Se si utilizza una soluzione senza controllore e un singolo modello e-mail di cui sopra, è possibile impostare l'azione del modulo si utilizza il layout XML, così.

Per raggiungere questo obiettivo, utilizziamo la funzione per chiamare aiutanti come parametri per bloccare azioni.Purtroppo, il nucleo helper non dispone di un metodo pubblico per ottenere un URL ma l'aiutante da Mage_XmlConnect ha, quindi, è possibile utilizzare uno:

<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>

Nel CMS direttiva non è possibile utilizzare aiutanti, quindi ci sarebbe bisogno di mettere l'URL reale:

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

Dato che, probabilmente, hanno diverse pagine CMS/blocchi in diversi store di vista, questo non dovrebbe essere un grosso problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top