Доброе утро всем. Недавно закончил создание простенького модуля отправки смс, где функция отправки смс цеплялась на submit пользовательских форм, как дополнительный callback для модуля WebForms.
Проблема состоит в том, что смс отправляются нормально, но только во время тестирования написанного мной модуля. После того как пройдет немного времени, смс не отправляются. Может кто то сталкивался с этой проблемой. В какую сторону мне смотреть? Что делать? Я предполагаю, что это кэш, хотя не уверен. Спасибо.
Дополнительно:
- кэширование CMS отключено
- использую API сервиса SMSFly
- запрос к серверу сервиса производится по средством curl
Комментарии
Логируйте ответ сервиса, после обращения к нему курлом.
Если курл работает, то с этой частью все ок.
Сделайте через watchdog запись того, что отправляете, и того что принимаете + добавьте обработку исключений через try {...}.
Возможно, наличие кавычек как минимум, и как максимум не стабильный коннект (таймаут).
Но без логов не о чем даже говорить, так как может быть все что угодно.
Лично я склоняюсь к таймауту (если то работает, то нет).
Курлу все равно, есть кеширование или нет. Разве только если вы не отправляете смс из формы, которая и кешируется (но и при этом не должна, так как токен для формы динамичен).
Настроил логирование. Немного позже отпишу, что получаю от сервиса на выходе.
+ вспомнил.
я сталкивался вот еще с чем на подобных сервисах. Это ограничение на размер передаваемого текста. Если оно больше разрешенного, будет возвращать ошибку. Проверьте и это.
Так как если у вас то оправляет, то нет, то возможно, где-то кривит валидация.
Полностью согласен с предыдущими ораторами-)
Расставте в "контрольных" точках отправку отладочных сообщений в журнал Drupal (фуникция watchdog()).
Прямо с момента добавления callback в форму webform, до получения ответа от сервиса.
И сразу станет все понятно..
Проверил. В логи ничего не попадает. После очистки кэша CMS смс снова начинают ходить
До запроса курлом добавь логирование. Может до курла вообще дело не доходит.
В код модуля в нужных местах вставте отправку отладочного сообщения в лог:
<?php
// ... какой-то код ...
watchdog('CMC_debug','ШАГ 1');
// ... какой-то код ...
watchdog('CMC_debug','ШАГ 2');
// ... какой-то код ...
watchdog('CMC_debug','ШАГ 3');
// ... какой-то код ...
watchdog('CMC_debug','ШАГ 4');
// ... какой-то код ...
watchdog('CMC_debug','ШАГ 5');
// ... какой-то код ...
?>
Потом уже смотрите логи, какие "шаги" не отрабатывыают.
Хорошо. Сейчас попробую. Опишу что было.
Вот, что получается. Такое ощущение, что функция которую я прикрепил на обработчик формы не срабатывает. Логирование по шагам не работает вовсе. Что подскажете сделать?
Как прикрепляли? Код.
функция отправки смс цеплялась на submit пользовательских форм
Имя и код хука, в котором колбэк к сабмиту "цепляли"..
"themes_form_alter" в $form['#submit']
Я так понимаю, у вас сабмит вообще не там, где нужно.
Подозреваю, что определяя альтер для формы через ее айди - вы не учитываете, что этот айди по какой либо причине мог меняться (как предположение), если он не указан явно.
+
Не делайте так альтер. Делайте его через явный form_id. Если, конечно, я вас правильно понимаю.
У вас ошибка не в работе отправки смс, а в том, что не корректно прикреплен сабмит.
модуль называется themes?
Где вы хук определяете?
function webform_sms_form_alter(&$form, &$form_state, $form_id) {
....
}
webform_sms - это модуль.
ну а сама функция внутри?
Да модуль.
Вот исходники.
<?php
function webform_sms_send($form, &$form_state){
$message = 'Заказ с номера: ';
$message .= $form_state['values']['submitted']['phone'];
watchdog('SMS_Debug', 'Номер телефона: '. $form_state['values']['submitted']['phone']);
$date = date('Y-m-d H:i:s');
$start_time = date("Y-m-d H:i:s");
$end_time = date("Y-m-d H:i:s", time() + 10800); // плюс 3 часа
$rate = 120;
$description = 'Message DataCall';
$livetime = 1;
$source = '';
$user = '';
$password = '';
$myXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
$myXML .= "<request>";
$myXML .= "<operation>SENDSMS</operation>";
$myXML .= '<message start_time="'.$start_time.'" end_time="'.$end_time.'" livetime="'.$livetime.'" rate="'.$rate.'" desc="'.$description.'" source="'.$source.'">'."\n";
$myXML .= "<body>".$message."</body>";
watchdog('SMS_Debug', 'До ввода номеров телефона'. $myXML);
$phones = db_select('webform_sms', 'n')
->fields('n', array('id', 'Phone', 'LastName', 'FirstName'))
->execute()->fetchAll();
if ($phones) {
foreach ($phones as $phone) {
$myXML .= "<recipient>".$phone->Phone."</recipient>";
}
}
$myXML .= "</message>";
$myXML .= "</request>";
watchdog('SMS_Debug', 'После ввода номеров телефона'. $myXML);
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERPWD , $user.':'.$password);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, 'http://sms-fly.com/api/api.php');
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml", "Accept: text/xml"));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $myXML);
$xml = curl_exec($ch);
watchdog('SMS_Debug', 'Ответ сервера: '. $myXML);
curl_close($ch);
}
function webform_sms_form_alter(&$form, &$form_state, $form_id) {
if(strpos($form_id, 'webform_client_form_') === 0){
$form['#submit'] = array('webform_sms_send', 'webform_client_form_pages', 'webform_client_form_submit');
}
} ?>
Затри логин/пароль. А то не удобно как-то...
Сейчас попробуем разобраться.
Уже сделал. На радостях) Случайно закинул))
вот так вот
Есть два момента.
1. Кеш. Вы используете вебформы? Есть подозрение, что один раз закешировав обрабочик не вызывает его после. Выход - кастомная форма. И проще, и быстрее.
2. Распечатайте, что приходит в webform_sms_form_alter в качестве form_id.
Это только в том случае, если не проходят вотчдоги в самом сабмите.
С самим сабмитом у вас все ок (за исключением, что вы выложили все сначала с логином и паролем, и советую их поменять сейчас). Я думаю, если вы его написали, то и кастомную форму осилите. Просто в этом случае вам не нужно будет пилить альтер.
Спасибо. По делу сказано. Завтра переделаю посмотрю на результат и отпишу. Кастомная форма выход. Я думал, что получится сделать с WebForms но понимаю что увы.
Фебформы хороши, если вы можете без лишнего сделать на них необходимое.
В вашем же случае - лучше кастом. Вы сможете сами все контролировать + при подобных моментах меньше головной боли. Тем более, уверен, ваш скил с легкостью решит эти моменты.
кстати, с удовольствем бы почитал про отправку смс.
Может, запилим модулем простой с формой (или цепляемый сабмит через id формы) для отправки уведомлений на смс?
Немного не понял Вас.
Хм...
Я имел ввиду - напишите статью тут (у себя в блоге на д ру) о том, как пользоваться/сделать такую отправку, что для этого нужно знать и где регистрироваться.
И я напишу простой модуль, который будет через админку цепляться к форме (или айди формы) и отправлять смс.
Интересное предложение. Да можно будет заняться
Какого цвета лисипед будет? А колеса?-)
Ну, для меня например чек hook_boot - велосипед, или работа с 10ю млн. терминами таксономии или сущностями, или перепелить все полня на кастом, включая составные поля и запихнуть их в серч апи индекс..
но за всю историю с отправкой смс и не работал (
Я про то, что модулей про СМС уже куча..
Есть целые "комбайны" - один модуль на пару десятков операторов.(правда, последний раз когда смотрел, были только для заграничных операторов)
Похвастаюсь, я тоже подобный писал(для конкретного оператора):
отправка СМС - action для модуля Rules.
Цепляй к любому событию Rules и отправляй что хошь.
И ни каких заморочек с сабмитами.-))
А вот сделать "комбайн" для местных операторов наверное было бы полезно, и чтоб операторы добавлялись плагинами, а то и вовсе "настройками" в базе.
хорошая мысль.
просто я с смс не работал. про рулес - а есть статейка, или заметка на этот счет?
По-русски материалов мало..
http://internetdevels.ru/blog/creating-custom-events-and-actions-using-r...
Или по php-овски-):
https://www.drupal.org/project/examples
модуль rules_example
еще примерчик: https://github.com/orion76/sms_ru
о, спасибо.
а сразу наперед.
настройки работу gateway у них +- одинаковые?
это я к тому, что если делать универсальный модуль - то есть ли единый стандарт у сервисов, что предоставляют доступ?
Эту информацию надо собирать, но я не думаю, что много очень "разных" вариантов настроек и "способов" отправки.
1.URL
2.Ключ авторизации.
3.Поле сообщения
4.Поле ответа.
Заводите проект на github, помогу чем смогу.. Интересно же-)
Кстати.. А откуда такая заинтересованность?
Я пробовал изучить спрос, вроде большого спроса не выявил..
Явного спроса нет. Как и готовых решений из коробки.
А вот любителям ос коммерца (например) или любых других инет магазов на друпале - думаю, было бы интересно.