Как прикрепить к письму файл что был сгенерирован в хуке в ajaxForm/Formit?
В форме нет файла(так же нет в приципе инпута, и указания мультипарта), но в хуке перед отправкой создаётся файл, как его прикрепить к письму?
Комментарии: 9
Ссылкой или свою отправку сделать. Или посмотреть код хука Email может там есть ответ.
Прикрепляется очень просто. Ответа на поверхнисти нет особо, будет тут.
Для начала создаем сниппет в админке — это будет наш хук. Примерное содеражание его таково на примере xls:
Ну и указать MIME тип присоединяемого файла. (type)
После указываем данный хук в formIT(ajaxForm) и проверяем что все приходит.
У формы на фронте еще должно быть указано enctype=«multipart/form-data» в теге form:
Удачи.
Для начала создаем сниппет в админке — это будет наш хук. Примерное содеражание его таково на примере xls:
$myfile = array(
"name" => "Name-of-file.xls",
"type" => "application/vnd.ms-excel",
"tmp_name"=> MODX_ASSETS_PATH."path_more/Name-of-file.xls",
"error"=> 0
);
$hook->setValue('file', $myfile);
return true;
Тут вам нужно будет указать реальные имена файла в нужных местах и полный путь к файлу в tmp_name. Тут пример с папкой /assets/.Ну и указать MIME тип присоединяемого файла. (type)
После указываем данный хук в formIT(ajaxForm) и проверяем что все приходит.
У формы на фронте еще должно быть указано enctype=«multipart/form-data» в теге form:
<form method="post" action="/" enctype="multipart/form-data">
Тестируйте, проверяйте. Удачи.
Спасибо огромное, работает, я так и думал что могу поставить значение в хуке, только думал что нужно всё же создать будет тег, и не знал как прикрепить сам
Можете пожалуйста подсказать как вернуть какие-нибудь данные во фронт через ajaxForm пытался так:
Потом так 1
return $AjaxForm->success('Спасибо! Ваш отзыв отправлен', array(
'data' => array('invoice_of_payment' => $generateInvoice))
);
Потом так 1
return $AjaxForm->success('Спасибо! Ваш отзыв отправлен', array('invoice_of_payment' => $generateInvoice)
);
Потом так 2return $AjaxForm->success(array(
'status' => 1,
'message' => 'Спасибо! Ваш отзыв отправлен',
'data' => array('invoice_of_payment' => $generateInvoice))
);
Но всё равно сообщение не меняется и данные которые отправляю они не поступают на фронт, в доках не нашёл ничего. Данные хочу подставить в хуке, ведь на фронт всё равно приходит ответ, как мне подставит то что нужно мне?
Успешность отправки вообще делается не в хуке, а в настройках при вызове formIT:
{'!AjaxForm' | snippet : [
'successMessage' => 'Спасибо! Ваш отзыв отправлен.',
]}
ну и доку посмотрите: docs.modx.com/current/en/extras/formit/formit.hooks
Главная вещь что мне нужно это отправить тот самый сгенерированный файл( его ссылку), ответ мне приходит от ajaxform и в ответе есть уже готовый ключ data, но как туда отправить данные, если мой файл генерируется в хуке formit. Судя по исходному коду AJaxForm
и согласно этому методу, код ниже валиден и должен вернуть данные на фронт ajaxform в триггер af_complete
Если я в хуке верну true или просто любое другое, то ajaxform перестаёт работать, когда делаю через
Как я понял мой код будет работать без проблем если я заменю formit на свой снипет, а что если мне нужен именно всё в таком виде, как мне подбросить эти данные из хука формита в ответ ajaxform
core/components/ajaxform/model/ajaxform/ajaxform.class.php
Метод success принимает 3 параметра. и согласно этому методу, код ниже валиден и должен вернуть данные на фронт ajaxform в триггер af_complete
return $AjaxForm->success(
'Спасибо! Ваш отзыв отправлен',
array(
'invoice_of_payment' => $generateInvoice
)
);
Сообщение просто для теста стоит.Если я в хуке верну true или просто любое другое, то ajaxform перестаёт работать, когда делаю через
return $AjaxForm->success
то хотя бы всё работает, по этому я пытаюсь результат засунуть туда. Как я понял мой код будет работать без проблем если я заменю formit на свой снипет, а что если мне нужен именно всё в таком виде, как мне подбросить эти данные из хука формита в ответ ajaxform
А куда вы хотите эту ссылку отправить? На почту? Показать человеку на экран?
это $AjaxForm->success — оно работает, только если вы запускаете свой сниппет, а не formit.
Поэтому если нужно на почту ссылку отправить — просто добавьте еще поле одно с сылкой.
А если вы хотите показать, то тут сложнее.
это $AjaxForm->success — оно работает, только если вы запускаете свой сниппет, а не formit.
Поэтому если нужно на почту ссылку отправить — просто добавьте еще поле одно с сылкой.
А если вы хотите показать, то тут сложнее.
Да показать нужно на экран, я так понял такого сопряжения formit и ajaxform нет, как вариант можно запихнуть в кэш и потом в исходнике поправить и взять с кэша
Сделал так в вызов добавил 2а новых параметра:
1)cacheDataVarName (это имена переменой в кеше из которой возмётся результат)
2)formSelector (это для фронта чтобы отсортировать результат для каждой формы если нужно)
Создал снипет в котором записывается данные в кэш а так же их получения.
Способ вызова для записи:
Затём в файле core/components/ajaxform/model/ajaxform/ajaxform.class.php
Добавил в конструктор ("__construct") след вещи:
В том же файле, уже в методе "process" записал значение для 2х параметров указаных выше:
***************************************************************
Затем в методе "success" в начало тела добавил следующие
А на фронте в тригере "af_complete" делаю нужные вещи (само сабой разделяю на === true и === false)
Само собой это не лучший вариант, и не совсем продакшен, к тому же это делалось для внутренних целей, не для публики. ПОЖАЛУЙСТА кто может добавьте что лучше сделать для данной задачи, с радостью исправлю и научусь новому.
.
Само собой лучше не трогать исходники, и есть лучшие методы для моей задачи, такое как заменить снипет формит и не пришлось бы городить балаган с исходниками и кэшем, и просто там отправить письма! Позже так и сделаю
1)cacheDataVarName (это имена переменой в кеше из которой возмётся результат)
2)formSelector (это для фронта чтобы отсортировать результат для каждой формы если нужно)
Создал снипет в котором записывается данные в кэш а так же их получения.
Способ вызова для записи:
$saveInvoiceToCache = $modx->runSnippet('customCacheStorage', ['cacheVarName' => 'newInvoice', 'cacheValue' => $generateInvoice['downloadLink']]);
Сам сниппет:<?php
if ($modx->cacheManager->get($cacheVarName) && !$cacheValue) {
// Если есть кэш
$output = $modx->cacheManager->get($cacheVarName);
}else{
$output = $cacheValue;
// Запись в кэш
$modx->cacheManager->set($cacheVarName, $output, 40);
}
return $output;
*********************Затём в файле core/components/ajaxform/model/ajaxform/ajaxform.class.php
Добавил в конструктор ("__construct") след вещи:
$this->cacheDataVarName = '';
$this->formSelector = '';
В том же файле, уже в методе "process" записал значение для 2х параметров указаных выше:
$this->formSelector = $scriptProperties['formSelector'] ? $scriptProperties['formSelector'] : 'have no form';
$this->cacheDataVarName = $scriptProperties['cacheDataVarName'];
***************************************************************
Затем в методе "success" в начало тела добавил следующие
if($this->cacheDataVarName){
$getInvoiceFromCache = $this->modx->runSnippet('customCacheStorage', ['cacheVarName' => $this->cacheDataVarName]);
if(!$data){
$data = array();
}
$data['fileLink'] = $getInvoiceFromCache;
$data['responseFormSelector'] = $this->formSelector;
}
А на фронте в тригере "af_complete" делаю нужные вещи (само сабой разделяю на === true и === false)
if(response.data && response.data.responseFormSelector && response.data.responseFormSelector == 'invoiceForm'){}
и так далее.Само собой это не лучший вариант, и не совсем продакшен, к тому же это делалось для внутренних целей, не для публики. ПОЖАЛУЙСТА кто может добавьте что лучше сделать для данной задачи, с радостью исправлю и научусь новому.
.
Само собой лучше не трогать исходники, и есть лучшие методы для моей задачи, такое как заменить снипет формит и не пришлось бы городить балаган с исходниками и кэшем, и просто там отправить письма! Позже так и сделаю
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.