Question

Quelqu'un peut-il fournir un guide factice \ extraits de code sur la façon de créer une forme d'extrémité avant dans Magento que les données de messages à une action du contrôleur.

Im essayant d'écrire une variante du contact nous de. (Je sais que il est facile de modifier le formulaire de contact, comme indiqué ). Je suis en train de créer aussi une forme de rétroaction avec des champs supplémentaires.

Compte tenu de cette forme de base:

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

Quelles sont les étapes de base que je dois prendre pour obtenir le nom entré dans une action de contrôleur pour le traitement?

Était-ce utile?

La solution

Si quelqu'un est intéressé, je résolu ce problème en construisant mon propre module qui a été fortement basée sur le module Magento_Contacts.

Voici quelques liens qui m'a aidé à comprendre les choses.

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

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

Autres conseils

Pour renvoyer l'URL $this->getFormAction() à votre contrôleur personnalisé, vous avez deux options:

  1. appeler un autre endroit sur setFormAction() le bloc.
  2. utiliser un type de bloc personnalisé qui implémente getFormAction().

(1) est ce qui se passe dans Mage_Contacts_IndexController::indexAction(), mais (2) est l'approche plus propre et je vais vous expliquer en détail:

Créer un module personnalisé

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>

Cette configuration enregistre l'alias de blocs propres blocs pour stack_form et le nom avant pour feedback propres contrôleurs.

Créer un bloc personnalisé

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

Ici, nous avons implémenté pour générer l'app/code/local/Stack/Form/controllers/IndexController.php URL pour notre contrôleur personnalisé (le résultat sera BASE_URL / commentaires / index / post ).

Créer un contrôleur personnalisé

data

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

Si la forme doit se comporter exactement comme le formulaire de contact, juste avec un modèle de courrier électronique différent et champs de formulaire supplémentaires, il y a deux solutions que je viens de décrire à https://magento.stackexchange.com/q/79602/243 où seul l'un d'eux exige en fait une action de contrôleur personnalisé pour envoyer le formulaire:

  

Si vous regardez le noreferrer contacts   contrôleur   utilisé dans l'action de formulaire, vous constaterez que

     
      
  1. le modèle transactionnel est pris directement à partir de la configuration
  2.   
  3. toutes les données POST est passé au modèle (comme variable de modèle postAction), de sorte que vous pouvez ajouter des champs supplémentaires à la forme   modèle et les utiliser dans le modèle de courrier électronique. Mais la validation est difficile   codé pour "nom", "commentaire", "email" et "HideIt".
  4.   
     

Alors, si vous avez besoin d'un modèle de courrier électronique ou tout autre   validation d'entrée supplémentaire / changé, votre meilleur pari est de créer un   contrôleur personnalisé avec une copie modifiée du de Mage_Contacts_IndexController   <input type="hidden" name="custom" value="1" />.

     

Mais il y a une autre solution qui est un peu limité, mais sans   code personnalisé impliqué:

     
      
  • créer une entrée cachée qui détermine le type de la forme. Il pourrait être juste if.
  •   
  • dans le modèle de courrier électronique transactionnel de contact, utilisez la directive pour montrer Mage_XmlConnect contenu différent en fonction du type de formulaire:

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

Comment utiliser ce bloc personnalisé

Vous pouvez ajouter le formulaire partout dans le CMS en utilisant ce code (directive CMS):

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

Si vous faites cela, vous devez ajouter "stack_form / form" à la liste blanche de bloc sous Système> Permissions> Blocs

Ou dans la mise en page en utilisant ce code XML (mise en page):

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

Solution sans module personnalisé

Si vous utilisez la solution sans contrôleur personnalisé et un seul modèle de courrier électronique mentionné ci-dessus, vous pouvez définir l'action de formulaire en utilisant XML et de mise en page.

Pour ce faire, nous utilisons la fonction pour appeler des aides en tant que paramètres pour les actions de bloc. Malheureusement, l'aide de base ne dispose pas d'une méthode publique pour obtenir une URL, mais l'aide de a <=>, de sorte que vous pouvez utiliser celui-ci:

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

Dans la directive CMS vous ne pouvez pas utiliser les aides, vous donc il besoin de mettre l'URL:

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

cela ne devrait pas Puisque vous avez probablement différentes pages / blocs CMS dans les différentes vues de magasin, être un gros problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top