Почему у меня не получается выполнить асинхронный запрос из модуля AJAX Cart?

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
#1 Серега Остапчик
  • Группа: Пользователь
  • Сообщений: 11
  • Регистрация: 29.11.2011

29.11.2011 09:13

Собственно суть проблемы заключается в следующем:
Я разрабатывал расширение добавления продуктов в корзину на аяксе.
До сих пор остался не решенным такой баг.
Если на фронтенде используется HTTPS, то (в каталоге мы на http а в кастомер эреа https) при добавлении продуктов из виджета wishlist аякс запрос умирает.
Мы не можем аяксить с несекъюрного адреса на секъюрный.
Было принято решение аяксить на свой контроллер, контроллер курлом или зенд хттп клиентом будет передавать параметры на стандартный вишлист контроллер, забирать ответ и все будет хорошо. (на стандартный контроллер передавались параметры sid (нужен для авторизации пользователя), item)
Но на практике это не возможно. Запрос курлом замирал и никак не реагировал, так же было и с зендовским клиентом (с использованием различных адаптеров). Если вызывать запрос не через контроллер, а к примеру кроном, то все ок.
Т.е. получается код полностью рабочий, но тупо не хочет работать при вызове в контроллере.
В итоге пришлось скопипастить родной вишлист контроллер, все работает, но это не круто.
Может кто сталкивался с такой проблемой?

Немного дополнительной информации:
так выглядит стандартный линк добавления в корзину из виджета вишлист:
https://domain.com/index.php/wishlist/index/cart/item/1/uenc/aHR0cDovL29zdGFwY2hpay5sb2MvMTYxME5wc2xpZGVyL2luZGV4LnBocC9wZXJpcGhlcmFscy5odG1sP19fX3N0b3JlPWRlZmF1bHQ,/

модуль - wishlist
контроллер - indexController
акшн - cartAction
параметры:
item - id айтема в вишлисте
uenc - base64 ссылка

яваскриптом реврайтим линки на свой контроллер и получаем:
http://domain.com/index.php/mymodule/index/cart/item/1/uenc/aHR0cDovL29zdGFwY2hpay5sb2MvMTYxME5wc2xpZGVyL2luZGV4LnBocC9wZXJpcGhlcmFscy5odG1sP19fX3N0b3JlPWRlZmF1bHQ,/


в контроллере моего модуля:
 public function cartAction()
    {
        $itemId  = $this->getRequest()->getParam('item');
        $uenc  = $this->getRequest()->getParam('uenc');
        $session = Mage::getModel('customer/session');
        $sid = $session->getSessionId();
        $url = "https://domain.com/index.php/wishlist/index/cart/item/{$itemId}/uenc/{$uenc}/SID/{$sid}"; 
        $ch = curl_init(); 
        curl_setopt($ch, CURLOPT_URL,$url); 
        curl_setopt($ch, CURLOPT_FAILONERROR, 1); 
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $result = curl_exec($ch);
        curl_close($ch);  
        var_dump($result);
        die;
}


Настройки курла примерно такие как я написал. Исходный код я удалил, к сожалению.
В общем, если этот код вынести в метод модели и вызвать кроном, то все работало, но при вызове из контроллера - НЕТ.

#2 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

29.11.2011 15:47

Что вы обозначаете терминами «запрос курлом замирал» и «аякс запрос умирает»?

#3 Серега Остапчик
  • Группа: Пользователь
  • Сообщений: 11
  • Регистрация: 29.11.2011

30.11.2011 10:03

в случае с аякс запросом: нельзя аяксить с http на https и наоборот. в этом случае запрос уходит и никакого ответа мы не получим.
в случае с курлом: запрос уходит и все. таймаут не срабатывает. ответа мы тоже не получим.
но это только если мы дергаем курл из контроллера.

#4 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

30.11.2011 10:20

Давайте сначала разберёмся со случаем таймаута.
Проводили ли вы диагностику причин таймаута?
На какой стадии происходит обрыв выполнения запроса?
На стадии веб-сервера? На стадии PHP?

#5 Watchman
  • Группа: Пользователь
  • Сообщений: 14
  • Регистрация: 07.12.2010

01.12.2011 16:15

Я так и не понял зачем curl, зачем лишний раз нагружать сервер? перенесите логику в свой контроллер и дело в шляпе.

#6 Серега Остапчик
  • Группа: Пользователь
  • Сообщений: 11
  • Регистрация: 29.11.2011

05.12.2011 16:48

Фишка в том что копипаст из магентосовского контроллера это плохой тон.

#7 Watchman
  • Группа: Пользователь
  • Сообщений: 14
  • Регистрация: 07.12.2010

06.12.2011 00:51

По моему городить огород c http запросами в пределах одного скрипта, это плохой тон ;)

ps: еще можно в файле контроллера унаследовать маджентовский контроллер (это что бы не копипастить)

pps: посмотрите еще метод _forward()

#8 Серега Остапчик
  • Группа: Пользователь
  • Сообщений: 11
  • Регистрация: 29.11.2011

07.12.2011 10:31

Солюшен был предложен самими магентосовцами поэтому приходится "городить огород..."
ps: в этом случае мы получим редирект на https(

#9 Watchman
  • Группа: Пользователь
  • Сообщений: 14
  • Регистрация: 07.12.2010

07.12.2011 13:45

"самими магентосовцами" :D, в Varien работают простые php программисты 2+ года опыта php, 90% из них ранее не работали с маджентой.

Решение очень спорное, для начала я бы посмотрел как это реализовано в в аналагичных модулях.

#10 Серега Остапчик
  • Группа: Пользователь
  • Сообщений: 11
  • Регистрация: 29.11.2011

08.12.2011 13:59

собственно, поэтому я и создал этот топик

Поделиться темой: