テンプレート/phtml ファイル内、および/またはブロックのクラス内で機能させようとしている場合は、苦労するでしょう。主な理由は、magento がパフォーマンスの目的で PHTML ブロックを (積極的に) キャッシュし、特に Cookie チェックに関連するプログラム フロー制御ステートメントを元に戻すためです。その理由を直接的/長く/詳細に説明することはできませんが、それが私が何度も何度も遭遇した方法です.
ただし、ソリューションは正しいはずですが、コントローラーはキャッシュされないため、前述の積極的なキャッシュを回避するために、コントローラーの preDispatch メソッド内でチェックを行う必要があります。(リンクした質問のニックのソリューションに示されています。):
// Ensure we're in the admin session namespace for checking the admin user..
Mage::getSingleton('core/session', array('name' => 'adminhtml'))->start();
$admin_logged_in = Mage::getSingleton('admin/session', array('name' => 'adminhtml'))->isLoggedIn();
// ..get back to the original.
Mage::getSingleton('core/session', array('name' => $this->_sessionNamespace))->start();
PHTML ファイルまたは名前付きブロック内で上記のチェックを実行する必要がある場合は、次のコードを参照して、ブロック レベルのキャッシュを無効にし、機能させる方法を確認してください。私が以前にしたことは、フッターブロックのキャッシュを無効にすることでした(phtmlではなく子ブロックに
特定のCookieをチェックするコードが含まれています)
まず、ブロック呼び出し (local.xml、またはモジュール レイアウト更新 xml、またはレイアウト更新を行うことができる場所で見つかります。私はカスタマイズをモジュールに分割することを好むので、間違いなくモジュール レイアウト更新 xml を使用する方法です) :
<reference name="footer">
<action method="unsetData"><key>cache_lifetime</key></action>
<action method="unsetData"><key>cache_tags</key></action>
<block type="newsletterpopup/popup" name="newsletterpopup_footer" template="newsletterpopup/popup.phtml"/>
</reference>
そして、これはニュースレターポップアップのブロッククラスです:
<?php
class Launchpad_Newsletterpopup_Block_Popup extends Mage_Core_Block_Template {
public function canRender() {
// Check if cookie exists here
}
public function afterRender() { // if block has rendered, this is called.
// Set cookie, if it doesn't exist here.
}
}
phtml は次のようになります。
<?php if($this->canRender()): ?>
// stuff
<?php endif; ?>
幸運を!