Как переопределить Mage_Core_Controller_Request_Http - PullRequest
2 голосов
/ 08 февраля 2012

Я сделал некоторые изменения в Mage_Core_Controller_Request_Http, но в файле, распространяемом с magento.Это не лучший способ, я знаю, но я не смог понять, как переопределить файл в каталоге Controller.Я могу узнать, как переопределить файлы в каталоге контроллеров.

Может кто-нибудь сказать мне, как я могу переопределить Mage_Core_Controller_Request_Http в моем собственном расширении.

спасибо

Ответы [ 3 ]

9 голосов
/ 09 февраля 2012

Если вы не хотите возвращаться к хаку с включенным путем, вы также можете использовать отражение, чтобы установить собственный класс запросов для модели Mage_Core_Model_App. Для этого вы можете использовать наблюдателя для события controller_front_init_before.
Я предполагаю, что вы знакомы с тем, как создать наблюдатель событий, поэтому я добавлю только код для метода наблюдателя. Если вам нужна дополнительная информация, пожалуйста, спросите.

// Observer method
public function controllerFrontInitBefore(Varien_Event_Observer $observer)
{
    $app = Mage::app();
    $reflection = new ReflectionClass($app);
    $property = $reflection->getProperty('_request');
    $property->setAccessible(true);
    $myRequest = new Your_Module_Controller_Request_Http();
    $myRequest->setOrigRequest($app->getRequest()); // if needed
    $property->setValue($app, $myRequest);

    // Proof of concept:
    // Loggs Your_Module_Controller_Request_Http
    Mage::log(get_class(Mage::app()->getRequest()));
}

Создайте класс Your_Module_Controller_Request_Http и расширьте исходный Mage_Core_Controller_Request_Http.
После этого события ваш объект запроса будет использоваться вместо оригинала.

Это позволяет вам оставаться максимально безопасным при обновлении, поскольку вам не нужно копировать полный класс из пула кода cor.

5 голосов
/ 09 февраля 2012

Редактировать: решение Vinai является лучшим.

Поскольку этот класс создается непосредственно, вам придется использовать так называемый include path hack для переопределения.

Порядок приоритета для включаемых путей, которые влияют на работу Varien_Autoload, установлен в app/Mage.php. Этот порядок выглядит следующим образом:

  1. app/code/local/
  2. app/code/community/
  3. app/code/core/
  4. lib/

Поэтому, если вы скопируете свой файл по аналогичному пути под кодовыми пулами local или community, будет использовано ваше определение этого класса.

2 голосов
/ 06 августа 2012

Начиная с Magento 1.7, вы можете использовать метод Mage::app()->setRequest($request) для замены объекта запроса внутри наблюдателя для события controller_front_init_before, как это предлагается Vinai .

ПРЕДУПРЕЖДЕНИЕ дляMagento Enterprise: Полный кэш страниц не будет работать с этим методом, поскольку он полагается на изменения объекта запроса, сделанные до controller_front_init_before.Вам нужно либо вручную скопировать все свойства из старого запроса в новый, либо заменить класс запроса на benmarks решение .

...