我们正在EE 1.12中运行高级产品选项扩展。在扩展程序之上,我们对其进行了修改以使用Cookie,因此如果客户选择了特定的自定义选项,那么这些选项会保存在Cookie中,下次再次访问产品页面时,会再次从Cookie中填充选项。
问题是Cookie值是Magento FPC中的Cache。我们试过通过这个尝试使用打孔,但遗憾的是它不能正常工作。
(1)除了打孔之外,还有其他方法可以解决这个问题吗? (2)由于这是一个自定义模块,我们是否修改模块/ etc / cache.xml或pagecache / cache.xml以进行打孔。
此致
史蒂夫
以下是我们为cookie提供的代码部分:
<?php
$pres_saved_data = Mage::helper('customoptions')->isCookieExist();
//$cookieModel = Mage::getModel('core/cookie');
//$pres_saved_data = $cookieModel->get('myprescription');
$show_prefilled_data = false;
$pres_data = array();
$other_pres_data = array();
if($pres_saved_data){
$sql = "select * from customer_prescription where id = '".$pres_saved_data."'";
$rowdata = $readConnection->fetchRow($sql);
if($rowdata){
$show_prefilled_data = true;
$optionsdata = unserialize($rowdata['prescription_options']);
$pres_data['options'] = unserialize($optionsdata['options']);
/* store all the option data which is there in cookie*/
$options_data = array(); $options_sku = array();
foreach($pres_data['options'] as $_data){
$label = strtolower(str_replace(" ",'_',$_data['label']));
if($label == 'prescription_type' || $label == 'lens' || $label =='pd' || $label == 'anti_reflective_coating') {
$options_data[] = $_data['value']; $options_sku[] = $_data['sku']; } else{
$other_pres_data[$label] = $_data['value'];
}
}
$sql = sprintf("SELECT v.option_type_id ,t.title,c.option_id,v.sku FROM catalog_product_option as c inner join
`catalog_product_option_type_value` as v
on c.option_id = v.option_id
inner join catalog_product_option_type_title as t on v.option_type_id = t.option_type_id
and v.sku in ('%s') and product_id = %s and t.title in ( '%s') where store_id in( 0,".Mage::app()->getStore()->getId().")",implode("', '",$options_sku),$current_product->getId(),implode("', '",$options_data));
$option_cookie_data = $readConnection->fetchAll($sql);
}
}
?>
<?php endif; ?>
我们拥有的容器是:
<?php
class MageWorx_Customoptions_Model_Container_cachetest
extends Enterprise_PageCache_Model_Container_Abstract
{
protected function _getIdentifier()
{
return $this->_getCookieValue(Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER, '');
}
protected function _getCacheId()
{
return 'customoptions' . md5($this->_placeholder->getAttribute('cache_id') . $this->_getIdentifier());
}
protected function _renderBlock()
{
$blockClass = $this->_placeholder->getAttribute('block');
$template = $this->_placeholder->getAttribute('template');
$block = new $blockClass;
$block->setTemplate($template);
return $block->toHtml();
}
}
答案 0 :(得分:0)
整页缓存可能很棘手。以下是另一个可以帮助您解决问题的答案:
How do I include a dynamic block in the product page with full page caching turned on?
从该答案看,您可以使用包含客户ID的ID保存缓存。这将为每个客户创建一个唯一的缓存条目。这可能会导致与FPC发生更多冲突,例如,当用户更改选项时,您需要删除其缓存条目。
打孔/占位逻辑应位于模块/etc/cache.xml
中