Obtener FormKey correcto

18

Tengo una página que enumeré productos, eso es todo. Es una especie de catalog/view.phtmlclon. Solo incluido app/Mage.php.

En esta página uso

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

pero es diferente al formulario de otra página

¿Qué estoy haciendo mal?

Ibrahim Mumcu
fuente

Respuestas:

17

Probablemente nada porque la clave de forma es aleatoria, por lo que tiene que ser diferente cada vez.

Por lo tanto, no debería marcar la diferencia, pero la mejor práctica, cómo debe agregar la entrada de clave de formulario a su plantilla, es esta:

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

Actualización: Tengo que admitir que me equivoqué en un punto: la clave de formulario permanece igual durante una sesión. Si tiene una clave de formulario diferente en páginas diferentes, esto podría ser un problema con un caché de página completa de un tercero que incluye la clave de formulario en el caché (que no debería), o la clave de formulario está dentro de un bloque personalizado que está usando el bloque cache. Para este último, encontré una solución: bloques de caché que contienen form_key (es decir, contenido dinámico)

Fabian Schmengler
fuente
¿Se supone que esto genera un formulario de entrada oculto? pero no puedo ponerlo en mi review.phtml? ¿cualquier pensamiento?
wlin
Sí, y deberías poder hacerlo en cualquier bloque de cualquier página. getBlockHtml() se implementa en Mage_Core_Block_Abstracty el formkeybloque se define enbase/default/layout/core.xml
Fabian Schmengler
No puedo hacer que salga incluso en una instalación limpia 1.8. pero codifico esto <input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>. Parece solucionarlo, pero sigue siendo frustrante. ¿Hay una mejor manera?
wlin
3
¿Por qué la clave de formulario debe ser diferente cada vez? Debería ser lo mismo para una sesión determinada en cualquier página; solo debe variar según las diferentes sesiones.
Nick Rolando
Estoy de acuerdo en que no es realmente necesario, pero así es como funciona en Magento.
Fabian Schmengler
8

Sé que esta vaga pregunta no debe responderse. Sin embargo, podría haber encontrado un problema similar aquí, esto es lo que he aprendido:

  • form_key no debe ser diferente en cada solicitud
  • form_key es consistente durante toda la sesión
  • una sesión diferente debería crear una forma_clave diferente (pruebe con otro navegador)
  • la PÁGINA CACHÉ a veces interfiere con esto
  • conmigo esto resultó en un Widget que muestra la misma forma_clave (en caché) para todas las sesiones.
    • no entiendo esta "característica"

Basado en un breve ejemplo , por lo tanto, he anulado la acción de pago addtocart como esta en un nuevo módulo:

app / code / local / Name / 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 / Name / 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>

Espero que esto sea lo suficientemente extenso para que todos puedan recrear esto

Cielo de verano
fuente
+1 para "la PÁGINA CACHÉ a veces interfiere con esto". Este es el caso de por qué no puedo agregar productos a la lista de deseos. Estamos usando el almacenamiento en caché de la página Varnish, y está almacenando en caché las teclas de formulario.
Nick Rolando
1

No puedo comentar, así que estoy respondiendo en su lugar. No agregue la clave de formulario en el controlador. Deshabilita los beneficios de seguridad de la clave de formulario. Si está utilizando Varnish, puede usar ESI (Edge Side incluye) para agregar la clave. Tendrás que guardarlo en una cookie para que eso funcione.

Björn Tantau
fuente
¿Podría dar un ejemplo de cómo se vería su instrucción de ESI para el bloque formkey?
DarkCowboy
Debería poder obtener eso de la extensión Phoenix Medie Varnish Cache. github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
Björn Tantau