Получение правильного FormKey

18

У меня есть страница, на которой я перечислил продукты, вот и все. Это своего рода catalog/view.phtmlклон. Просто включено app/Mage.php.

На этой странице я использую

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

но это отличается от formKey другой страницы

Что я делаю неправильно?

Ибрагим Мумку
источник

Ответы:

17

Вероятно, ничего, потому что ключ формы является случайным, поэтому каждый раз он должен быть другим.

Так что это не должно иметь никакого значения, но наилучшая практика, как вам следует добавить ключ формы в свой шаблон, заключается в следующем:

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

Обновление: я должен признать, я был неправ в одном: ключ формы остается неизменным во время сеанса. Если у вас другой ключ формы на разных страницах, это может быть проблемой с сторонним полностраничным кешем, который включает ключ формы в кеш (чего не должно быть), или ключ формы находится внутри пользовательского блока, использующего блок кэш. Для последнего я нашел решение: блоки кэша, содержащие form_key (т.е. динамический контент)

Фабиан Шменглер
источник
это предположить, чтобы вывести скрытую форму ввода? но я не могу поставить его на мой review.phtml? есть мысли?
wlin
Да, и вы должны быть в состоянии сделать это в любом блоке на любой странице. getBlockHtml() реализован в Mage_Core_Block_Abstractи formkeyблок определен вbase/default/layout/core.xml
Фабиан Шменглер
Я не могу получить его даже на чистой версии 1.8. но я жестко закодировал это <input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>. Кажется, чтобы исправить это, но все еще расстраивает. Есть ли способ лучше.
wlin
3
Почему ключ формы должен отличаться каждый раз? Оно должно быть одинаковым для данного сеанса на любой странице; это должно только измениться на разных сессиях.
Ник Роландо
Я согласен, что это на самом деле не нужно, но так работает в Magento.
Фабиан Шменглер
8

Я знаю, что на этот расплывчатый вопрос нельзя ответить. Однако я мог столкнуться с подобной проблемой здесь, вот что я узнал:

  • ключ формы не должен отличаться в каждом запросе
  • ключ form_key согласован на протяжении всей сессии
  • другой сеанс должен создать другой ключ form_key (попробуйте другой браузер)
  • PAGE КЭШ иногда не мешает с этим
  • у меня это привело к тому, что виджет показал одинаковый (кэшированный) ключ формы для всех сессий.
    • я не понимаю эту "особенность"

Основываясь на коротком примере, я переопределил действие проверки addtocart, как это в новом модуле:

Приложение / код / ​​местные / Имя / Checkout / Контроллеры / 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();
    }
}

Приложение / код / ​​местные / Имя / Checkout / и т.д. / 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>

приложение / и т.д. / модули / 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>

Я надеюсь, что этого будет достаточно для всех, чтобы воссоздать это

Лето-Sky
источник
+1 за "PAGE CACHE иногда мешает этому". Это тот случай, когда я не могу добавить продукты в список желаний. Мы используем кэширование страниц Varnish, и это кэширование ключей формы.
Ник Роландо
1

Не могу комментировать, поэтому я отвечаю вместо этого. Не добавляйте ключ формы в контроллере. Это отключает преимущества безопасности ключа формы. Если вы используете Varnish, вы можете использовать ESI (Edge Side Includes) для добавления ключа. Вы должны будете сохранить это в куки, чтобы это работало.

Бьерн Тантау
источник
Не могли бы вы привести пример, как будет выглядеть ваша инструкция ESI для блока formkey?
DarkCowboy
Вы должны быть в состоянии получить это из расширения кеша Phoenix Medie Varnish Cache. github.com/PHOENIX-MEDIA/Magento-PageCache-powered-by-Varnish
Бьорн