Obtenir la bonne FormKey

18

J'ai une page où j'ai listé les produits, c'est tout. Son genre de catalog/view.phtmlclone. Juste inclus app/Mage.php.

Dans cette page, j'utilise

Mage::getSingleton('core/session')->getFormKey(); 

mais il est différent de formKey d'une autre page

Qu'est-ce que je fais mal?

Ibrahim Mumcu
la source

Réponses:

17

Probablement rien car la clé du formulaire est aléatoire, elle doit donc être différente à chaque fois.

Cela ne devrait donc pas faire de différence, mais la meilleure pratique, comment ajouter l'entrée de clé de formulaire à votre modèle, est la suivante:

<?php echo $this->getBlockHtml('formkey') ?>

Mise à jour: je dois admettre que je me suis trompé sur un point: la clé du formulaire reste la même pendant une session. Si vous avez une clé de formulaire différente sur différentes pages, cela peut être un problème avec un cache de page entière tiers qui inclut la clé de formulaire dans le cache (ce qu'il ne devrait pas), ou la clé de formulaire se trouve dans un bloc personnalisé qui utilise le bloc cache. Pour ce dernier, j'ai trouvé une solution: des blocs de cache qui contiennent form_key (c'est-à-dire du contenu dynamique)

Fabian Schmengler
la source
cela suppose de sortir un formulaire d'entrée caché? mais je ne peux pas le mettre sur mon review.phtml? toute pensée?
wlin
Oui et vous devriez pouvoir le faire dans n'importe quel bloc sur n'importe quelle page. getBlockHtml() est implémenté dans Mage_Core_Block_Abstractet le formkeybloc est défini dansbase/default/layout/core.xml
Fabian Schmengler
Je ne peux pas le faire sortir même dans un instal propre de 1,8. mais je coder <input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>en dur cela . Semble y remédier, mais toujours frustrant. existe-t-il une meilleure façon.
wlin
3
Pourquoi la clé de formulaire devrait-elle être différente à chaque fois? Il devrait en être de même pour une session donnée sur n'importe quelle page; il ne doit varier que selon les différentes sessions.
Nick Rolando
Je suis d'accord que ce n'est pas vraiment nécessaire mais c'est ainsi que cela fonctionne dans Magento.
Fabian Schmengler
8

Je sais qu'il ne faut pas répondre à cette vague question. Cependant, je pourrais avoir rencontré un problème similaire ici, voici ce que j'ai appris:

  • le form_key ne doit pas être différent dans chaque requête
  • le form_key est cohérent tout au long de la session
  • une session différente devrait créer une autre form_key (essayez un autre navigateur)
  • la PAGE CACHE interfère parfois avec ce
  • avec moi, cela a abouti à un widget affichant la même clé form_key (mise en cache) pour toutes les sessions.
    • je n'ai pas cette "fonctionnalité"

Sur la base d'un court exemple, j'ai donc remplacé l'action de paiement addtocart comme celle-ci dans un nouveau module:

app / code / local / Nom / Checkout / controllers / CartController.php

<?php
require_once(Mage::getModuleDir('controllers','Mage_Checkout').DS.'CartController.php');

class Name_Checkout_CartController extends Mage_Checkout_CartController
{
    public function addAction()
    {
        $request = $this->getRequest();
        $formKey = Mage::getSingleton('core/session')->getFormKey();
        $request->setParam('form_key', $formKey);
        return parent::addAction();
    }
}

app / code / local / Nom / Checkout / etc / config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Name_Checkout>
            <version>0.1.0</version>
        </Name_Checkout>
    </modules>
    <frontend> 
        <routers>
            <checkout> 
                <args>
                    <modules>
                        <name_checkout before="Mage_Checkout">Name_Checkout</name_checkout>
                    </modules>
                </args>
            </checkout>>
        </routers>
    </frontend>
</config>

app / etc / modules / Name_Checkout.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Name_Checkout>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Checkout/>
            </depends>
        </Name_Checkout>
    </modules>
</config>

J'espère que ce sera suffisamment pour que tout le monde recrée ce

Summer-Sky
la source
+1 pour "la PAGE CACHE interfère parfois avec cela". C'est le cas pour lequel je ne peux pas ajouter de produits à la liste de souhaits. Nous utilisons la mise en cache de page Varnish, et elle met en cache les clés de formulaire.
Nick Rolando
1

Je ne peux pas commenter, je réponds à la place. N'ajoutez pas la clé de formulaire dans le contrôleur. Il désactive les avantages de sécurité de la clé de formulaire. Si vous utilisez Varnish, vous pouvez utiliser ESI (Edge Side includes) pour ajouter la clé. Vous devrez l'enregistrer dans un cookie pour que cela fonctionne.

Björn Tantau
la source
Pourriez-vous fournir un exemple à quoi ressemblerait votre instruction ESI pour le bloc formkey?
DarkCowboy
Vous devriez pouvoir l'obtenir à partir de l'extension Phoenix Medie Varnish Cache. github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
Björn Tantau