Как прикрепить к письму файл что был сгенерирован в хуке в 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'){}и так далее.Само собой это не лучший вариант, и не совсем продакшен, к тому же это делалось для внутренних целей, не для публики. ПОЖАЛУЙСТА кто может добавьте что лучше сделать для данной задачи, с радостью исправлю и научусь новому.
.
Само собой лучше не трогать исходники, и есть лучшие методы для моей задачи, такое как заменить снипет формит и не пришлось бы городить балаган с исходниками и кэшем, и просто там отправить письма! Позже так и сделаю
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.