Obtendo o FormKey correto

18

Eu tenho uma página que listei produtos, é isso. É o tipo de catalog/view.phtmlclone. Apenas incluído app/Mage.php.

Nesta página eu uso

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

mas é diferente do formulário de outra página

O que estou fazendo de errado?

Ibrahim Mumcu
fonte

Respostas:

17

Provavelmente nada, porque a chave do formulário é aleatória, portanto, deve ser diferente a cada vez.

Portanto, não deve fazer diferença, mas a melhor prática, como você deve adicionar a entrada da chave do formulário ao seu modelo, é esta:

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

Atualização: Eu tenho que admitir, eu estava errado em um ponto: a chave do formulário permanece a mesma durante uma sessão. Se você tiver uma chave de formulário diferente em páginas diferentes, isso pode ser um problema com um cache de página inteira de terceiros que inclui a chave de formulário no cache (o que não deveria) ou a chave de formulário está dentro de um bloco personalizado que está usando o bloco cache. Para o último, encontrei uma solução: Blocos de cache que contêm form_key (ou seja, conteúdo dinâmico)

Fabian Schmengler
fonte
isso supõe gerar um formulário de entrada oculto? mas não posso colocar no meu review.phtml? algum pensamento?
Wlin
Sim, e você poderá fazê-lo em qualquer bloco de qualquer página. getBlockHtml() é implementado em Mage_Core_Block_Abstracteo formkeybloco é definido embase/default/layout/core.xml
Fabian Schmengler
Não consigo obtê-lo como saída, mesmo em uma instalação limpa de 1,8. mas eu codifico isso <input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>. Parece consertar, mas ainda assim frustrante. Existe uma maneira melhor.
Wlin
3
Por que a chave do formulário deve ser diferente a cada vez? Deve ser o mesmo para uma determinada sessão em qualquer página; deve variar apenas por sessões diferentes.
Nick Rolando
Concordo que não é realmente necessário, mas é assim que funciona no Magento.
Fabian Schmengler
8

Eu sei que essa vaga pergunta não deve ser respondida. No entanto, talvez eu tenha encontrado um problema semelhante aqui, foi o que aprendi:

  • o form_key não deve ser diferente em cada solicitação
  • o form_key é consistente ao longo da sessão
  • uma sessão diferente deve criar uma form_key diferente (tente outro navegador)
  • o PAGE CACHE às vezes interfere nesse
  • comigo isso resultou em um widget mostrando o mesmo formulário_chave (em cache) para todas as sessões.
    • eu não entendo esse "recurso"

Portanto, com base no pequeno exemplo , substituí a ação de checkout addtocart como esta em um novo 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 isso seja extensivamente suficiente para que todos possam recriar esse

Summer-Sky
fonte
+1 para "o PAGE CACHE às vezes interfere nisso". Este é o caso do motivo pelo qual não consigo adicionar produtos à lista de desejos. Estamos usando o cache da página Varnish, e ele está armazenando em cache as chaves do formulário.
Nick Rolando
1

Não posso comentar, por isso estou respondendo. Não adicione a chave de formulário no controlador. Desativa os benefícios de segurança da chave do formulário. Se você estiver usando o Varnish, poderá usar o ESI (Inclusão do lado da borda) para adicionar a chave. Você precisará salvá-lo em um cookie para que isso funcione.

Björn Tantau
fonte
Você poderia fornecer um exemplo de como seria sua instrução ESI para o bloco formkey?
DarkCowboy
Você deve conseguir isso na extensão Phoenix Medie Varnish Cache. github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
Björn Tantau