Mam stronę z listą produktów, to wszystko. To rodzaj catalog/view.phtml
klona. Właśnie dołączone app/Mage.php
.
Na tej stronie używam
Mage::getSingleton('core/session')->getFormKey();
ale różni się od formularza innej strony
Co ja robię źle?
Mam stronę z listą produktów, to wszystko. To rodzaj catalog/view.phtml
klona. Właśnie dołączone app/Mage.php
.
Na tej stronie używam
Mage::getSingleton('core/session')->getFormKey();
ale różni się od formularza innej strony
Co ja robię źle?
Odpowiedzi:
Prawdopodobnie nic, ponieważ klucz formularza jest losowy, więc za każdym razem musi być inny.
Dlatego nie powinno to mieć znaczenia, ale najlepszą praktyką dodawania klucza formularza do szablonu jest:
<?php echo $this->getBlockHtml('formkey') ?>
Aktualizacja: Muszę przyznać, że się myliłem w jednym punkcie: klucz formularza pozostaje taki sam podczas sesji. Jeśli masz inny klucz formularza na różnych stronach, może to być problem z zewnętrzną pamięcią podręczną pełnej strony, która zawiera klucz formularza w pamięci podręcznej (czego nie powinna mieć), lub klucz formularza znajduje się w niestandardowym bloku używającym bloku Pamięć podręczna. W przypadku tego drugiego znalazłem rozwiązanie: bloki pamięci podręcznej zawierające form_key (tj. Zawartość dynamiczną)
getBlockHtml()
jest zaimplementowany w, Mage_Core_Block_Abstract
a formkey
blok jest zdefiniowany wbase/default/layout/core.xml
<input type="hidden" name="form_key" value="<?php echo Mage::getSingleton('core/session')->getFormKey(); ?>"/>
. Wydaje się, że to naprawić, ale wciąż frustrujące. czy jest lepszy sposób?
Wiem, że na to niejasne pytanie nie należy odpowiedzieć. Jednak mogłem tutaj natrafić na podobny problem, oto czego się nauczyłem:
Dlatego na podstawie krótkiego przykładu zastąpiłem akcję kasowania addtocart w nowym module:
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>
Mam nadzieję, że będzie to wystarczająco dużo, aby każdy mógł to odtworzyć
Nie mogę komentować, więc odpowiadam. Nie dodawaj klucza formularza do kontrolera. Wyłącza korzyści bezpieczeństwa klucza formularza. Jeśli używasz Lakieru, możesz użyć ESI (Edge Side Includes), aby dodać klucz. Aby to zadziałało, musisz zapisać go w pliku cookie.