我在 Magento 1.8 中的愿望清单中发现的一个问题与新的 form_key 参数有关,也许这就是您遇到问题的原因。
Magento 1.8 引入了表单键(它们可能在 1.8 之前以某种形式存在,但现在它们无处不在)。如果您希望您的任何表格做任何事情,它们是强制性的。想要加入购物车/愿望清单/比较清单?需要一个表单键。想提交联系表格?需要一个表单键。想要登录?表单键。等等。
所有必要的核心模板都已更新,以将此键作为隐藏的输入元素包含在内 - 根据我的经验,您只需将这一行从十几个不同的地方复制并粘贴到您拥有的任何自定义模板中(在表单元素),它们也会很好。
一切都很好 - 进一步的安全增强/垃圾邮件防护功能,并且很容易适应。
问题在于$this->helper('wishlist')->getAddUrl($_product) 生成的 URL 也包含此表单键,例如/wishlist/index/add/product/101/form_key/xyz 这根本行不通。在这种情况下,“不起作用”是指“添加到愿望清单”按钮不会向您的愿望清单添加任何内容,尽管它仍会将您带到您的愿望清单页面。
我不确定是意外还是设计使然,但 form_key 似乎不像大多数 Magento 参数那样在 URL 中起作用。它必须是标准的 HTTP 变量,例如表单字段中的输入或添加到 URL 中的查询字符串,例如 ?form_key=xyz。
至少在产品视图上,我认为在列表视图上,愿望列表按钮实际上调用productAddToCartForm.submitLight(),这意味着 URL 根本不需要表单键,因为 productAddToCartForm 已经包含它。
如何解决?与大多数事情一样,有很多方法。您可以停止使用 $this->helper('wishlist')->getAddUrl($_product) 并将其替换为 $this->getStoreUrl('wishlist/index/add/product/'.$_product->getId()) 之类的东西(我尚未测试过,因此请谨慎使用),或者您可以覆盖 Mage_Wishlist_Helper_Data::getAddUrl 这就是我选择的方式它。这种方式会影响所有尝试使用“添加到愿望清单”网址的模板等,这可能是好事也可能是坏事。我觉得很好,在这种情况下,但这取决于你。
我将 Mage/Wishlist/Helper/Data.php 从 app/code/core 复制到 app/code/local 并更改:
public function getAddUrl($item)
{
return $this->getAddUrlWithParams($item);
}
到:
public function getAddUrl($item)
{
$productId = null;
if ($item instanceof Mage_Catalog_Model_Product) {
$productId = $item->getEntityId();
}
if ($item instanceof Mage_Wishlist_Model_Item) {
$productId = $item->getProductId();
}
if ($productId) {
$params = array('product' => $productId);
return $this->_getUrlStore($item)->getUrl('wishlist/index/add', $params);
}
return false;
}
...这只是 getAddUrlWithParams 函数的副本,其中“params”硬编码为产品 ID。