J'ai implémenté l'holepunching de l'en-tête dans magento, et même si je l'ai fait fonctionner sur une base par client, j'ai besoin de pouvoir approfondir ce niveau en le faisant fonctionner sur le nombre d'articles de panier différent.
Voici mon code.
class AD_PageCache_Model_Container_Header extends Enterprise_PageCache_Model_Container_Abstract {
protected function _getIdentifier() {
return $this->_getCookieValue(Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER, '');
}
// public function getCacheKeyInfo() {
// $info = parent::getCacheKeyInfo();
// die('boo');
// $info['cart_count'] = Mage::helper( 'checkout/cart' )->getCart()->getItemsCount();
// return $info;
// }
protected function _getCacheId() {
//return 'CONTAINER_HEADER_' . md5($this->_placeholder->getAttribute('cache_id') . $this->_placeholder->getAttribute('cart_count') ) . '_' . $this->_getIdentifier();
return 'CONTAINER_HEADER_' . 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();
}
}
Ma compréhension de ce que j'ai lu à partir de threads holepunching sur Magento est que l'application Mage n'est pas initialisée lorsque le cache FPC sert la demande, donc en gros la méthode d'ajout d'un attribut d'espace réservé ne peut pas fonctionner, car
Mage::helper( 'checkout/cart' )->getCart()->getItemsCount();
ne fonctionnera pas, non?
Et même si c'est comme ça que ça devrait être, mais ça ne semblait pas fonctionner du tout, comme si j'avais passé un die()
appel là-dedans mais rien ne s'est passé.
Alors qu'est-ce qui me manque? Et comment puis-je récupérer le nombre d'articles du panier afin qu'il puisse être utilisé pour créer l'ID de cache?
Progrès: j'ai trouvé
Enterprise_PageCache_Model_Cookie::COOKIE_CART
mais cela ne change qu'une fois lors de la mise à jour du panier. Après cela, il reste le même. C'est bizarre, cela ressemble à la solution mais son comportement dit le contraire.
Je n'ai pas pu non plus trouver le nombre d'articles du panier pendant la session. Donc, la seule façon que je vois actuellement de le faire serait d'enregistrer la quantité de panier en session à chaque mise à jour, puis de l'utiliser dans _getIdentifier()
.
J'ai trouvé que les observateurs ne sont pas cohérents pour le chariot. De plus, la mise à jour des événements est envoyée, mais pour la suppression, ce n'est pas le cas. Donc je suppose que je peux ajouter mon observateur à la mise à jour des prix de la citation d'une manière ou d'une autre, si cela est cohérent en ayant des observateurs?
De plus, j'ai lu l' invalidation du cache de page complète lors du changement de panier (devis), mais il gère l'utilisation de
Enterprise_PageCache_Model_Cookie::COOKIE_CART
ce qui ne fonctionne pas bien dans mon cas, même si je pense que le problème réside à l'intérieur. Quoi comment? Je ne suis pas sûr.
De plus, la version actuelle d'EE que nous avons en cours n'a même pas de dossier avancé
Model/Container
. j'utiliseEE 1.10.1.1
Aucune suggestion?
la source
_getIdentifier
afin que le bloc soit unique au panier des clients, ou même au nombre d'articles dans leur panier?Réponses:
L'utilisation
Enterprise_PageCache_Model_Cookie::COOKIE_CART
est la bonne façon de procéder, mais vous devrez peut-être apporter quelques modifications.Enterprise_PageCache_Model_Observer::registerQuoteChange
est appelé à chaque sauvegarde de devis (changement de numéro d'article inclus) et il est également appelé dans le contexteMage::app()
afin que vous puissiez accéder à toutes les données de session. Remplacez cet observateur et ajoutez plus de données pour$this->_getCookie()->setObscure
que la valeur change chaque fois que vous en avez besoin.la source