Saya telah menerapkan holepunching header di magento, dan meskipun saya membuatnya bekerja berdasarkan basis pelanggan, saya perlu kemampuan untuk mengambil level ini lebih dalam dengan membuatnya bekerja pada jumlah item keranjang yang berbeda juga.
Ini kode saya.
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();
}
}
Pemahaman saya dari apa yang telah saya baca dari utas holepunching di Magento adalah bahwa aplikasi Mage tidak diinisialisasi ketika cache FPC melayani permintaan, jadi pada dasarnya metode menambahkan atribut placeholder tidak dapat bekerja, karena
Mage::helper( 'checkout/cart' )->getCart()->getItemsCount();
tidak akan bekerja, kan?
Dan meskipun bagaimana seharusnya, tapi sepertinya tidak berjalan sama sekali, seperti saya die()
menelepon di sana tetapi tidak ada yang terjadi.
Jadi apa yang saya lewatkan? Dan bagaimana saya dapat mengambil jumlah item keranjang sehingga dapat digunakan untuk membangun ID cache?
Kemajuan: Saya menemukan
Enterprise_PageCache_Model_Cookie::COOKIE_CART
tetapi ini hanya berubah sekali setelah pembaruan keranjang. Setelah itu tetap sama. Ini aneh, ini terasa seperti solusi tetapi perilakunya mengatakan sebaliknya.
Saya juga tidak bisa menemukan item kereta dalam sesi. Jadi satu-satunya cara yang saya lihat saat ini adalah dengan menyimpan jumlah keranjang dalam sesi setiap kali pembaruan dan kemudian menggunakannya di _getIdentifier()
.
Saya menemukan bahwa pengamat tidak konsisten untuk kereta. Sebagai tambahan, pembaruan acara dikirim tetapi untuk penghapusan, tidak. Jadi saya kira saya dapat menambahkan pengamat saya ke pembaruan harga penawaran, jika itu konsisten dalam memiliki pengamat?
Juga, saya memang membaca pembatalan Cache Halaman Penuh pada perubahan cart (quote) tetapi itu tetap menggunakan
Enterprise_PageCache_Model_Cookie::COOKIE_CART
yang tidak berfungsi dengan baik dalam kasus saya, meskipun saya pikir masalahnya ada di dalamnya. Apa / Bagaimana? Saya tidak yakin.
Juga versi EE saat ini yang telah kami jalankan bahkan tidak memiliki folder Tingkat Lanjut
Model/Container
. saya menggunakanEE 1.10.1.1
Ada saran?
sumber
_getIdentifier
sehingga blok tersebut unik untuk keranjang pelanggan, atau bahkan jumlah item dalam keranjang mereka?Jawaban:
Menggunakan
Enterprise_PageCache_Model_Cookie::COOKIE_CART
adalah cara yang tepat untuk dilakukan, tetapi Anda mungkin perlu melakukan beberapa perubahan.Enterprise_PageCache_Model_Observer::registerQuoteChange
dipanggil pada setiap penawaran quote (termasuk perubahan nomor item) dan juga disebut dalam konteks padaMage::app()
sehingga Anda dapat mengakses semua data sesi. Timpa pengamat ini dan tambahkan lebih banyak data$this->_getCookie()->setObscure
sehingga nilainya berubah kapan pun Anda perlu.sumber