Форум русской поддержки Joomla!® CMS
08.12.2016, 18:27:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1] 2  Все   Вниз
  Добавить закладку  |  Печать  
Автор

Plugin с использованием AJAX

 (Прочитано 311 раз)
0 Пользователей и 1 Гость смотрят эту тему.
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« : 21.09.2016, 16:46:39 »

Пытаюсь писать.

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

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

Пишем плагин оплаты через СБ РФ для компонента. (Надо сказать, что банк предоставил плагин от VM, он не подходит но внутри все операции написаны, так что думаю дело за малым)

1.1. Надо зарегистрировать заказ на платежном шлюзе.
1.2. Получить идентификаторы и ссылку на платежную страницу для только что зарегинного заказа. Ну и показать ее клиенту для дальнейшего перехода.
1.3. Клиент уходит на страницу.
1.4. Возвращается и проверяется статус оплаты.
Это система взаимодействия. Кратко конечно.

Клиенту на это плевать. Естественно. И задача получить минимум переходов до страницы оплаты.

Думается мне следующее.
2.1. На страницы оформленного заказа в определенное место подгружаются плагины со способами оплаты. в том числе СБ РФ.
2.2. По ссылке на словах "Вы можете оплатить по средствам карты СБ" осуществляется AJAX запрос к этому же плагину и происходит пункт 1.1 с ответом от платежного шлюза
2.3. Вместо всего блока (блок удаляется) ставим "Перейти на страницу оплаты"
2.4. действия на стороне банка им возврат по моей ссылке назад на эту же страницу.
2.5. При определенных условиях проверка статуса оплаты через тотже AJAX запрос к плагину который вернет статус и выполнит действия с финансовой частью заказа в компоненте.
2.6. Клиент видит статус оплаченного заказа и условия получения услуги.

Собственно вопрос в том как плагин должен реализовать AJAX запросы к самому себе? Через com_ajax или все-таки что-то свое?



Записан
b2z
Support Team
*****

Репутация: +710/-0
Online Online

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #1 : 21.09.2016, 16:52:02 »

Я бы сделал AJAX запрос в свой компонент и там бы вызывал нужный плагин.
Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #2 : 21.09.2016, 16:59:44 »

Я бы сделал AJAX запрос в свой компонент и там бы вызывал нужный плагин.

К сожалению не уловил мысли.

плагин оплаты делает запрос в компонент, там стоит контроллер который будет пользоваться файлами плагина и выполнять всю работу за широмой и возвращать плагину? Т.е. все процедуры хранятся в плагине, а в компоненте реализовать прием ajax-запросов и обработкой запросов функционалом плагина. Так или я не все понимаю?
Записан
b2z
Support Team
*****

Репутация: +710/-0
Online Online

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #3 : 21.09.2016, 17:02:04 »

Ну да, как-то так. Но это моё личное мнение, плюс что-то подобное видел в других компонентах.
Записан
fsv
Практически профи
*******

Репутация: +330/-2
Offline Offline

Пол: Мужской
Сообщений: 2244


« Ответ #4 : 21.09.2016, 20:44:33 »

Цитировать
1.1. Надо зарегистрировать заказ на платежном шлюзе.
1.2. Получить идентификаторы и ссылку на платежную страницу для только что зарегинного заказа. Ну и показать ее клиенту для дальнейшего перехода.
Не работал с СБ. Вы доки получили, и там так написано? А общую их схему взаимодействия можете описать? А то что-то новое и не понятное.
Зачем заказ регистрировать в банке/шлюзе до оплаты? Его могут и не оплатить. И что значит "зарегистрировать"?

Обычно все проще: форма со скрытыми полями и кнопкой. В полях - ваши рег.данные для банка (схема шифрования обычно в доках), параметры заказа, ссылка для возврата на ваш сайт. По клику на кнопку - переход на сайт банка для оплаты, после оплаты - возврат на вашу страницу, где и статус, и детали оплаченного заказа. Где тут AJAX?
Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #5 : 21.09.2016, 23:28:17 »

Не работал с СБ. Вы доки получили, и там так написано? А общую их схему взаимодействия можете описать? А то что-то новое и не понятное.
Зачем заказ регистрировать в банке/шлюзе до оплаты? Его могут и не оплатить. И что значит "зарегистрировать"?

Обычно все проще: форма со скрытыми полями и кнопкой. В полях - ваши рег.данные для банка (схема шифрования обычно в доках), параметры заказа, ссылка для возврата на ваш сайт. По клику на кнопку - переход на сайт банка для оплаты, после оплаты - возврат на вашу страницу, где и статус, и детали оплаченного заказа. Где тут AJAX?

