Holepunching de l'en-tête dans le magasin magento

10

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?

Nirav Sheth
la source
Pas sûr, mais je pense que cette question est plus liée à Stack Overflow, mais pas à ce site ...
Sergei Guk
2
Holepunching semble être utilisé ici dans un sens non traditionnel, pouvez-vous expliquer la fonctionnalité que vous essayez d'implémenter sans utiliser de jargon?
Ralph Tice
1
Pourquoi ne pas ajouter l'identifiant du panier des clients à _getIdentifierafin que le bloc soit unique au panier des clients, ou même au nombre d'articles dans leur panier?
B00MER
@SergeiGuk Eh bien, il est fortement lié à Magento
j0k
@RalphTice J'essaie d'implémenter un indicateur de valeur de panier dans l'en-tête qui montre à l'utilisateur combien d'articles il y a dans son panier. Étant donné que cette valeur est différente par utilisateur, je ne veux pas qu'elle soit mise en cache.
Nirav Sheth

Réponses:

3

L'utilisation Enterprise_PageCache_Model_Cookie::COOKIE_CARTest la bonne façon de procéder, mais vous devrez peut-être apporter quelques modifications.

Enterprise_PageCache_Model_Observer::registerQuoteChangeest appelé à chaque sauvegarde de devis (changement de numéro d'article inclus) et il est également appelé dans le contexte Mage::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()->setObscureque la valeur change chaque fois que vous en avez besoin.

Paul Grigoruta
la source
Avez-vous des exemples à partager sur cette opération?
Nirav Sheth