Ответить Новая тема Новый опрос 
 Переопределение FrontController
padlyuck
Новичок
Сообщений: 10
Регистрация: 31-01-2012


31-01-2012 16:24
Стоит задача прикрутить уже имеющийся в наличии модуль геолокации к PrestaShop.
Сам по себе модуль умеет определять страну пользователя и в соответствии с этим выдавать язык и валюту которая соответствует местоположению пользователя.

Было принято решение переопределить метод init() для FrontController. Проблема возникает именно при первом визите, т.к. cookies внутри модуля устанавливаются, но в браузер еще не отсылаются. После того как куки установлены я вызываю метод parent::init() для дальнейшей инициализации системы и этот метод затирает все те изменения в куках, которые я внес внутри модуля геолокации.

Курение исходников показало что все дело в том, что объект кукисов создается во FrontControllerCore::init() каждый раз без проверки существования глобальной переменной.

Править системный FrontControllerCore::init() - нельзя. Копировать целиком FrontControllerCore::init() во FrontController::init() и вносить необходимые правки, чтобы не вызывать родительский метод - тоже не выход, т.к. не известно что придет в следующем обновлении.

Возможно кто-то уже сталкивался с подобной задачей? Подскажите пожалуйста способ красиво обойти это ограничение?
 
Вне форума
ПМ 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
e_v_medvedev
Профессионал
Сообщений: 806
Откуда: Москва
Регистрация: 25-03-2011


31-01-2012 19:07
Использовать override.
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
ors
Профессионал
Сообщений: 1885
Регистрация: 09-11-2009


31-01-2012 19:49
В папку /override/classes/ положить FrontController.php
Код:
<?php
class FrontController extends FrontControllerCore
{
    public function init()
    {
        parent::init();
        //my code
    }
}
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
padlyuck
Новичок
Сообщений: 10
Регистрация: 31-01-2012


31-01-2012 23:38
Прошу прощения, я видимо не однозначно описал. Я уже использую overridde
Код:
<?php
class FrontController extends FrontControllerCore
{
    public function init()
    {
        if(Module::isInstalled('autoswitch'))
            Module::getInstanceByName('autoswitch')->run();
        parent::init();
    }
}
 
Вне форума
ПМ 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
ors
Профессионал
Сообщений: 1885
Регистрация: 09-11-2009


01-02-2012 10:59
А что мешает вызывать модуль после parent::init()?
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
e_v_medvedev
Профессионал
Сообщений: 806
Откуда: Москва
Регистрация: 25-03-2011


01-02-2012 16:16
Да и что тогда беспокоиться об обновлениях версии если override и так используется? Если одного override мало сделайте еще столько, сколько вам нужно, переделав autoload.
 
Вне форума
ПМ Отправить эл.сообщение 
Щелкните, и это сообщение будет добавлено в ваш ответ как цитата Цитировать этот ответ
Ответить Новая тема Новый опрос