именно сначала надо зарегистрировать заказ на платежном шлюзе и получить в ответ индивидуальную страницу оплаты. вот тут нужен AJAX.
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3591


« Ответ #6 : 21.09.2016, 23:52:45 »

Тоже ничего не понял.
Для каждого заказа нужно получить новый ID и ссылку?
Еще и показать ссылку клиенту? Чтобы он что сделал?
Почему сразу не перенаправить клиента на форму оплаты банка с токеном (или чем там еще), необходимыми деталями заказа и ссылками для возврата на сайт продавца (оплатил - сюда, не оплатил - сюда и т.д.)?
Записан
Arkadiy
Группа развития
*****

Репутация: +432/-0
Online Online

Пол: Мужской
Сообщений: 5316


Крепитесь, други.


« Ответ #7 : 22.09.2016, 07:52:43 »

именно сначала надо зарегистрировать заказ на платежном шлюзе и получить в ответ индивидуальную страницу оплаты. вот тут нужен AJAX.
Обычно это делают с помощью cURL, на худой случай file_get_contents в php, потом выводят полученный HTML на страницу. Но все-же удобнее отправить клиента в банк со всеми данными и обратным URL.
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7774



« Ответ #8 : 22.09.2016, 10:53:26 »

Зачем заказ регистрировать в банке/шлюзе до оплаты? Его могут и не оплатить. И что значит "зарегистрировать"?
несколько раз делал такие видимо особо "умные" платежные системы. или "умные" - это их разработчики... у каждого свои велосипеды Azn на конкурента глянуть лень или не комильфо, вот и выдумывают каждый свое Azn

Обычно это делают с помощью cURL, на худой случай file_get_contents в php, потом выводят полученный HTML на страницу
совершенно верно. если такая схема работы - то обычно банк предоставляет доступ к своему REST API, с помощью которого заказ и регистрируется в их системе. а в ответ получаете все необходимые для формирования HTML параметры, и показываете готовую страницу клиенту. AJAX тут не нужен вообще. более того - использование AJAX создаст дополнительные проблемы в плане безопасности.
Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #9 : 22.09.2016, 13:16:05 »

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

Регистрировать заказ на шлюзе - НАДО и только ПОСЛЕ генерируется страница оплаты.
Записан
Arkadiy
Группа развития
*****

Репутация: +432/-0
Online Online

Пол: Мужской
Сообщений: 5316


Крепитесь, други.


« Ответ #10 : 22.09.2016, 13:18:33 »

Работать плагин должен только после того, как покупатель выбрал способ оплаты и нажал кнопку "Оплатить". Дальше - по предложенному алгоритму.
Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #11 : 22.09.2016, 13:40:20 »

Смотрите.
Сделал из плагина кнопку "Оплата через БАНК". На кнопке висит onClick который отправляет ajax-запрос в компонент (для которого плагин и пишется). Компонент должен подключить файлы плагина и получить переменные плагина. Исполнить ту часть функций которая отвечает за соединение с банком. Далее ответ от банка и компонент через первый ajax-запрос отдает ответ банка в приготовленном виде.

Вопросы:
1. Подскажите как подключить файлы плагина?
2. Как получить переменные плагина (пароль и логин) из компонента? Пароль и логин передаваться в AJAX не буду.
Записан
SmokerMan
Профи
********

Репутация: +694/-25
Online Online

Пол: Мужской
Сообщений: 5225



« Ответ #12 : 22.09.2016, 13:52:35 »

Вопросы:
1. Подскажите как подключить файлы плагина?
2. Как получить переменные плагина (пароль и логин) из компонента? Пароль и логин передаваться в AJAX не буду.

Код:
$dispatcher = JEventDispatcher::getInstance();
JPluginHelper::importPlugin('Группа плагинов');
$dispatcher->trigger('Событие', array ('Переменные которые передаются в событие'));

зачем получать переменные плагина не совсем понятно
да и обработку лучше делать наверное в плагинах, а не компоненте, так же как и хранить данные для соединения пи прочего в параметрах плагина
а то получается при добавлении нового плагина опять придется лезть в компонент и чего-то там делать
Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #13 : 22.09.2016, 14:36:02 »

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

Спасибо!
Поясню что я пытаюсь сказать.

