Файлы cookie и база данных Magento работают при загрузке страницы - PullRequest
2 голосов
/ 24 февраля 2012

Я хочу выполнить некоторые операции с базой данных и получить / установить cookie перед загрузкой главной страницы. для какого события я бы сделал наблюдателя? Я еще не приступил к созданию файлов cookie в своих исследованиях, сейчас я хочу провести некоторые манипуляции с базой данных на этом мероприятии. У меня есть наблюдатель, который сейчас уходит в controller_front_send_response_before, и это ошибка, которую я получаю.

Mage registry key "_singleton/" already exists

Trace:
#0 /var/www/html/app/Mage.php(192): Mage::throwException('Mage registry k...')
#1 /var/www/html/app/Mage.php(446): Mage::register('_singleton/', false)
#2 /var/www/html/app/code/core/Mage/Core/Model/App.php(1252): Mage::getSingleton(false)
#3 /var/www/html/app/Mage.php(416): Mage_Core_Model_App->dispatchEvent('controller_fron...', Array)
#4 /var/www/html/app/code/core/Mage/Core/Controller/Varien/Front.php(186): Mage::dispatchEvent('controller_fron...', Array)
#5 /var/www/html/app/code/core/Mage/Core/Model/App.php(340): Mage_Core_Controller_Varien_Front->dispatch()
#6 /var/www/html/app/Mage.php(627): Mage_Core_Model_App->run(Array)
#7 /var/www/html/index.php(86): Mage::run('', 'store')
#8 {main}

Это мой конфигурационный узел:

<frontend>
    ... 
    <events>
        <controller_front_send_response_before>
            <observers>
                <type>singleton</type>
                <class>Foo_Bar_Model_Observer</class>
                <method>controllerFrontSendResponseBefore</method>
            </observers>
        </controller_front_send_response_before>
    </events>
</frontend>

А это моя модель наблюдателя

class Foo_Bar_Model_Observer
{
    public function controllerFrontSendResponseBefore(Varien_Event_Observer $observer)
    {
         $id = 1;
         $theVisitors = Mage::getModel('visitors/visitor');
         $theVisitors->load($id);  
         $numVisits = (int)$theVisitors->getNumvisits();
         ++$numVisits;
         $theVisitors->setNumvisits($numVisits);
         $theVisitors->save();
    }
} 

Ответы [ 3 ]

1 голос
/ 25 февраля 2012

Вы работаете с сообществом или Magento Enterprise?Если вы используете Magento Enterprise, и страница полностью обслуживается модулем Full Page Cache (Enterprise_PageCache), никакие события не будут запущены.Это означает, что ваш код будет запущен только в первый раз, когда не будет доступен полный кеш.Следующие посетители получат веб-сайт из кэша, таким образом, без каких-либо событий.

Причина в том, что с включенным (и заполненным) FPC, Magento обслуживает весь контент без фактического запуска полного приложения.Это также приводит к пустой коллекции наблюдателей, таким образом, нечего отправлять.Ваш пользовательский наблюдатель не будет запущен.

Насколько я знаю, единственный способ заставить эту работу работать в режиме FPC - пробить дыру для каждого уникального пользователя, чтобы заставить Magento инициализировать приложение и таким образом вызвать все обычныесобытия в процессе и достижения вашего пользовательского кода.

Если вы запускаете сообщество, вам не о чем беспокоиться.Если только вы не используете вариант FPC для сообщества, такой как модуль TinyBrick LightSpeed.

1 голос
/ 25 февраля 2012

См. Оператор switch в Mage_Core_Model_App::dispatchEvent(). Вы не объявляете узел <model> в своей конфигурации наблюдателя - у вас есть узел <class>. Интересно, что Mage::getSingleton() плохо закодировано. Проверка того, нужно ли создавать и регистрировать экземпляр синглтона, не обрабатывает прототип ключа _singleton/!

Теперь для вашего печенья. Ммм печенье. Вы наблюдаете правильное событие для манипуляции куки (очевидно в комментарии от Mage_Core_Controller_Varien_Front::dispatch()). Вы также можете наблюдать controller_action_predispatch. Тем не менее, они будут срабатывать при каждом просмотре страницы, поэтому вам необходимо реализовать логику первого посетителя в вашем наблюдателе. Кроме того, в качестве примера здесь может быть приведен какой-то дурацкий код, но очевидно, что главная страница - не единственная начальная точка входа (я предполагаю, что именно это вы и будете делать с файлами cookie). В маршрутизаторе CMS есть событие с простым таргетингом, Mage_Cms_Controller_Router - вы можете использовать его для просмотра домашней страницы.

Было бы упущением не сказать вам, что на месте есть механизм регистрации посетителей (см. Таблицы log_*).

0 голосов
/ 24 июня 2013

этот тип проблемы связан с компиляцией magento

следует подумать о выполнении компиляции

перейти в настройки / инструменты / компилятор или из командной строки: php shell / compil.php -- составить

хадия

...