Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision Last revision Both sides next revision | ||
litespeed_wiki:cache:litemage:troubleshooting:exclude-price-block-from-login-user [2017/12/11 20:28] Jackson Zhang created |
litespeed_wiki:cache:litemage:troubleshooting:exclude-price-block-from-login-user [2017/12/18 19:20] Jackson Zhang |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== How to exclude price block from the logged in users? ====== | + | ====== Can you Exclude the Price Block from public Cache for Only the Logged-in Users? ====== |
- | The Setup is: | + | You might have a situation where pricing varies per user and is fetched via API from an external ERP system. This system only applies to logged-in users. Users who are logged out should not see pricing at all. |
- | 1. Hide prices for all "not logged in" customers | + | |
- | 2. For logged in users: Fetch product prices via API from external ERP system for each user. | + | |
- | How to exclude the price block "Mage_Catalog_Block_Product_View_Type_Simple" And "Mage_Catalog_Block_Product_Price" from template: | ||
- | "frontend/base/default/template/rodin/product/price.phtml" so that the logged in users see their own prices directly from API call and not cache? | ||
- | {{ :litespeed_wiki:cache:litemage:troubleshooting:exclude-price-block.png?800 |}} | ||
- | How do you price for logged in users? are they different prices based on customer group? Or are they different for each user? | + | For non-logged-in user: |
- | Currently, litemage can only do cache based on customer group, not individual users. | + | {{ :litespeed_wiki:cache:litemage:troubleshooting:exclude-price-block-loginrequired.png?600 |}} |
+ | {{ :litespeed_wiki:cache:litemage:troubleshooting:exclude-price-block-loginrequired-header.png?400 |}} | ||
- | For logged in users, you can make those price block as private ESI block and not cacheable. but this may need custom change, cannot directly do by configuration. Because for non-logged-in users you do not want to have this logic. | + | For the logged-in user: |
+ | {{ :litespeed_wiki:cache:litemage:troubleshooting:exclude-price-block-logged-in.png?600 |}} | ||
+ | {{ :litespeed_wiki:cache:litemage:troubleshooting:exclude-price-block-loginrequired-header.png?400 |}} | ||
+ | |||
+ | On product page click "login" to see the discounted prices from API. Fetch the prices directly from a external API solution to have separate customer pricing. There are two customer groups: group id 1 and group id 2. You would want the API price update for only one customer group 1 and store 1, but not group 2. How? | ||
+ | |||
+ | Caching pages with this kind of setup is tricky. LiteMage is able to cache different prices per customer group, but not per individual customers. We cannot punch a hole for price block, however, we can simply make the whole page either not cache, or privately cache. For this example, we would like to make customer group 1 logged-in user and store ID 1 to be private cache. | ||
+ | |||
+ | To enable private cache, you will need to add ''CacheLookup private on'' in .htaccess after ''LiteMage on'', looks like the following: | ||
+ | <IfModule Litespeed> | ||
+ | LiteMage on | ||
+ | CacheLookup private on | ||
+ | </IfModule> | ||
+ | |||
+ | Also you will need to change LiteMage Esi.php code by adding the following to app/code/community/Litespeed/Litemage/Helper/Esi.php | ||
+ | to ''protected function _getDefaultEnvCookieValue()'' line 1160 - 1164 within ''if ($diffGrp = $this->_config->getConf(Litespeed_Litemage_Helper_Data::CFG_DIFFCUSTGRP))'' | ||
+ | |||
+ | |||
+ | /* customized code added by for case 1 */ | ||
+ | if ($currCustomerGroup == 1 && $currStoreId == 1) { | ||
+ | $this->_cacheVars['flag'] |= self::CHBM_PRIVATE; | ||
+ | } | ||
+ | /* end of customized code change */ | ||
+ | |||
+ | The final code looks like: | ||
+ | |||
+ | protected function _getDefaultEnvCookieValue() | ||
+ | { | ||
+ | ... | ||
+ | ... | ||
+ | if ($diffGrp = $this->_config->getConf(Litespeed_Litemage_Helper_Data::CFG_DIFFCUSTGRP)) { | ||
+ | // diff cache copy per customer group | ||
+ | $currCustomerGroup = Mage::getSingleton('customer/session')->getCustomerGroupId() ; | ||
+ | if ( Mage_Customer_Model_Group::NOT_LOGGED_IN_ID != $currCustomerGroup ) { | ||
+ | if ($diffGrp == 1) // diff copy per group | ||
+ | $default['cgrp'] = $currCustomerGroup ; | ||
+ | elseif ($diffGrp == 2) // diff copy for logged in user | ||
+ | $default['cgrp'] = 'in' ; | ||
+ | elseif ($diffGrp == 3) { | ||
+ | $cgset = $this->_config->getConf(Litespeed_Litemage_Helper_Data::CFG_DIFFCUSTGRP_SET); | ||
+ | if (isset($cgset[$currCustomerGroup])) | ||
+ | $default['cgrp'] = $cgset[$currCustomerGroup]; | ||
+ | } | ||
+ | /* customized code added for case 1 */ | ||
+ | if ($currCustomerGroup == 1 && $currStoreId == 1) { | ||
+ | $this->_cacheVars['flag'] |= self::CHBM_PRIVATE; | ||
+ | // $this->setNotCacheable(); | ||
+ | } | ||
+ | /* end of customized code change */ | ||
+ | } | ||
+ | } | ||
+ | ... | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | So for the logged-in user with group 1 and store 1, it will be served from private cache and private ESI blocks. The rest users will be served from public cache with private ESI blocks. | ||
+ | |||
+ | Updated LiteMage configuration: | ||
+ | Separate Cache Copy per Customer Group -> Yes | ||
+ | |||
+ | After the above change, you should be able to found the pages are being served from LiteMage private cache. | ||
+ | |||
+ | {{ :litespeed_wiki:cache:litemage:troubleshooting:exclude-price-block-logged-in.png?600 |}} | ||
+ | {{ :litespeed_wiki:cache:litemage:troubleshooting:exclude-price-block-logged-in-privatecache-header.png?600 |}} | ||
+ | |||
+ | You should make a backup of the file ''app/code/community/Litespeed/Litemage/Helper/Esi.php'' since it is a customized solution and will be overided by LiteMage upgrade next time. You should copy back the custommized solution when you complete your next upgrade. | ||
- | This will require a custom project to achieve what you want if you do have different pricing at each user level. |