1. Компонент выводит все плагины оплаты на страницу заказа.
2. Запускаются функции из каждого плагина для вывода на страницу заказа. А именно HTML с содержимым "Оплатить при помощи Банка" или "Оплатить другим способом".
В частности для банка нужна та операция из-за которой все это придумывается. Точнее нужен дополнительный 1 шаг системы прежде чем выдать клиенту его личную страницу оплаты.
3. При нажатии на "Оплатить при помощи БАНКА" отправляется ajax-запрос в компонент со след данными: данные о заказе, обратный URL, ИМЯ ПЛАГИНА.
4. Компонент же понимсает что к нему обращается именно ПЛАГИН с параметром ИМЯПЛАГИНА и начинает вызывать функцию из конкретного плагина, но нужны еще параметры плагина, т.к. там храняться настройки для соединения с банком (в частности).
5. Уже функция плагина (вызванная компонентом) делает все обработки со СВОИМИ данными а в ответ отдает подготовленный HTML.
Всё. Чувствую некоторые ответе форумчан немного в разные пункты моей задачи направлены. Да с банком общаться будет cURL. А AJAX-нужен чтоб страницу не перегружать пока фоново отдам команду на регистрацию заказа. Данные из плагина, повторюсь, в частности, логин и пароль, который должен браться лишь в момент взаимодействия с банком (cUrl), а не в AJAX.
Добавление нового плагина должно лишь соблюсти туже структуру (оправка имени плагина в запросе AJAX, обращение компонентом к тойже функции) Тогда новые плагины не будут требовать доработки на стороне компонента.
Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #14 : 22.09.2016, 14:37:47 »

Код:
$dispatcher = JEventDispatcher::getInstance();
JPluginHelper::importPlugin('Группа плагинов');
$dispatcher->trigger('Событие', array ('Переменные которые передаются в событие'));

Ну и не просмотрел код сразу... Это не то что я спрашиваю. Мне надо не подключить все включенные в группу плагины, а обратить к функции конкретного плагина.
Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #15 : 22.09.2016, 14:41:46 »

importPlugin может обратиться к одному плагину?
Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #16 : 22.09.2016, 14:53:34 »

Код
$dispatcher = JEventDispatcher::getInstance();
JPluginHelper::importPlugin('Группа плагинов', 'имя плагина');
$dispatcher->trigger('функция', array ('данные'));
 
вот так можно получить то что я спрашивал.

Остался вопрос как получить параметры конкретного плагина
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7774



« Ответ #17 : 22.09.2016, 14:56:00 »

Мне надо не подключить все включенные в группу плагины, а обратить к функции конкретного плагина.
да это вообще неверный подход. вы нарушаете принцип модульности. компонент понятия не имеет, какие есть плагины. вы не должны идти по этому пути, он ошибочный.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #18 : 22.09.2016, 15:34:11 »

Остался вопрос как получить параметры конкретного плагина
Запрос в базу...
Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #19 : 22.09.2016, 15:35:42 »

Так вот в начале ветке и спрашивал как заставить плагин через AJAX обращаться к себе же. Мне сказали лучший способ через компонент.

Но и вас я не понию, где тут принцип модульности нарушается? Тем что в компоненте появляется некая функция которой плевать какой плагин ей пользуется и которой плевать что назад выкидывать? Все что функция в компоненте делает так это отправляет на след шаг в плагине.

Скажите как можно при помощи AJAX запроса из плагина вызвать этот же плагин?
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7774



« Ответ #20 : 22.09.2016, 16:37:46 »

Цитировать
Но и вас я не понию, где тут принцип модульности нарушается? Тем что в компоненте появляется некая функция которой плевать какой плагин ей пользуется и которой плевать что назад выкидывать?
в том то и дело, что увас получается, что не плевать. вы пытаетесь вызвать конкретный плагин. получить его параметры, и в компоненте их обработать. а это неверно. компонент ничего не должен знать о плагинах, ничего не должен знать об их параметрах, и тем более ничего не должен знать, как именно их обрабатывать. это дело самого плагина. компонент должен только получить от плагина уже готовый ответ

Цитировать
Скажите как можно при помощи AJAX запроса из плагина вызвать этот же плагин?
как вам уже и сказали - через компонент. подключайте группу, вызывайте метод например так
Код:
$dispatcher->trigger(onPreparePaymentForm, array ($paymentMethod, $result));
в плагине проверяйте $paymentMethod - если совпадает, то плагин отрабатывает и в $result что то пишет.
Записан
SmokerMan
Профи
********

Репутация: +694/-25
Online Online

Пол: Мужской
Сообщений: 5225



« Ответ #21 : 22.09.2016, 16:37:53 »

