Les formulaires personnalisés dans Magento
-
21-08-2019 - |
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?
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:
- appeler un autre endroit sur
setFormAction()
le bloc. - 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
- le modèle transactionnel est pris directement à partir de la configuration
- 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".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.