Как отправить файл на указанный мейл через formit?
Пользователь указывать имейл в форме и ему на эту почту приходит файл.
Как это можно сделать? В инете везде инструкции только если пользователи сами добавляют файлы.
использую связь formit + ajaxform.
Как это можно сделать? В инете везде инструкции только если пользователи сами добавляют файлы.
использую связь formit + ajaxform.
Комментарии: 21
Я на одном проекте так делал, просто хук написал который отправляет письмо и файл.
Создаете сниппет, например hookSendFile и указываете его в параметре &hooks=`hookSendFile` при вызове формы, при этом стандартный хук email не нужен
Создаете сниппет, например hookSendFile и указываете его в параметре &hooks=`hookSendFile` при вызове формы, при этом стандартный хук email не нужен
$fields = $hook->getValues(); //поля из формы
$message = $modx->getChunk('чанк_с_письмом', $fields);
$modx->getService('mail', 'mail.modPHPMailer');
$modx->mail->set(modMail::MAIL_BODY, $message);
$modx->mail->set(modMail::MAIL_FROM, $modx->getOption('emailsender'));
$modx->mail->set(modMail::MAIL_FROM_NAME, $modx->getOption('site_name'));
$modx->mail->set(modMail::MAIL_SUBJECT, 'Тема письма');
$modx->mail->address('to', $fields['email']);
$modx->mail->address('reply-to', $modx->getOption('emailsender'));
$modx->mail->attach($modx->getOption('base_path').'путь/к/файлу');
$modx->mail->setHTML(true);
if (!$modx->mail->send()) {
$modx->log(modX::LOG_LEVEL_ERROR,'An error occurred while trying to send the email: '.$modx->mail->mailer->ErrorInfo);
}
$modx->mail->reset();
return true;
Спасибо большое, но что то не выходит…
форма
В шаблоне письма просто текст, «спасибо за запрос» и все.
Ничего не присылает.
Файл лежит в корне сайта, поэтому просто указал название файла… в логах нет ошибок.
[[!AjaxForm?
&snippet=`FormIt`
&form=`tpl.AjaxForm.price`
&emailTpl=`tpl.email.price`
&hooks=`hookSendFile`
&emailSubject=`Прайс-лист`
&emailTo=`site@site.ru`
&emailFrom=`site@site.ru`
&emailFromName=`site.ru`
&validate=`email:required`
&validationErrorMessage=`В форме содержатся ошибки!`
&successMessage=`Сообщение успешно отправлено`
]]
форма
<form action="[[~[[*id]]]]" method="post" enctype="multipart/form-data">
<input type="text" name="email">
<button type="submit" name="button">Скачать</button>
</form>
В шаблоне письма просто текст, «спасибо за запрос» и все.
Ничего не присылает.
Файл лежит в корне сайта, поэтому просто указал название файла… в логах нет ошибок.
Возможно с путем к файлу что-то не так, раз само письмо приходит.
не не… письмо вообще не приходит… оно приходит если указать хук email
А в журнале ошибок Modx есть что-то?
неа… может быть сервер рубит на корню такие письма? что не хватает какого-то заголовка или еще что то?
Надо на сайте смотреть тогда, почему не работает.
Тут надо имя чанка еще указать, т.к. то, что в вызове сниппета указано не подцепляется.
Тут надо имя чанка еще указать, т.к. то, что в вызове сниппета указано не подцепляется.
$message = $modx->getChunk('чанк_с_письмом', $fields);
т.е. будет$message = $modx->getChunk('tpl.email.price', $fields);
это да, видел, указал конечно… ладно, попробую на другом сервере.
Если установлен плагин Console, то можно этот код там выполнить, только закомментировать переменную $fields и указать сообщение и почту.
Письмо должно придти, а если будет ошибка то сразу покажет.
У себя сейчас проверил все работает.
Письмо должно придти, а если будет ошибка то сразу покажет.
У себя сейчас проверил все работает.
Вроде все заработало, спасибо. Ночью все тестовые письма пришли… Странно что с такой задержкой, но пришли!
письмо приходит, но файл не прикладывается. наверное, потому что имя файла в переменной из другого сниппета не передается. как его можно передать? я просто писал имя переменной из сниппета где оно создается
$modx->mail->attach($modx->getOption('base_path').'assets/pdf/'.$file_name.'.pdf');
Можете показать как вы вызываете сниппет и как отправка происходит?
Вообще если в сниппет передан параметр file_name, то должна появиться переменная $file_name.
Можно конечно получить забрать значение из сниппета так:
Вообще если в сниппет передан параметр file_name, то должна появиться переменная $file_name.
Можно конечно получить забрать значение из сниппета так:
$file_name = $modx->getOption('file_name', $scriptProperties);
// или так
$file_name = $scriptProperties['file_name'];
[[!FormIt?
&pdfTpl=`tpl.PDF`
&hooks=`pdf, SendFilePDF, redirect`
&author=`Автор PDF`
&title=`Заголовок PDF`
&emailTpl=`sentEmailTpl`
&emailSubject=`Заявка на подключение`
&validate=`contact_name:required:minLength=^2^,
contact_email:email:required,
contact_message:required`
&store=`1`
&redirectTo=`20`
]]
сниппет pdf<?php
$pdo = $modx->getService('pdoFetch');
$pdfTpl = $modx->getOption('pdfTpl', $formit->config, '', true);
$author = $modx->getOption('author', $formit->config, 'Автор', true);
$title = $modx->getOption('title', $formit->config, 'Заголовок PDF', true);
$content = $pdo->getChunk($pdfTpl, $fields);
$config = array();
$config = array_merge($config, $fields, array(
'content' => $content,
'author' => $author,
'title' => $title,
));
// формируем ссылку на PDF
$hook->setValue('pdf_link', $modx->runSnippet('PdfCreate', $config));
return true;
и сниппет PdfCreate<?php
$date = date('Y-m-d_H-i-s', time()) . '_' .rand(1, 100);
$corePath = $modx->getOption('pdfresource.core_path', null, $modx->getOption('core_path') . 'components/pdfresource/');
$pdfresource = $modx->getService('pdfresource', 'PDFResource', $corePath . 'model/pdfresource/', array(
'core_path' => $corePath
));
$content = $modx->getOption('content', $scriptProperties, '', true);
$title = $modx->getOption('title', $scriptProperties, '', true);
$author = $modx->getOption('author', $scriptProperties, '', true);
$aliasPath = MODX_ASSETS_PATH . 'pdf/';
$site_url = $modx->getOption('site_url');
// настройки PDFResource (подробнее почитать здесь: http://jako.github.io/PDFResource/usage/)
$pdfresource->initPDF(array(
'mode' => 'utf-8',
'format' => 'A4',
'defaultFontSize' => intval(8),
'defaultFont' => '',
'mgl' => intval(10), // margin left
'mgr' => intval(10), // margin right
'mgt' => intval(7), // margin top
'mgb' => intval(7), // margin bottom
'mgh' => intval(10), // margin header
'mgf' => intval(10), // margin footer
'orientation' => 'P', // ориентация PDF
'customFonts' => '[]',
));
$pdfresource->pdf->SetTitle($title);
$pdfresource->pdf->SetAuthor($author);
$pdfresource->pdf->SetCreator($modx->getOption('site_url'));
$pdfresource->pdf->WriteHTML($content, 2);
$file_name = $date;
$pdfresource->pdf->Output($aliasPath . $file_name . '.pdf', 'F');
return $site_url . ltrim($modx->getOption('assets_url'), '/') . 'pdf/' .$file_name. '.pdf';
в который и генерит имя файла в переменной $file_name по сути равной дате, но вот как эту переменную передать в другой сниппет я не могу понять, просто указание имени не помогает
Попробуйте в форму добавить скрытое поле (возможно не обязательно)
В сниппете SendFilePDF, который отправляет письмо с файлом, будет доступно поле pdf_link
Т.е. получается, что вы в сниппете pdf генерируете файл и записываете в поле pdf_link, а в сниппете SendFilePDF уже получаете значение со ссылкой.
Либо просто объедините pdf и SendFilePDF в один сниппет.
Попробуйте еще в чанке с письмом вывести [[+pdf_link]]
<input type="hidden" name="pdf_link">
В сниппете SendFilePDF, который отправляет письмо с файлом, будет доступно поле pdf_link
$fields = $hook->getValues();
$file = $fields['pdf_link'];
Т.е. получается, что вы в сниппете pdf генерируете файл и записываете в поле pdf_link, а в сниппете SendFilePDF уже получаете значение со ссылкой.
Либо просто объедините pdf и SendFilePDF в один сниппет.
Попробуйте еще в чанке с письмом вывести [[+pdf_link]]
да, объединить сниппеты оказалось самым простым выходом из ситуации))
спасибо!
спасибо!
Андрей здравствуйте, возникла такая же проблема что не приходит файл… не поделитесь объединенным снипетом?
ох, давно это было… я может что-то еще там менял.
вот рабочий итог
вот рабочий итог
[[!FormIt?
&pdfTpl=`tpl.PDF1`
&hooks=`formit2file, SendFilePDF, redirect`
&author=`www.ru`
&title=`Заявка`
&emailTpl=`sentEmailTpl`
&validate=`contact_email:required`
&store=`1`
&redirectTo=`108`
]]
formit2file<?php
// initialize output;
$output = true;
$counter = 1;
// valid extensions
$ext_array = array('jpg', 'png', 'gif', 'JPG', 'zip', 'rar', '7z', 'rar5');
// create unique path for this form submission
$uploadpath = 'assets/pdf/';
// get full path to unique folder
$target_path = $modx->config['base_path'] . $uploadpath;
// get uploaded file names:
$submittedfiles = array_keys($_FILES);
// loop through files
foreach ($submittedfiles as $sf) {
// Get Filename and make sure its good.
$filename = basename( $_FILES[$sf]['name'] );
// Get file's extension
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$ext = mb_strtolower($ext); // case insensitive
// is the file name empty (no file uploaded)
if($filename != '') {
// is this the right type of file?
if(in_array($ext, $ext_array)) {
// clean up file name and make unique
$filename = $counter . '.' . $ext;
$filename = str_replace(' ', '_', $filename); // spaces to underscores
$filename = date("G-i-s_") . $filename; // add date & time
// full path to new file
$myTarget = $target_path . $filename;
// create directory to move file into if it doesn't exist
mkdir($target_path, 0755, true);
// is the file moved to the proper folder successfully?
if(move_uploaded_file($_FILES[$sf]['tmp_name'], $myTarget)) {
// set a new placeholder with the new full path (if you need it in subsequent hooks)
$myFile = $uploadpath . $filename;
$hook->setValue($sf,$myFile);
// set the permissions on the file
if (!chmod($myTarget, 0644)) { /*some debug function*/ }
} else {
// File not uploaded
$errorMsg = 'There was a problem uploading the file.';
$hook->addError($sf, $errorMsg);
$output = false; // generate submission error
}
} else {
// File type not allowed
$errorMsg = 'Type of file not allowed.';
$hook->addError($sf, $errorMsg);
$output = false; // generate submission error
}
// if no file, don't error, but return blank
} else {
$hook->setValue($sf, '');
}
$counter = $counter + 1;
}
return $output;
SendFilePDF<?php
$fields = $hook->getValues(); //поля из формы
$NF = $fields['filesToUpload'];//получаем имя и путь загруженного файла
$fields['filesToUpload'] = str_replace('assets/pdf/','',$fields['filesToUpload']);
$mail_z = $fields['contact_email'];
$message = $modx->getChunk('sentEmailTpl', $fields);
//формируем PDF
$pdo = $modx->getService('pdoFetch');
$pdfTpl = $modx->getOption('pdfTpl', $formit->config, '', true);
$content = $pdo->getChunk($pdfTpl, $fields);
$config = array();
$config = array_merge($config, $fields, array(
'content' => $content,
'author' => $author,
'title' => $title,
));
// формируем ссылку на PDF
$result = $modx->runSnippet('PdfCreate', $config);
$modx->getService('mail', 'mail.modPHPMailer');
$modx->mail->set(modMail::MAIL_BODY, $message);
$modx->mail->set(modMail::MAIL_FROM, $modx->getOption('emailsender'));
$modx->mail->set(modMail::MAIL_FROM_NAME, $modx->getOption('site_name'));
$modx->mail->set(modMail::MAIL_SUBJECT, 'Поступила заявка');
$modx->mail->address('to', 'xxx@gmail.com');
$modx->mail->address('to', 'xxx@mail.ru');
$modx->mail->address('to', $mail_z);
$modx->mail->address('reply-to', $modx->getOption('emailsender'));
$modx->mail->attach($modx->getOption('base_path').'assets/pdf/'.$result.'.pdf');
$modx->mail->attach($modx->getOption('base_path').$NF);
$modx->mail->setHTML(true);
if (!$modx->mail->send()) {
$modx->log(modX::LOG_LEVEL_ERROR,'An error occurred while trying to send the email: '.$modx->mail->mailer->ErrorInfo);
}
$modx->mail->reset();
return true;
PdfCreate<?php
$date = date('Y-m-d_H-i-s', time()) . '_' .rand(1, 100);
$corePath = $modx->getOption('pdfresource.core_path', null, $modx->getOption('core_path') . 'components/pdfresource/');
$pdfresource = $modx->getService('pdfresource', 'PDFResource', $corePath . 'model/pdfresource/', array(
'core_path' => $corePath
));
$content = $modx->getOption('content', $scriptProperties, '', true);
$title = $modx->getOption('title', $scriptProperties, '', true);
$author = $modx->getOption('author', $scriptProperties, '', true);
$aliasPath = MODX_ASSETS_PATH . 'pdf/';
$site_url = $modx->getOption('site_url');
// настройки PDFResource (подробнее почитать здесь: http://jako.github.io/PDFResource/usage/)
$pdfresource->initPDF(array(
'mode' => 'utf-8',
'format' => 'A4',
'defaultFontSize' => intval(13),
'defaultFont' => '',
'mgl' => intval(30), // margin left
'mgr' => intval(10), // margin right
'mgt' => intval(30), // margin top
'mgb' => intval(10), // margin bottom
'mgh' => intval(10), // margin header
'mgf' => intval(10), // margin footer
'orientation' => 'P', // ориентация PDF
'customFonts' => '[]',
));
$pdfresource->pdf->SetTitle($title);
$pdfresource->pdf->SetAuthor($author);
$pdfresource->pdf->SetCreator($modx->getOption('site_url'));
$pdfresource->pdf->WriteHTML($content, 2);
$file_name = $date;
$pdfresource->pdf->Output($aliasPath . $file_name . '.pdf', 'F');
return $file_name;
Воспользовался Вашим методом, всё работает.
Но мне нужно улучшить, что бы в письмо на емайл и сам файл пдф можно было вставить ссылку на файл для скачивания и возможность показывать ссылку после отправки формы в сообщении типо: Спасибо, вот ваш файл для скачивания.
Можете в этом помочь? Или есть кто это реализовал у себя? Подскажите как =)
Но мне нужно улучшить, что бы в письмо на емайл и сам файл пдф можно было вставить ссылку на файл для скачивания и возможность показывать ссылку после отправки формы в сообщении типо: Спасибо, вот ваш файл для скачивания.
Можете в этом помочь? Или есть кто это реализовал у себя? Подскажите как =)
Еще вопрос возник — а как с этим хуком пользователю приложить файл?
добавляю в форму
Если с тем же чанком использую стандартный сниппет FormIt email то файл нормально прикладывается.
добавляю в форму
<div>
<label for="files">Прикрепить файлы</label>
<input type="file" name="filesToUpload" id="filesToUpload" value="[[!+fi.filesToUpload]]" />
</div>
в чанке указываюПрикрепленный файл: [[+filesToUpload]]
но в письме в итоге так и приходит [[+filesToUpload]]Если с тем же чанком использую стандартный сниппет FormIt email то файл нормально прикладывается.
решил сохранять этот файл на сервер, а потом по аналогии его прикреплять к письму.
а какие ограничение по размеру отправляемого файла здесь?
upload_max_filesize:12М, но даже 8М с чем-то не пролазит, а более мелкий размер, до 1мегабайта — легко.
upload_max_filesize:12М, но даже 8М с чем-то не пролазит, а более мелкий размер, до 1мегабайта — легко.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.