Но и вас я не понию, где тут принцип модульности нарушается?
нарушается потому что вызывается конкретный плагин, а не группа
если завтра понадобиться еще один способ оплаты или чего-то там добавить, опять надо будет лезть в этот плагин и писать там отдельный метод для этого или что?
а так просто поставил еще доп. плагин и все, если надо его можно отключить
а что конкретно делать, т.е. какой плагин надо вызвать, то это можно определить вот тут
Цитировать
$dispatcher->trigger('Событие', array ('Переменные которые передаются в событие'));
передать нужную переменную
на примере тех же стандартных плагинов группы content это переменная $context

Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7774



« Ответ #22 : 22.09.2016, 16:46:53 »

а вообще имхо вам не нужны в данном случае плагины Joomla. у них принцип работы немного не подходит под задачу, как по мне. я бы сказал, что вам нужен собственный расширяемый класс.
Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #23 : 22.09.2016, 17:04:33 »

Я может что-то не понимаю, но логика с плагинами вот.
1.Каждую новую оплату делаю в виде плагина.
2.В каждом плагине есть начальная функция, которая презентует оплату на странице заказа и может (если надо) воспользоваться ajax-переходом на второй шаг процесса оплаты. Этот шаг сделан через компонент для которого эта оплата пишется.
Сделано так:
в компонент передается имя плагина (Плагин сам знает как его лично зовут) и аргументы.
функция в компоненте вызывает плагин и передает ему параметры.
плагин все что угодно делает с ними и возвращает HTML/JSON/TEXT
функция компонента отдает HTML/JSON/TEXT
js плагина знает как работать с данными которые он запросил.

Масштабируемость должна выйти. Ну у меня пока вышло, а время покажет.

Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #24 : 22.09.2016, 17:07:54 »

Запрос в базу...

Оказалось проще. После вызова функции плагина, она может напрямую обращаться к параметрам.
Код
$dispatcher = JEventDispatcher::getInstance();
JPluginHelper::importPlugin('turismpayment', $plugName);
$answer = $dispatcher->trigger('turismPaymentConfirmOrder', array('orderId'=>$orderId, 'orderSumm'=>$orderSumm, 'orderReturnUrl'=>$orderReturnUrl));

Код
$params = $this->params;
$login = $params->get('merchant', '');
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7774



« Ответ #25 : 22.09.2016, 17:41:53 »

ну так то оно так, только вы изначально говорили о другом. ну или по крайней мере я понял другое.

Код:
$this->params->get('merchant', '');
это делать в самом плагине. а вы спрашивали в компоненте. ну или как я уже сказал - по крайней мере я так понял, что в компоненте.
Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #26 : 22.09.2016, 18:09:45 »

Код:
$this->params->get('merchant', '');
это делать в самом плагине. а вы спрашивали в компоненте. ну или как я уже сказал - по крайней мере я так понял, что в компоненте.

компонент вызывает функцию плагина, а вот там уже это
Записан
beliyadm
Профи
********

Репутация: +1566/-61
Offline Offline

Пол: Мужской
Сообщений: 8110


Севастополь == Россия


« Ответ #27 : 23.09.2016, 02:31:20 »

Компонент не обязателен.
Из своего плагина делаете AJAX запрос к скрипту (пусть он лежит в той же папке плагина)

Код
$.ajax({
            type: 'POST',
               url: "/modules/mod_2call/ajax.php",

а там подключаем стандартные вещи (это для 2.5)
Код
	if ( file_exists( __DIR__ . '/defines.php' ) ) {
   include_once __DIR__ . '/defines.php';
}
if ( !defined( '_JDEFINES' ) ) {
   define( 'JPATH_BASE', __DIR__ . '/../../' );
   require_once JPATH_BASE . '/includes/defines.php';
}
require_once JPATH_BASE . '/includes/framework.php';

И после пляшем с стандартным API движка. Я так не один модуль писал
Записан
Arkadiy
Группа развития
*****

Репутация: +432/-0
Online Online

Пол: Мужской
Сообщений: 5316


Крепитесь, други.


« Ответ #28 : 23.09.2016, 08:06:29 »

Сейчас в Joomla есть com_ajax, не нужно обходить логику, надо действовать в соответствии с логикой Joomla, сделать плагин группы AJAX и к нему через com_ajax обращаться. Если конечно нет своего компонента, если он есть, то обращаться к плагину лучше через него.
Записан
b2z
Support Team
*****

Репутация: +710/-0
Online Online

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #29 : 23.09.2016, 10:00:52 »

Сейчас в Joomla есть com_ajax, не нужно обходить логику, надо действовать в соответствии с логикой Joomla, сделать плагин группы AJAX и к нему через com_ajax обращаться. Если конечно нет своего компонента, если он есть, то обращаться к плагину лучше через него.
+1
Записан
Страниц: [1] 2  Все   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet