Необходимо получить данные после оформления заказа и отправить в телеграм.
Через обычные формы схема работает через hook fоrm_alter + вызов самой функции где я получаю данные ($data = $form_state->getValues();) и пакую их, как мне нужно.
Вроде нужен этот hook: "hook_commerce_checkout_pane_info()", но это не точно..
Кто знает, как это работает в commerce, может кто сталкивался?
Комментарии
Ну также и делайте с чекаут-формами.
Можно на альтере формы просто указать дополнительную кастомную сабмит-функцию.
Альтернатива: расширить класс формы дочерним классом с одним кастомным методом сабмита. Соответственно, первым вызовом
<?php parent::submitForm( $form , $form_state ) ?>
, потом всё, что вам нужно.<?php
$url = "https://api.telegram.org/bot" . $token . "/sendMessage?chat_id=" . $chatID;
function sendMessage($chatID, $messaggio, $token) {
// echo "sending message to " . $chatID . "\n";
$url = $url . "&text=" . urlencode($messaggio);
$ch = curl_init();
$optArray = array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true
);
curl_setopt_array($ch, $optArray);
$result = curl_exec($ch);
curl_close($ch);
return $result;
} //Отправляем, например в альтере, можно намудрить и более правильно, но мне хватает
//Уведомление в телеграм
$token = "7777777:АААААААААААААААААААААААААААААА";
sendMessage(XXXXX, "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ", $token);
?>
Тут главное отписаться боту и узать $chatID
Дело в том, что по какой-то причине альтер не хочет работать на chekout.
Сам код под телеграм готов и успешно отправляется с обычной формы.
<?php/**
* Implements hook_form_alter().
*
* @param $form
* @param FormStateInterface $form_state
* @param $form_id
*/
function telegram_notice_form_alter(&$form, FormStateInterface $form_state, $form_id) {
if ($form_id == 'webform_submission_booking_node_11_add_form'
){
$form['actions']['submit']['#submit'][] = '_telegram_notice_form_submit';
}
}
/**
* @param $form
* @param FormStateInterface $form_state
*
*/
function _telegram_notice_form_submit(&$form, FormStateInterface $form_state){
# Telegram data
$telegram_token = 'bot7777777:AAGwBj12FwhshhohBzin_dpkxFZAc6QrdYSdg';
$telegram_id_chat = '-77777777';
$data = $form_state->getValues();
if(!empty($telegram_token) && !empty($telegram_id_chat)) {
# Form data
$data_result = [
'title' => '<b>Заявки</b>',
'name' => '<b>Имя: </b> ' .$data['name'],
'phone' => '<b>Телефон: </b> ' .$data['phone'],
'email' => '<b>Email:</b> ' .$data['email']
];
# Send message | "%0A"
$message = implode($data_result, '%0A');
$send_message = fopen("https://api.telegram.org/{$telegram_token}/sendMessage?chat_id={$telegram_id_chat}&parse_mode=html&text={$message}", "r");
}
}
?>
Нет таких причин.
hook_form_alter должен работать для форм чекаута
Проверяйте, что у вас не так.
Зачем вы вообще что-то альтерите? Есть же события перед и после сохранения заказа. Используйте их
Спасибо, вы это событие имеете ввиду:
https://docs.drupalcommerce.org/commerce2/developer-guide/orders/workflo...
да. Попробуйте 'commerce_order.place.pre_transition'
спасибо, буду пробовать
Сработало это событие $events[‘commerce_order.place.post_transition’] = [‘orderCompleteHandler’];
Пример есть здесь, может кому пригодится:
https://medium.com/@sumanthkumarc/writing-event-subscriber-for-order-com...