Всплывающая форма обратной связи

Содержание:
  1. Характеристики формы обратной связи
  2. Установка формы на страницу
  3. Как скачать форму обратной связи
  4. Как работает форма обратной связи
  5. Комментарии

Статья, в которой рассмотрим, как на сайт установить всплывающую форму обратной связи с капчей и возможностью прикрепления к ней файлов.

Данная форма - это проект с исходным кодом, который расположен на GitHub по адресу: https://github.com/itchief/feedback-form-in-modal.

Предыдущие исходные коды проекта, который был выполнен на Bootstrap 3, можно скачать с GitHub по этой ссылке.

Характеристики формы обратной связи

Представленная форма выполнена с использованием комопнентов Bootstrap 4 и jQuery. Серверный код фомы написан на PHP.

Другие характеристики формы:

  • открытый исходный код, проект доступен на GitHub;
  • отправка данных формы на сервер и получение ответа осуществляется без перезагрузки страницы, т.е. посредством технологии AJAX;
  • наличие графической капчи (для защиты от спама);
  • возможность прикрепления к ней файлов (по умолчанию до 5);
  • проверка данных формы (валидация) организована как на клиенте, так и на сервере;
  • отправка данных формы после успешной валидации на почту менеджера (администратора), и письма о доставке клиенту;
  • при отправке письма, файлы можно как прикрепить, так и отправить с помощью ссылок;
  • логирование отправки (данные сохраняются в файл message.txt).

Установка формы на страницу

Основные действия по подключению формы обратной связи.

1. Добавить кнопку или ссылку для вызова модального окна.

<!-- Кнопка, открывающая модальное окно -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#feedbackFormModal">
	Открыть форму в модальном окне
</button>

2. Создать модальное окно и поместить в него HTML код формы обратной связи.

<!-- Форма обратной связи в модальном окне -->
<div class="modal" id="feedbackFormModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="myModalLabel">Форма обратной связи</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">×</span>
        </button>
      </div>
      <div class="modal-body">

        <!-- Форма обратной связи -->
        <form id="feedbackForm" action="/feedback/process/process.php" enctype="multipart/form-data" novalidate>
          <div class="form-row">
            <div class="col-sm-6">
              <!-- Имя пользователя -->
              <div class="form-group">
                <label for="name" class="control-label">Имя</label>
                <input id="name" type="text" name="name" class="form-control" value="" placeholder="Имя" minlength="2" maxlength="30" required="required">
                <div class="invalid-feedback"></div>
              </div>
            </div>
            <div class="col-sm-6">
              <!-- Email пользователя -->
              <div class="form-group">
                <label for="email" class="control-label">Email-адрес</label>
                <input id="email" type="email" name="email" required="required" class="form-control" value="" placeholder="Email-адрес">
                <div class="invalid-feedback"></div>
              </div>
            </div>
          </div>
          <!-- Сообщение пользователя -->
          <div class="form-group">
            <label for="message" class="control-label">Сообщение (не менее 20 символов)</label>
            <textarea id="message" name="message" class="form-control" rows="3" placeholder="Сообщение (не менее 20 символов)" minlength="20" maxlength="500" required="required"></textarea>
            <div class="invalid-feedback"></div>
          </div>
          <!-- Изображения -->
          <div class="form-group attachments">
            <div>При необходимости прикрепите к сообщению изображения (до <span class="countFiles"></span>):
            </div>
            <div class="mb-1 text-muted">
              <small>максимальный размер одного изобржения 512 Кбайт</small>
            </div>
            <div class="alert alert-warning d-none mb1"><small class="attachments-error"></small></div>
              <div class="custom-file">
                <input type="file" name="attachment[]" class="custom-file-input" id="customFile1">
                <label class="custom-file-label" for="customFile1">Выбреите файл...</label>
                <div class="invalid-feedback"></div>
              </div>
          </div>
          <!-- Капча -->
          <div class="form-group captcha">
            <img class="img-captcha" src="/feedback/captcha/captcha.php" data-src="/feedback/captcha/captcha.php">
            <div class="btn btn-light refresh-captcha">Обновить</div>
            <div class="form-group">
              <label for="captcha" class="control-label">Код, показанный на изображении</label>
              <input type="text" name="captcha" maxlength="6" required="required" id="captcha" class="form-control captcha" placeholder="******" autocomplete="off" value="">
              <div class="invalid-feedback"></div>
            </div>
          </div>
          <!-- Пользовательское солашение -->
          <div class="form-group">
            <div class="custom-control custom-checkbox">
              <input type="checkbox" name="agree" class="custom-control-input" id="customCheck">
              <label class="custom-control-label" for="customCheck">Нажимая кнопку, я принимаю условия <a href="#">Пользовательского соглашения</a> и даю своё согласие на обработку моих персональных данных, в соответствии с Федеральным законом от 27.07.2006 года №152-ФЗ «О персональных данных».</label>
            </div>
          </div>
          <!-- Сообщение -->
          <div class="alert alert-danger form-error d-none">
            Произошли ошибки! Исправьте их и отправьте форму ещё раз.
          </div>
          <!-- Индикация загрузки данных формы на сервер -->
          <div class="progress mb-2 d-none">
            <div class="progress-bar progress-bar-success progress-bar-striped" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0">
              <span class="sr-only">0%</span>
            </div>
          </div>
          <!-- Кнопка для отправки формы -->
          <button type="submit" class="btn btn-primary float-right" disabled="disabled">Отправить сообщение</button>
        </form>
                
        <!-- Сообщение об успешной отправки формы -->
        <div class="alert alert-success form-success mb-0 d-none">Форма успешно отправлена. Нажмите на <a class="form-success-link" href="#">ссылку</a>, чтобы отправить ещё одно сообщение.</div>
      </div>
    </div>
  </div>
</div>

3. Подключить стили и скрипты используемых компонентов (jQuery, Bootstrap) и самой формы (main.css, main.js):

<!-- Подключение CSS файлов -->
<link rel="stylesheet" href="/feedback/vendors/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="/feedback/css/main.css">

<!-- Подключение JS файлов -->
<script src="/feedback/vendors/jquery/jquery-3.3.1.min.js"></script>
<script src="/feedback/vendors/bootstrap/js/bootstrap.min.js"></script>
<script src="/feedback/js/main.js"></script>

Как скачать форму обратной связи

Загрузить форму можно с GitHub. Перейти на страницу проекта можно с помощью следующей кнопки:

Форма на GitHub

Архив форм на Github:

Версия 1.0 (Bootstrap 3)
Версия 2.0 (Bootstrap 4)

Как работает форма обратной связи

Скриншоты формы обратной связи:

1. Кнопка, посредством которой вызвается модальное окно с формой:

Кнопка, открывающая модальное окно с HTML формой

2. Вид формы в модальном окне:

Вид формы обратной связи в модальном окне

3. Как происходит проверка полей формы:

Валидация формы обратной связи

4. Сообщение об успешной отправке:

Сообщение об успешной отправки формы обратной связи

Форма обартной связи в действии (видео): https://www.youtube.com/embed/PFGVFR2BvW0

Комментарии: 295

DimanTLT
DimanTLT

Доброе время суток, поставил форму которая была в комментариях , чисто просто телефон. подскажите пожалуйста, приходят 2 сообщения на почту. вместо одной заявки.. они как бы дублируются. также и записываются в файл! Спасибо, за форму и помощь! С наступающим новым годом!

Александр Мальцев
Александр Мальцев

Привет! Всё правильно. Одно письмо отправляется на почту менеджера или администратора (то есть на тот адрес, который указали в php-файле). Второе клиенту (на адрес, оставленный им в форме) о том, что его сообщение отправлено.

steff84
steff84

Здравствуйте! Подскажите, а как в этой форме реализовать, чтобы письмо с сайта приходило на 2 электронных адреса?

Александр Мальцев
Александр Мальцев

Добрый день! Найти файл process.php. В нём письма отправляются с использованием библиотеки PHPMailer.

$mail->addAddress(MAIL_ADDRESS);
// добавьте ещё один адрес
$mail->addAddress('person2@domain.example', 'Person Two');
// или как копию
$mail->AddCC('person2@domain.example', 'Person Two');
AGr0
AGr0

Ставил все 3 варианта на www.2domains.ru и на www.justhost.ru ни там ни там так и не пошло. А какая версия РНР нужна то? Скорее всего дело в ней. PHPmailer работает нормально, а этого зверя не победил, хотя внешне именно то, что мне надо. Поле с телефоном прикрутить думаю несложно.

Александр Мальцев
Александр Мальцев

Добрый день! На PHP 5.6 и 7 точно должно работать. А какие ошибки в log файле?

AGr0
AGr0

А в каком? Может лучше в вацап или телегу перейдем? Мои контакты на www.r22.ru/?n=2 а по ссылке www.r22.ru/call мне можно позвонить ;-)

AGr0
AGr0

Новый баг: теперь feedback-form-in-modal-v.2.0.1 при попытке отправки выдает "Заполните это поле." под e-mail. И какой бы адрес не писался, все равно. Причем на разных хостах.

Александр Мальцев
Александр Мальцев

Посмотрите что сервер отдаёт. А также какие ошибки имеются в консоли браузера.

AGr0
AGr0

После долгого перерыва вернулся... Ну не кажет мой браузер консоль, глянь сам http://rubtsovsk.tk/feedback/ может уже к старости тупею ;-)

А в версии 2.0 где сервер отправки настроить? Она перестала ругаться,но и отправлять ничего не хочет www.r22.ru/feedback

Кстати, в капче есть косячек: ноль не перечеркнутый и непонятка это ноль или О

AGr0
AGr0

Вах! Версия 2.0 сообщение отправителю о доставке прислала, а вот само сообщение фигвам ;-)

igor_khod
igor_khod

Здравствуйте, Александр!

Форма - СУПЕР! Огромная благодарность за ваш труд! Я даже настроил отправку анонсов в телеграм. Но возникла проблемка. Не смотря на то, что я прописал стили bootstrap раньше, чем стили самого сайта, на сайте возник конфликт между стилями bootstrap и стилями самого сайта(шрифты, поля,картинки обрезались). Посоветуйте - какой путь оптимального решения проблемы, что бы свести к минимуму затраты времени и сил?
Александр Мальцев
Александр Мальцев

Привет! Спасибо за отзыв! Не знаю, я бы просто отключил стили Bootstrap и написал их с нуля для формы, чтобы она гармонично вписывалась в стилистику сайта.

Если будет время, то сделаю чтобы эта форма шла с собственными стилями (без Bootstrap).

Сергей
Сергей
itchief.ru/assets/uploadify/8/3/2/8322bf97939f16fe332f30da71fb1de2.jpg
Здравствуйте! Александр! форма перестала работать, вот такие ошибки в консоли, есть предположение что емайл не проходит проверку.
Сергей
Сергей
убрал емайл из обязательных для заполнения не помогло, подскажите в чем косяк
Сергей
Сергей
эти ошибки остались, но я наладил форму
Александр Мальцев
Александр Мальцев
Здравствуйте! Если раньше всё работало, то сейчас при запросе ошибка 404. Посмотрите может какие-то настройки веб-сервера меняли и проверьте путь к php-файлу.
Сергей
Сергей
Спасибо за ответ! Это ошибка скорей всего с разработки сайта, в этом направлении я нечего не делал путь такой steklogra d-rostov.su/index.php
Сергей
Сергей
спасибо у меня на всех сайтах такая ошибка, наверное не значительная.
AGr0
AGr0

Вот,вот! И у меня ругается, какое бы мыло ему не писалось.

Dmitry
Dmitry
Спасибо за отличный скрипт!
Есть один вопрос, уменьшил количество загружаемых файлов до одного, не могу сделать поле для загрузки файла обязательным required=«required» — не помогает. Подскажите в какую сторону копать…
Марианна
Марианна
Здравствуйте! Подскажите пожалуйста как убрать загрузку файлов и е-мейл изменить на поле телефона с вводом маски? А еще капча какая-то странная, все время не могу правильно ее набрать, правда видела в комментариях как ее убрать а заменить на другую.
Марианна
Марианна
Как убрать телефон нашла в комментариях ниже видео youtu.be/ui5GCMa81tM, посмотрю позже, еще видела коммент инструкция про телефон тоже. Осталось понять как правильно вырезать проверку загрузки файла, может кто-то знает?
Александр Мальцев
Александр Мальцев
Здравствуйте!
Так просто закомментируйте или удалите эту разметку из html файла:
<!-- Изображения -->
<!--div class="form-group attachments" data-maxfiles="5" data-maxsize="512" data-validext="jpg, png, gif">
  <div>При необходимости прикрепите к сообщению изображения (максимум 5):</div>
  <div class="custom-file">
    <input type="file" name="attachment[]" class="custom-file-input">
    <label class="custom-file-label">Выберите файл...</label>
    <div class="invalid-feedback"></div>
  </div>
</div-->
Дмитрий Иванович
Дмитрий Иванович
Добрый день Александр!
Подскажите пожалуйста такую вещь:
На сайте много разных форм — пользователи отправляют формализированные сообщения.
Чтобы не менять каждый раз файл main.js, так-как количество форм может изменяться, я добавил к формам класс «feedbackForm» а к модальным окнам — атрибут «aria-hidden». и изменил main.js сл. образом:
$(function () {
	var form = $(".feedbackForm");
	for (let i = 0; i < form.length; i++) {

		form[i] = feedbackForm();
		form[i].init({
			id: '#'+$(form[i]).attr("id"),
			isHideForm: $(form[i]).parents(".modal").attr("aria-hidden"),
			maxFiles: $(form[i]).children(".attachments").attr("data-maxfiles"),
			maxFileSize: $(form[i]).children(".attachments").attr("data-maxsize"),
			validExtFiles: ['jpg', 'jpeg', 'gif', 'png']
		});
	}
});
Ну то есть попытался автоматизировать инициализацию форм
Формы работать отказываются (((
Что-то я сделал не так, а что не пойму? Не будет большой наглостью спросить у Вас совета?
Дмитрий Иванович
Дмитрий Иванович
Разобрался — тупанул)))
Должно быть так:
$(function () {
    let emailform = $(".feedbackForm");
    for (let i = 0; i < emailform.length; i++) {
	form1= feedbackForm();
	form1.init({
	    id: '#'+$(emailform[i]).attr("id"),
	    isHideForm: $(emailform[i]).parents(".modal").attr("aria-hidden"),
	    maxFiles: $(emailform[i]).children(".attachments").attr("data-maxfiles"),
	    maxFileSize: $(emailform[i]).children(".attachments").attr("data-maxsize"),
	    validExtFiles: ['jpg', 'jpeg', 'gif', 'png']
        });
    }
});
Ivan Petrov
Ivan Petrov
Здравствуйте, Александр. У меня возникла такая проблема. Форму нас сайт загрузил, подключил, почту настроил, отправка есть, но после успешной отправку не появляется всплывающее окно с сообщением что форма отправлена .....(пункт 4 в вашем уроке). Сбрасывает все данные .progress пробегает и все. Подскажите, пожалуйста, что делать?
Александр Мальцев
Александр Мальцев
Здравствуйте! Посмотрите какой ответ приходит от сервера (во вкладке Network)?
Ivan Petrov
Ivan Petrov
Спасибо.
Nikifor
Nikifor
Спасибо, форма обратной связи работает до 512 Кбайт! И с мобильного и с компьютера.
Сделал чтобы можно было отправлять 7 Мбайт. Получилось отправлять, но только с компьютера.
При отправке с мобильного — выдаёт ошибку «Файл не будет отправлен, т.к. его размер больше 512Кбайт».
Пожалуйста, подскажите что и где надо исправить.
Nikifor
Nikifor
Добрый день! Проблему решил методом очистки памяти на Андроиде. Суммарный объём пересылаемых файлов не должен превышать установленного лимита. Спасибо всем! Всё получилось!
Александр Мальцев
Александр Мальцев
Привет! Отлично!
Владислав Шейдоровски
Владислав Шейдоровски
Здравствуйте, Александр! У меня возникла проблема с капчей. Установил 3 версии формы обратной связи. На каждой не выводилась капча(ошибка на скриншоте). Так же попробовал форму где только номер, логин и емейл, и каждый раз выводилась ошибка об отправке данных. Не подскажите, в чем может быть проблема? И заранее, большее вам спасибо) P.S — тестил чисто ваш файл из архива. На свою верстку ничего пока не переносил.
Александр Мальцев
Александр Мальцев
Здравствуйте! А какая версия php?
Владислав Шейдоровски
Владислав Шейдоровски
Добрый вечер, Александр. Заранее поблагодарю за отличную форму, очень удобная и качественная. Версия — PHP 7.4. Установил на опенсервер, и проблему с капчей я исправил. Но почему-то при отправке — появляется та же ошибка с текстом как на скриншоте, хотя сообщение из инпутов с данными в логе сохраняется. Не знаете, что конкретно её может вызывать?
Александр Мальцев
Александр Мальцев
Привет! Скорее всего из-за неверной настройки почты. Нужно проверить этот момент.
Владислав Шейдоровски
Владислав Шейдоровски
Спасибо за совет, все заработало! Была проблема в почте. Еще раз благодарю за отличную работу)
Владислав
Владислав
Здравствуйте!

Как убрать в форме все поля, оставить только имя и номер телефона? Нашел в комментариях версию без капчи, но там бутстрап 4 версии). Я слабо шарю в коде, не получается капчу отключить

Спасибо.
Александр Мальцев
Александр Мальцев
Здравствуйте! А форма нужна на Bootstrap 3?
Владимир
Владимир
Добрый день Александр!)

Установил форму на сайт. Код немного подправил, убрал капчу, сообщение, файлы, и в целом валидацию данных. Добавил несколько полей. Все работает, но через раз. Т.е. при нажатии кнопки отправить письмо может уйти (выдаёт ошибку: Исправьте данные и отправьте форму ещё раз.), а может и не уйти. Не меняя введенных данных нажимаю несколько раз кнопку «отправить», до тех пор, пока не отправится. Я нуб в программировании, прошу помощи, подскажите, пожалуйста, в чем может быть проблема. Сайт с формой: wifi-radar96.ru
Александр Мальцев
Александр Мальцев
Привет! А как она открывается?
Егор
Егор
Привет. Загрузил форму на сайт, но сразу появляется ошибка, с чем это может быть связано?
Код подставлял копируя с сайта.
itchief.ru/assets/uploadify/8/e/b/8eb49fa0b56007cec4167c56d50ac190.png
Александр Мальцев
Александр Мальцев
Привет! Не знаю, может вы почту не настроили или не туда скопировали. Всякое может быть. Чтобы в этом разобраться необходимо открыть в браузере вкладку Network, выбрать «process.php» и посмотреть какой ответ отправляет сервер. Если есть ошибки, то будут указаны на каких они строчках. В этом случае будет понятно из-за чего.
Егор
Егор
Предыдущую ошибку исправил, но теперь не нажимается кнопка обратной связи. Если не трудно посмотри на тестовом сайте, что не так. За ранее благодарю! u79631.test-handyhost.ru/
Егор
Егор
По прямой ссылке /feedback/index.html прохожу там все работает когда ставлю галочку о согласии на обработку персональных данных, но на основной странице не работает
Александр Мальцев
Александр Мальцев
Может не все js файлы подключили.
igor
igor
Доброго Александр!
Решил обновить форму обратной связи, но столкнулся с такой проблемой — при открытии в телефоне форма не адаптивная, выглядит как на большом экране, ничего не видно приходится раздвигать…
Александр Мальцев
Александр Мальцев
Здравствуйте!
Для этого добавьте в раздел head файла «index.html» эту строчку:
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
igor
igor
спасибо!
Захар
Захар
Здравствуйте!
Не могу разобраться как на одной странице разместить 2 всплывающие формы v2.0. Одну добавил, она отправляется. Вторую добавил, process2.php создал, ссылку указал. ID поменял. Вызов выглядит так:
var form1 = feedbackForm();
        form1.init({
            id: '#feedbackForm',
            isHideForm: true
        });

        var form2 = feedbackForm();
        form2.init({
            id: '#feedbackForm2',
            isHideForm: true
        });
Но если первую форму не открывать, а во второй нажать отправить, то форма не отправляется, а в первой поля подсвечиваются как не прошедшие валидацию. Что я делаю не так? Ощущение, что при клике на кнопку второй формы вызывается первая.

UPD если в первой форме заполнить поля и закрыть ее, а во второй нажать кнопку отправить, то отправится первая форма.
Александр Мальцев
Александр Мальцев
Здравствуйте! Для второй формы в HTML укажите соответсвующий id и значение атрибута action:
<form id="feedbackForm2" action="/feedback/process/process2.php" enctype="multipart/form-data" novalidate>
Захар
Захар
Так и делал. В итоге все равно вызывается только первая форма. В результате использовал эту форму itchief.ru/php/feedback-form
С ней все получилось.
Кирилл Владимирович Ортынский
Кирилл Владимирович Ортынский
В общем разобрался во всем и со всем (по крайней мере в том что нужно), но вот беда… вставляю в html коде в форму поле телефон и вроде все норм, но происходит вот такая штука:
<img
src=«https://itchief.ru/assets/uploadify/4/b/9/4b9d9eea9c68e595c04e829c954ed4dcs.jpg» class=«fancybox thumbnail center»>
Александр Мальцев
Александр Мальцев
Может какой-нибудь элемент не закрыли, проверьте разметку через валидатор.
Кирилл Владимирович Ортынский
Кирилл Владимирович Ортынский
перепроверил несколько раз, закрыто все. по network тоже смотрел все в порядке. Добавляю любой элемент, неважно, и такое ощущение что фон разрывает, убираю — все на месте
Александр Мальцев
Александр Мальцев
Проанализируйте стили элементов с помощью инструментов разработчика и найдите из-за чего это происходит.
Кирилл Владимирович Ортынский
Кирилл Владимирович Ортынский
Доброго времени суток!
Форму интегрировал все прекрасно. Но при нажатии кнопку отправить выдает сообщение: Исправьте данные и отправьте форму ещё раз.
Все данные введены.
Подскажите, может я что то недонастроил? И подскажите, начинающему, где нужно указать почту куда должно приходить сообщение?
Спасибо большое
Кирилл Владимирович Ортынский
Кирилл Владимирович Ортынский
Нашел свои ошибки.
Только вот какой вопрос далее: если пользователь указывает не существующий e-mail, то показывается сообщение Исправьте данные и отправьте форму ещё раз. Возможно как то сделать так чтобы в этом случае было сообщение: Ваш e-mail не существует?
Заранее благодарю и огромное спасибо за ваши труды!
Сергио
Сергио
Доброго времени суток,
Александр.

Подскажите пожалуйста в чем может быть причина такой ошибки?

<br />
<b>Warning</b>:  require_once(../phpmailer/src/Exception.php): failed to open stream: Нет такого файла или каталога in <b>/home/users/e/olololo/domains/test.ru/feedback2020/process/process.php</b> on line <b>45</b><br />
<br />
<b>Fatal error</b>:  require_once(): Failed opening required '../phpmailer/src/Exception.php' (include_path='.:/usr/local/zend-5.6/share/pear') in <b>/home/users/e/olololo/domains/test.ru/feedback2020/process/process.php</b> on line <b>45</b><br />
п.с. версия php 5.6
Александр Мальцев
Александр Мальцев
Здравствуйте. Проверьте есть ли у вас phpmailer в feedback2020.
Сергио
Сергио
всё присутствует.

До этого пользовался вашими формами(скаченные года два назад) и было всё ок.

перепроверил всё 100500 раз, все пути, папки.
менял версии php. Проверял права доступа к файлам, папкам. Всё в норме.
Не пойму в чем может быть дело…
Александр Мальцев
Александр Мальцев
Тут дело не в версии php. Это связано с тем, что он не может открыть файл «Exception.php» из-за того, что не нашёл его по указанному пути «../phpmailer/src/Exception.php».
Ахмет Шабакаев
Ахмет Шабакаев
Здравствуйте.
Форму изменил (2.0.1 SMPT), протестировал — письма приходят на указанную почту.

У меня возникла проблема интеграции формы обратной связи в тело страницы. На лицо конфликт стилей и скриптов — изначально на странице использовались
css/bootstrap.min.css
js/bootstrap.min.js

при интеграции формы
feedback/vendors/bootstrap/css/bootstrap.min.css
feedback/vendors/bootstrap/js/bootstrap.min.js

При попытке скомбинировать либо не работает форма обратной связи либо происходит смещение основных форм страницы, пока самый лучший результат получился при использовании — css/bootstrap.min.css и js/bootstrap.min.js
скрипт и стиль из папки feedback отключены

Но скрытые формы вылезли,
<img
src=«https://itchief.ru/assets/uploadify/5/2/f/52f9fa2c72f03d1c536a1951a62a581ds.jpg» class=«fancybox thumbnail center»>

в затруднении, подскажите как сделать, так что бы было как форме обратной связи до интеграции?
Александр Мальцев
Александр Мальцев
Здравствуйте. В этой сборке используется Bootstrap 4, а у вас скорее всего третья версия. В этом случае вам нужно либо дописать стили, либо изменить их под третью версию. Например, эта сборка вообще отвязана от каких-либо CSS фреймворков, в ней все её стили находятся в «style.css». Поэтому посмотрите как вам лучше и доработайте визуальную составляющую формы под свой проект.
Ахмет Шабакаев
Ахмет Шабакаев
Большое спасибо, попробую сделать так как В написали.
Ахмет Шабакаев
Ахмет Шабакаев
Доброго времени суток, Александр, в указанной сборке нет обхода ограничений хостинга в плане отправки сообщений?
Александр Мальцев
Александр Мальцев
Здравствуйте! В этой сборке такого нет.
Ахмет Шабакаев
Ахмет Шабакаев
Я и смотрю, что по сравнению 2.0.1. не те настройки.
Оставил старую форму (feedback_v.2.0.1_with_phone) — бутсрап 3, она полностью меня устраивает, но я её так и не проверил на работоспособность на хосте. С Денвером не получилось, на beget просят денег.
feedback-form-in-modal-v.2.0.1 — бутсрап 4 с обходом ограничений хоста, но конфликт js и css
feedback-modal-1.1 — бутсрап 3 с независимыми css, но опять ограничение хоста.
feedback-name-email-phone-message — форма практически идеальная, но опять ограничение хоста…
Александр Мальцев
Александр Мальцев
Теперь дошло про какие ограничения хостинга вы спрашивали :)
Во всех свежих версиях различных форм обратных связей код для email отправки через SMTP имеется. Но, если в какой версии его нет, то вы можете добавить его туда самостоятельно.
Для этого необходимо в php файл вставить 2 фрагмента.
1. Добавить константы:
const
IS_SENDING_MAIL_VIA_SMTP = true, // выполнять отправку писем через SMTP
// Если IS_SENDING_MAIL_VIA_SMTP установлен равным true
MAIL_SMTP_HOST = 'ssl://smtp.yandex.ru', // SMTP-хост
MAIL_SMTP_PORT = '465', // SMTP-порт
MAIL_SMTP_USERNAME = 'alex@yandex.ru', // здесь нужно указать email пользователя с которого будет отправлять письмо (SMTP-пользователь)
MAIL_SMTP_PASSWORD = 'пароль_от_почты_alex@yandex.ru'; // здесь нужно указать пароль от почты (SMTP-пароль)
2. Вставить следующий код (после создания экземпляра класса PHPMailer и установления кодировки):
...
$mail = new PHPMailer;
$mail->CharSet = 'UTF-8';

/* добавить этот код (для отправки письма по SMTP) */
if (IS_SENDING_MAIL_VIA_SMTP === true) {
  $mail->isSMTP();
  $mail->SMTPAuth = true;
  $mail->Host = MAIL_SMTP_HOST;
  $mail->Port = MAIL_SMTP_PORT;
  $mail->Username = MAIL_SMTP_USERNAME;
  $mail->Password = MAIL_SMTP_PASSWORD;
}
...
Ахмет Шабакаев
Ахмет Шабакаев
О да!!! Спасибо огромное!!!
Ахмет Шабакаев
Ахмет Шабакаев
Доброго времени суток. Александр, бьюсь с формой обратной связи, добавил окно с телефоном (встало криво, но вроде работает), добавил на beget по инструкции, пока не особо понял, как и куда прописать все настройки отправки информации с формы обратной связи на свой ящик. У Вас нет на сайте инструкции?

P.s. У Вас от формы к форме в папке Process, то один файл process.php, то 2 (добавочный process_settings.php) и я не понял как все настроить надо для отправки.

Заранее спасибо.
Александр Мальцев
Александр Мальцев
Добрый день!
Тут нужно открыть файл «process_settings.php» и изменить значение этих параметров на свои значения:
// от какого email будет отправляться письмо
const MAIL_FROM = 'no-reply@mydomain.ru';
// от какого имени будет отправляться письмо
const MAIL_FROM_NAME = 'Имя_сайта';
// кому необходимо отправить письмо
const MAIL_ADDRESS = 'manager@mydomain.ru';
Этот вариант без SMTP, если нужно отправить письмо через этот протокол, то в этом случае нужно доработать файл «process.php».
Ахмет Шабакаев
Ахмет Шабакаев
Спасибо за ответ. Насколько я знаю, Вы не раз отмечали, что пользуетесь именно SMTP, зачем в таком случае выкладывать вариант без него? Или это был своеобразная проба пера?
Александр Мальцев
Александр Мальцев
Да, форму в дальнейшем буду улучшать.
Ахмет Шабакаев
Ахмет Шабакаев
// от какого email будет отправляться письмо
const MAIL_FROM = 'no-reply@mydomain.ru'; — это почтовый ящик настроенный на сервере, правильно? Или можно так и оставить как 'no-reply@mydomain.ru'?
Александр Мальцев
Александр Мальцев
MAIL_FROM — это константа, содержащая email адрес, с которого как бы было отправлено письмо. При этом этот ящик не обязательно должен присутствовать на сервере. Но если вы вместо «mydomain.ru» не укажите свой домен, то хостер скорее всего не будет пропускать их через свой фильтр. Т.к. в этом случае вы могли бы слать свои письма от доменов, не принадлежащих вам (например, microsoft.com и т.д.).
Ахмет Шабакаев
Ахмет Шабакаев
Я зарегистрировал домен beget (d96376ga.beget.tech) на Яндекс (подтвердил существование домена + МХ запись),
<img
src=«https://itchief.ru/assets/uploadify/1/7/8/178bdfc4c3f3c27b752c10e54109e0d4s.jpg» class=«fancybox thumbnail center»>


создал ящик test@d96376ga.beget.tech,
<img
src=«https://itchief.ru/assets/uploadify/6/a/9/6a9d38a598820c68303a404f59d983acs.jpg» class=«fancybox thumbnail center»>


добавил его в файл «process_settings.php» в строку const MAIL_FROM = 'no-reply@mydomain.ru';
<img
src=«https://itchief.ru/assets/uploadify/7/5/a/75a0972afbfe626e54a3dbb70a85b136s.jpg» class=«fancybox thumbnail center»>


НО не работает=(
<img
src=«https://itchief.ru/assets/uploadify/3/9/1/391218fb9a321b57d6584b4684eb09bbs.jpg» class=«fancybox thumbnail center»>
Александр Мальцев
Александр Мальцев
В MAIL_FROM_NAME в этом случае тоже необходимо указать домен.
Ахмет Шабакаев
Ахмет Шабакаев
Сделано
<img
src=«https://itchief.ru/assets/uploadify/d/1/e/d1e78342f488b7bfc6bcbfcb3cb48b78s.jpg» class=«fancybox thumbnail center»>


Опять же ничего не проходит, но и явных ошибок нет.
<img
src=«https://itchief.ru/assets/uploadify/d/1/e/d1e78342f488b7bfc6bcbfcb3cb48b78s.jpg» class=«fancybox thumbnail center»>


На beget тех.под ответил:
«С нашей стороны нету ограничений на изменение MX записей для технического домена.
Хочу заметить, что это домен предназначен для тестирования работы сайта на нем, а не размещения доменной почты.
Функция php mail на бесплатном хостинге отключена. Форма обратной связи в этом случае работать не будет.»

Что посоветуете в таком случае делать? Купить домен или есть еще какие-то бесплатные ресурсы?
Ахмет Шабакаев
Ахмет Шабакаев
Еще добавили «вы можете переписать скрипт отправки, и отправлять письма через сторонние SMTP сервера, например: Yandex, Gmail, Mail.ru»
Александр Мальцев
Александр Мальцев
Так, да, если функция mail отключена, то так отправить не получится.

Обновил форму на Github. Теперь есть возможность отправки формы на email через SMTP. Архив этой формы имеет версию 2.0.1.

Теперь можете взять эту форму и настроить её отправку через сторонний SMTP сервер. Для простоты теперь все php настройки находятся в одном файле «process.php».
Ахмет Шабакаев
Ахмет Шабакаев
Александр, здравствуйте, напомните, пожалуйста, для того, что бы изменить форму 2.0.1 (добавить поле — Телефон, убрать отправку Сообщения и прикрепления файлов) необходимо внести изменения в HTML (index.html) — добавить\убрать соответствующие формы, php (process.php) — добавить\убрать поля и их проверку?
Александр Мальцев
Александр Мальцев
Здравствуйте. Да, изменения необходимо внести в 2 этих файла, а ещё в JavaScript в которой вы выполняете ициализацию формы и в шаблон письма «email.tpl».
Ахмет Шабакаев
Ахмет Шабакаев
Спасибо за ответы. Все очень круто.

В форме загрузки файла — «Выбрейте» написано вместо Выберите
<img
src=«https://itchief.ru/assets/uploadify/b/d/2/bd2208e5b23772519addcb297a372422s.jpg» class=«fancybox thumbnail center»>


В голом виде протестировал изменив только настройки в форме process.php
Письма приходят. Буду теперь кумекать как в форме сделать как нужно мне.
Ахмет Шабакаев
Ахмет Шабакаев
Здравствуйте.
Форму изменил, протестировал — письма приходят на указанную почту.

У меня возникла проблема интеграции формы обратной связи в тело страницы. На лицо конфликт стилей и скриптов — изначально на странице использовались
css/bootstrap.min.css
js/bootstrap.min.js

при интеграции формы
feedback/vendors/bootstrap/css/bootstrap.min.css
feedback/vendors/bootstrap/js/bootstrap.min.js

При попытке скомбинировать либо не работает форма обратной связи либо происходит смещение основных форм страницы, пока самый лучший результат получился при использовании — css/bootstrap.min.css и js/bootstrap.min.js
скрипт и стиль из папки feedback отключены

Но скрытые формы вылезли,
<img
src=«https://itchief.ru/assets/uploadify/2/0/1/20198b3598df5e0ead298bc63756b0cas.jpg» class=«fancybox thumbnail center»>


я в затруднении.
Александр Мальцев
Александр Мальцев
Спасибо, в исходниках на Github поправил опечатку.
Bexultan
Bexultan
Добрый день Александр, спасибо за форму, отличный дизайн, запустил на своем сервере вашу форму, и нажимаю на сабмит, ничего не происходит, просто жму несколько раз на кнопку, все равно не реагирует, и не показывает картинку капчи, можете помочь с этим вопросом?
Nik
Nik
Возможно вы не подключили скрипты
Dmitry
Dmitry
Здравствуйте, Александр.
Поставил форму обратной связи с помощью fancybox, в документации нашел код, который выводит html. Скрипт bootstrap 4 модального окна хочу отключить. Все хорошо, все работает вот только не выводится placeholder, конечно не критично, но)
Подскажите пожалуйста, может можно как-нибудь это исправить.
Александр Мальцев
Александр Мальцев
Привет. Желательно ссылку на форму в какой-нибудь песочнице или архив. Так пока не знаю, что посоветовать.
Dmitry
Dmitry
_http://my-7.ru/nabory-instrumentov-iz-187-klyuchej.html
Александр Мальцев
Александр Мальцев
Добавьте в CSS:
input::placeholder,
textarea::placeholder {
  color: #bdbdbd !important; 
}
Dmitry
Dmitry
Большое Вам спасибо! Заработало)
Wird
Wird
Здравствуйте! Спасибо, отличный скрипт!
Постоянно обновляется и что-то меняется… я даже не успеваю в изменения вникать… раньше было всплывающее окно об удачной отправке! Если бы это было опцией — было бы идеально, как раньше, в старых версиях… например открыть модальное с информацией об успешной отправке…
Александр Мальцев
Александр Мальцев
Здравствуйте! Это форма и так в модальном окне. Как-то при открытом одном модальном окне отображать ещё одно для отображения сообщения, что-то не очень…
Если нужно могу просто добавить в JavaScript генерацию некоторого кастомного события для страницы. В этом случае каждый разработчик, в зависимости от того как ему нужно, сможет очень просто добавить нужную логику.
Wird
Wird
В модальном? У меня просто текстом, и сама форма не в модальном...
              <!-- Сообщение об успешной отправки формы -->
              <div class="form-result-success d-none text-center justify-content-center align-items-center">
                <div class="alert alert-success rounded-0" style="z-index: 1001;">Форма успешно отправлена. Нажмите на<a class="alert-link" href="#" data-reloadform="#feedback-form">ссылку</a>, чтобы отправить ещё одно сообщение.</div>
              </div>
Это я самую последнюю версию скачал.
Буду благодарен если добавите возможность ставить любое событие по успешной отправке…
Александр Мальцев
Александр Мальцев
Обновил форму на Github.
Теперь чтобы отключить стандартное сообщение об успешной отправке достаточно в форму добавить параметр isShowSuccessMessage и установить ему значение false.
var form1 = new ProcessForm({
  isShowSuccessMessage: false
});
form1.init();
Событие которое будет генерироваться после успешной отправке называется pf_success.
Пример обработки события pf_success:
$(document).on('pf_success', function (e, data) {
  if (data.data.id === 'feedback-form') {
    // открываем модальное окно с нужным сообщением
    $('#pf_success').modal('show');
  }
});

// сбрасываем состояние формы после закрытия модального окна
$('#pf_success').on('hidden.bs.modal', function () {
  form1.reset();
});
Готовый пример, в котором сообщение об успешной отправки выводится в модальном окне можно посмотреть здесь.
Wird
Wird
Спасибо вам за оперативность! И отдельное спасибо за форму!
nataliya
nataliya
Добрый день! Подскажите, пожалуйста, почему так получается…
Форма работает, отправляет и т.д. Но на странице она не активна и еще и меню видно, через форму.
Проблема наверно на странице?(

Помогите пожалуйста…
Александр Мальцев
Александр Мальцев
Добрый! Вам необходимо правильно настроить CSS-свойство z-index для этих элементов.
Rufina
Rufina
Добрый день. После отправки формы выводится сообщение, о том, что все ок, закрываешь форму, нажимаешь на кнопку вызова модального окна, для повторной отправки сообщения, а там всё то же сообщение об успешной отправке письма. Подскажите пожалуйста, как реализовать повторную отправку сообщения без перезагрузки страницы и без перехода по ссылке, которая есть в сообщении об успешной отправке письма.
Александр Мальцев
Александр Мальцев
Добрый! Для изменения формы под свои нужды желательно иметь минимальные знания и умения по JavaScript, jQuery и PHP. Без них тяжеловато будет это выполнять.
Например, это реализовать можно так:
1. Добавить в конец тела функции _setupListener (process-form.js) код:
$(_defaults.id).on('clearSuccessMessage', function () {
  _showForm(_$form);
});
2. В «main.js» добавить следующий код:
$('#feedbackFormModal').on('hidden.bs.modal', function () {
    $('#feedbackForm').trigger('clearSuccessMessage');
});
Данный код будет после скрытия модального окна Bootstrap вызывать пользовательское событие «clearSuccessMessage» для элемента с id, равным «feedbackForm».
Обработчик данного события (1) будет скрывать сообщение, и отображать форму.
Теперь после закрытия модального окна (после успешной отправки) и его открытия будет отображаться не сообщение, а «чистая» форма, с помощью которой можно будет отправить ещё одно сообщение.
Rufina
Rufina
возможно я конечно не туда куда нужно вставляю код в main.js, но не работает
Александр Мальцев
Александр Мальцев
Вот ссылка.
Rufina
Rufina
точно, не туда вставила, спасибо большое!
ilya
ilya
Здравствуйте, подскажите как подключить файл английской локализации при проверке введённых данных?
Форму переписал на английский, а сообщения ошибок заполнения выводятся по-русски.
Александр Мальцев
Александр Мальцев
Здравствуйте!
На клиенте, в соответствии с языком браузера. Если язык браузера английский, то и сообщения будут на английском.

На сервере (в php) язык браузера можно определить так:
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
Далее в зависимости от языка можете настроить так, чтобы сообщения выводились в зависимости от значения этой переменной.
if ($lang == 'ru') {
  // сообщение на русском языке
} else {
  // сообщение на английском языке
}
ilya
ilya
Ну к примеру в самом файле process.php есть же варианты ответа, не по умолчанию, а которые прописываешь сам, почему эти варианты не выходят?
Тоже из-за языка браузера?
Александр Мальцев
Александр Мальцев
Просто проверка до process.php по умолчанию не доходит, т.к. валидация формы сначала выполняется в браузере.
Валидация в process.php нужна для того, что проверка в браузере не является надёжной.
Например, пользователь может открыть инструменты разработчика в браузере и удалить атрибут required. В этом случае браузер пропустит проверку этого поля формы, а сервер нет. В этот раз сообщение будет отображено пользователю именно то, которое ему придёт с сервера.
peps
peps
Где-то встречал что есть возможность не насиловать «нормальных» пользователей капчей, что можно чтобы форма была без капчи, необходимо вставить hidden-поле и при автозаполнении спам-комментарий не отправлялся если заполнены все поля (робот же заполнит их все, даже hidden). как-то можно эту форму так модифицировать? подскажите пожалуйста как такую валидацию сделать.

Александр Мальцев
Александр Мальцев
Ну эта самая простая защита.
Её можно сделать так. Удалить из HTML (index.html) и proces.php куски кода, отвечающие за работу капчи.
Добавить в форму скрытое поле, например, так:
<input type="hidden" name="captcha">
В PHP добавить простенькую проверку:
// если значение не пустое, то значит это спам
if (!empty($_POST['captcha'])) {
    $data['result'] = 'error';
}
Архив формы с защитой от спама с помощью скрытого поля можно загрузить отсюда.
Constantin
Constantin
Александр, здравствуйте. Такой вопрос — не работает форма на nginx. Можно ли ее как-нибудь переделать?
Александр Мальцев
Александр Мальцев
Здравствуйте! Проверьте, какая установлена у вас версия php. Должна быть не ниже 5.6. Что у вас конкретно не работает? Какие ошибки?
Constantin
Constantin
И снова здравствуйте! php версия 7.2 А ошибка — пост запрос не обрабатывается. Можно ли вместо php сделать на perl или python?
Александр Мальцев
Александр Мальцев
Надо смотреть ошибки, без этого никак. Может у вас какое-то расширение для php не подключено. Нет, материалов по Perl и Python не планируется.
Алексей
Алексей
Доброго дня!
При скачивании формы на bootstrap 3 по ссылке с яндекс диска получаю форму на bootstrap 4. Перезалейте пожалуйста.
Александр Мальцев
Александр Мальцев
Доброго! Поправил ссылку.
Вячеслав
Вячеслав
Добрый день! Не пойму, поставил форму, на одном сайте работает, на другом нет. При отправке выдает: Исправьте данные и отправьте форму ещё раз. В чем может быть проблема? С хостингом проблем нет, отправляет и принимает…

<img
src=«https://itchief.ru/assets/uploadify/0/9/2/092b506bba3912d20676c75ee008c715s.jpg» class=«fancybox thumbnail center»>
Александр Мальцев
Александр Мальцев
Добрый! Может версия php ниже 5.6?
Чтобы определить какая именно ошибка приходит, необходимо открыть вкладку Network в браузере и посмотреть ответ сервера в ней.
Вячеслав
Вячеслав
Возможно, проверил стояла 5.6, поменял на 7.1, обновил почтовые службы, заработало! =) Спасибо за ответ
Кирилл Владимирович Ортынский
Кирилл Владимирович Ортынский
Версия 7.2, проблема та же
Александр
Александр
Добрый день.
Возникла проблема, по причине нельзя использовать собственный каталог для загрузки.
Подскажите как подправить код для использования временного каталога на сервере.
Как понимаю нужно подправлять processor.php
Вместо move_uploaded_file использовать is_uploaded_file
Но, что то не выходит.
Александр Мальцев
Александр Мальцев
Добрый день!
Для этого необходимо удалить блок для перемещения в папку Uploads.
А там где прикрепляем файлы использовать следующий код:
foreach ($_FILES['attachment']['name'] as $key => $attachment) {
  // временное имя файла на сервере
  $fileTmp = $_FILES['attachment']['tmp_name'][$key];
    $mail->addAttachment($fileTmp);
  }
}
В этом случае файлы в письме будут иметь временные имена, с которыми принятые файлы были сохранены на сервере.
Алексей
Алексей
Александр, спасибо за формы! Подскажи пожалуйста что и куда нужно прописать, чтобы после отправления формы и сообщении об успешной отправке перекидывало на страницу «спасибо».
Александр Мальцев
Александр Мальцев
Алексей, пожалуйста!
Вам необходимо открыть файл process-forms.js и изменить код в условии на следующий:
...
var _success = function (data) {
  // если сервер вернул ответ success, то значит данные отправлены
  if (data.result === "success") {
    /* начало изменения */
    location.href = 'URL_страницы_спасибо';
    return;
    /* конец изменения */
  }
  ...
Алексей
Алексей
Александр, спасибо огромное, все получилось!
alex
alex
verify.php — Где же найти этот файл? уже голова кругом…
Александр Мальцев
Александр Мальцев
В обновлённой версии формы это файла нет. Похожий функционал в этой реализации выполняет файл process.php.
alex
alex
Спасибо! Подскажите пожалуйста как поправить проверку телефона вида — +375 хх ххх хх хх?
Александр Мальцев
Александр Мальцев
Если вы используете jQuery Mask Plugin, то так:
$('[name="phone"]').mask("+375 00 000 00 00", {
  placeholder: "+375 __ ___ __ __"
});
Лариса
Лариса
Подскажите как убрать у кнопки disabled.
Я сделала форму без галочки подтверждения.
И в случае, когда вводится некорректный email, выводится сообщение «Исправьте данные и отправьте форму ещё раз.» и кнопка отправки формы неактивна.
У вас она становится активной, если проставить галочку, но у меня ее нет в итоге чел. введя неправильный email оказывается в тупике. Где эта хрень, которая делает кнопку неактивной в данном случае, мне нужно ее убрать, но я ее в упор не вижу! Помогите!
Александр Мальцев
Александр Мальцев
Поправил этот момент в файле process-forms.js. Проект на гитхабе обновлен.
Лариса
Лариса
Спасибо! Теперь с этим все ОК.
igor
igor
Помогите! Не могу понять почему выдает ошибку при отправке сообщения.
… Произошли ошибки! Исправьте их и отправьте форму ещё раз…
пробовал комментировать
...
// отправляем письмо
/*if (!$mail->send()) {
    $data['result'] = 'error';
}*/
...
//$mail->send();
...
не помогло!
спасибо!
Александр Мальцев
Александр Мальцев
Посмотрите в этом комментарии. Там приведена инструкция как посмотреть ответ сервера.
igor
igor
500 (Internal Server Error)
в Response пусто
Александр Мальцев
Александр Мальцев
Могу посоветовать проверить пути к файлам и права на файлы и папки. Проверить из-за прав это или нет можно очень просто, а именно установить файлам и папкам права, равные 777. Если это из-за прав, то разбираться уже с ними.
igor
igor
изменил на 777, ничего не изменилось!
попробовал старую версию с вашего сайта (без модального окна и без добавления изображений) все работает!
Александр Мальцев
Александр Мальцев
Не знаю, без логов сложно подсказать.
Hukuma
Hukuma
Александр здравствуйте. Большое спасибо за то что делаете!

К сожалению не нашел готового варианта под себя, поэтому спрошу.
Нужно размещение двух форм на сайте (bootstrap 4):
1. Одна для отправки заявки на услугу, где только два обязательных поля (Имя и E-mail) и необязательное (телефон). Без капчи, прикрепления файлов, соглашений об обязательствах и т.д.
2. И вторая, для отправки текстового сообщения (консультации) где нужно будет указать только E-mail.

Первую форму я переделал из варианта «Форма обратной связи с использованием ajax, php и bootstrap», все работает, но куча лишнего кода удручает)
А с размещением второй формы проблема, т.к. даже смена всех ID и дублирование js и php файлов не помогает.

Может подскажите вариант из Вашего каталога форм на Ядиске, с которого будет проще всего слепить по моим потребностям?
Заранее Спасибо.

Александр Мальцев
Александр Мальцев
Здравствуйте, спасибо за отзыв!
Возьмите за основу эту форму. В ней нет привязки к id. К тому же она выполнена на Bootstrap 4. На гитхабе она расположена здесь. Один js можно использовать для обработки нескольких форм, то же касается и php. Но всё конечно зависит от навыков и уровнем владения этими языками.
Так как формы универсальные, т.е. с возможностью включения и отключения дополнительных действий, то в них содержится код на эти случаи. Минимальный или оптимальный код можно написать только под конкретную задачу.
Виталий
Виталий
Александр, добрый день!
Подскажите, как менять заголовок по средствам кода, если модальное окно не одно?
Спасибо.
Александр Мальцев
Александр Мальцев
Добрый!
Например, можно сделать так.
1. Добавить к кнопкам, с помощью которых пользователь будет открывать модальные окна, атрибут data-title. Содержимое атрибута — это название модального окна.
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#feedbackFormModal" data-title="Название заголовка">
  Открыть форму
</button>
2. Добавить на страницу скрипт:
$('[data-toggle="modal"]').click(function (e) {
  e.preventDefault();
  var idSelector = $(this).attr('data-target');
  var title = $(this).attr('data-title');
  $(idSelector).find('.modal-title').text(title);
});
Виталий
Виталий
2-й вариант не пробовал, первый не работает(((
пользуюсь вашей сборкой, очень удобно, но Title не выходит.

Ниже код, указываю ModalForm.changeTitle($(this).attr('data-title')); для применения атрибута. Может что некорректно?
var ModalForm = new ModalApp.ModalProcess({ id: 'modal-form' }); //Форма в modal
    ModalForm.init();
    $('.modal-form').click(function(){
        var _this = this;
        $.get('/modules_my/feedback/modalForm.php', {content:$(this).attr('data-form')},function(data){
          if (data) {
            ModalForm.changeTitle($(this).attr('data-title'));
            ModalForm.changeBody(data);
            switch ($(_this).attr('data-form')) {
              case 'Form_1':
                var form_1 = new ProcessForm({ idForm: 'Form_1', hideForm: true });
                form_1.init();
                break;
              case 'Form_2':
                var form_2 = new ProcessForm({ idForm: 'Form_2', hideForm: true }); 
                form_2.init();
                break;
            }
            ModalForm.showModal();      
          }
        });
        return false;
    });

Вызов одного из…
<a href="#" class="btn_green button button-borderless modal-form" data-title="Basic Linux Access Control" data-form="Form_2"><i class="i-comment-z"></i></a>
Александр Мальцев
Александр Мальцев
У вас контекст неправильный, нужно вместо this использовать _this:
ModalForm.changeTitle($(_this).attr('data-title'));
Виталий
Виталий
СПАСИБО!
исправил ошибку, работает!
Виталий
Виталий
Александр, в продолжении темы вопроса, подскажите.
Как можно скрыть футер выборочно для окон.
Александр Мальцев
Александр Мальцев
Обновил скриптик. Добавил методы hideFooter и showFooter.
Например:
var myModal1 = new ModalApp.ModalProcess({ id: 'myModal1' });
myModal1.init();
myModal1.changeBody('Содержимое модальное окна 1...');
myModal1.hideFooter(); // скрываем футер
Виталий
Виталий
Спасибо!)
Алексей
Алексей
Александр, подскажите, как данные из атрибута data-title=«Название заголовка» передать на почту (используя «Форма обратной связи для сайта с отправкой на почту») Что нужно дополнить в main.js, process.php....?
Анатолий
Анатолий
День добрый Александр.
Ваш сайт очень полезен начинающим и практикующим фрилансерам.
Спасибо за ваши уроки.
Вопрос по этой форме.
Разместил на сайте,
Работает письма отправляются, файлы посылаются, подтверждение отправителю посылается.
не получается только индикация успешной отправки формы.
Может подскажете как сделать например Модальное окно с сообщением «Ваше сообщение успешно отправлено получателю».
Александр Мальцев
Александр Мальцев
Добрый! Оно и так по умолчанию отображает сообщение об успешной отправке.
Анатолий
Анатолий
В том то и проблема,
что по окончании работы формы зеленая панелька
«Форма успешно отправлена. Нажмите на ссылку чтобы отправить ещё
одно сообщение.»
Не появляется.
Не хватает какой-то строчки сценария.
Возможно нужен еще какой-то файлик сценария?
Все работает за исключением
зеленой панельки
«Форма успешно отправлена. Нажмите на ссылку чтобы отправить ещё
одно сообщение.»
Александр, Куда копать, подскажите???

Дарья
Дарья
Добрый день! У меня та же проблема. Форма отлично работает, но не появляется сообщение успешной отправки. Если найдёте решение напишите пожалуйста.
Александр Мальцев
Александр Мальцев
Откройте в браузере консоль разработчика, перейдите на вкладку Network. После этого отправьте форму и посмотрите какой приходит ответ от process.php.
Предоставьте ответ, тогда будет понятно в чём ошибка и что необходимо подправить.
response feedback form
Александр Мальцев
Александр Мальцев
Добрый день! Воспользуйтесь вышеприведённым комментарием и посмотрите какой у вас приходит ответ.
Анатолий
Анатолий
Александр, спасибо большое, Заработало.
Спасибо за Ваши уроки.
Nurbolat Bekturov
Nurbolat Bekturov
Добрый день Александр Спасибо вам за форму но я ее чуточку отредактировал, хотел бы попросить проверить все ли у меня работоспособно? доступ к ФТП выдам, можете дать свой skype или вк или любые другие соцсети, заранее благодарю, сюда не могу отправить файлы по техпричинам(
Александр Мальцев
Александр Мальцев
Добрый день! Спасибо! Работоспособность формы можете и сами проверить.
Nurbolat Bekturov
Nurbolat Bekturov
В том то и дело что у меня не-получается не могу понять в чем дело ошибка возникает вот

Александр Мальцев
Александр Мальцев
Закомментируйте в файле process.php строчки:
...
// отправляем письмо
/*if (!$mail->send()) {
    $data['result'] = 'error';
}*/
...
//$mail->send();
...
Проверьте, работает ли форма. Если да, то значит, ошибка происходит при отправке.
Первый шаг — это узнать, поддерживает ли хостинг или ваш тарифный план вообще отправку писем.
Второй шаг — почитать про требования хостинга для отправки писем. Может вы просто попадаете под фильтр хостера. Например, отправляете письма от адреса no-reply@google.com, а домен вашего сайта не google.com.
Nurbolat Bekturov
Nurbolat Bekturov
Здравствуйте форму починил но теперь возникла другая ошибка на почту приходит ошибка об SPF каком то ниже скрин
Nurbolat Bekturov
Nurbolat Bekturov
Извините это была проблема со стороны хоста они все починили, я хотел спросить другое я вот добавил несколько пунктов ниже скрин, и вот когда форму отправляют приходит только примечание и имя отправителся остальные данные которые он заполнил не приходят, может мне где то надо указать чтобы это тоже отправлялось на почту мне?
Александр Мальцев
Александр Мальцев
Вам необходимо ещё добавить код в process.php и email.tpl.
Как это сделать, можно посмотреть в этой инструкции.
Павел В
Павел В
Александр спасибо за форму!

У меня вопрос-просьба. Пытаюсь подправить форму (bootstrap 4). Мне нужна форма только с одним полем «Телефон» с маской и кнопка «Отправить». А также при входе чтобы через 15 сек. появлялась данная форма и при уходе с сайта также чтобы она появлялась!

уход с сайта имеется ввиду когда пользователь курсор выводит на верхнюю часть браузера!

Подскажите, пожалуйста куском кода либо архивом на я.диск!

Большое спасибо!
Александр Мальцев
Александр Мальцев
Пример: yadi.sk/d/sL9-xvmP3T5d7n
Код для отображения формы при уходе с сайта не стал включать в пример, т.к. считаю, что так не корректно поступать с пользователем. Если он вам нужен, то можете создать его самостоятельно.
Павел В
Павел В
Огромное спасибо!
Nurbolat Bekturov
Nurbolat Bekturov
Добрый день Александр Спасибо вам за форму но я ее чуточку отредактировал, хотел бы попросить проверить все ли у меня работоспособно? доступ к ФТП выдам, можете дать свой skype или вк или любые другие соцсети, заранее благодарю, сюда не могу отправить файлы по техпричинам(
kiwi
kiwi
Добрый день!
Спасибо за полезную статью!
Сейчас пытаюсь прикрутить такую форму.
Объясните, пожалуйста, для чего в коде этой формы нужна папка phpmailer?
На других сайтах есть примеры других форм с обработчиком рнр, который состоит всего из нескольких строчек.
Чем плох такой простой вариант рнр отправки форм?

Сейчас у jquery версия 3.3.1. Если я поставлю ссылку на эту новую версию, то будет ли работать форма?
Спасибо!
Александр Мальцев
Александр Мальцев
Добрый день!
PHPMailer — это библиотека, для отправки почты. Почитать про неё можете на гитхабе. Если это реализовывать с помощью php-функции mail(), то это потребует написание большого кода, и повторения части функционала PHPMailer.
Для работы формы можете использовать версию jQuery 3.3.1.
kiwi
kiwi
Александр, спасибо!
Дмитрий
Дмитрий
Приветствую, Александр!
Огромное спасибо за форму. Благодаря Вам, я реализовал свою задачу. Но все же нуждаюсь в помощи, так как являюсь начинающим и 3 дня терпения над вопросом иссякли, а попытки тщетны...) Вашу форму прикрутил к своей кнопке на сайте, отправка данных происходит, получение тоже. Мне же необходимо добавить два поля к уже существующим инпутам формы: Телефон и Просто текстовое поле, в котором будет в ручную прописываться выбранная товарная позиция. В html я реализовал эти поля, но вот на серверной стороне увы( Не могу понять в каких файлах и в каком месте добавлять новые переменные… Благодарю Вас за помощь заранее. Использую форму Bootstrap 4
Дмитрий
Дмитрий
Вот какие поля собственно были добавлены в форму + изменен формат текстового поля с
<textarea>
на обычный
<input>
и уменьшено минимально допустимое количество символов до 10-ти (это я экспериментировал)

<img
src=«https://itchief.ru/assets/uploadify/9/8/6/986112a56fa69ec06c5ab5e3c8b24ec6s.jpg» class=«fancybox thumbnail center»>
Александр Мальцев
Александр Мальцев
Выложу на днях видео инструкцию, в которой покажу, как добавлять поля к форме, а также удалять ненужные.
Дмитрий
Дмитрий
Премного благодарен Вам, Саш!
Александр Мальцев
Александр Мальцев
Видео (как в форму обратной связи добавить телефон): youtu.be/ui5GCMa81tM
Павел В
Павел В
Александр спасибо за форму!
У меня вопрос-просьба. Пытаюсь подправить форму (bootstrap 4). Мне нужна форма только с одним полем «Телефон» с маской и кнопка «Отправить». А также при входе чтобы через 15 сек. появлялась данная форма и при уходе с сайта также чтобы она появлялась!

Подскажите, пожалуйста куском кода либо архивом на я.диск!

Большое спасибо!
Александр Мальцев
Александр Мальцев
А как можно узнать когда посетитель уйдёт с сайта? Можно конечно использоваться событие onbeforeunload и показать посетителю при закрытии вкладки предупреждающее сообщение «Хотите заполнить форму?». Но такое многие браузеры не приветствуют и данное сообщение просто не будет показано пользователю.
Павел В
Павел В
уход с сайта имеется ввиду когда пользователь курсор выводит на верхнюю часть браузера!
Павел В
Павел В
Александр, вы подскажете-поможете?? неделю жду…
Constantin
Constantin
Александр, здравствуйте! А как бы переделать, дабы корректно отображалось и работало на Bootstrap 4?
Александр Мальцев
Александр Мальцев
Здравствуйте! Проект обновлен. Теперь он использует Bootstrap 4.
Алексей
Алексей
Здравствуйте, спасибо за форму, но у меня проблемы с ней, при нажатии на кнопку появляется форма и остается сообщение: Внимание! Ваше сообщение отправлено. При нажатии обновить капчу ничего не происходит


У меня есть кнопка на сайте, как мне в эту кнопку правильно вставить код с index.html?
Александр Мальцев
Александр Мальцев
Здравствуйте! Сообщение по умолчанию необходимо скрыть. Для этого к нему необходимо добавить стиль:
style="display: none;"
Проверьте повешен ли на кнопку, с помощью которой вы обновляете капчу обработчик. А в обработчике правильно ли указан путь к php файлу.

В кнопку нельзя вставить форму, с помощью неё её можно только открыть. Для этого необходимо из index.html скопировать форму на нужную страницу, а также не забыть к ней подключить стили и скрипты (как в index.html).
18qaz
18qaz
Добрый день. Использовал одну из ваших форм в модальном окне, все работает отлично.

Вопрос следующий: как использовать 2 одинаковые формы на одной и той же странице — одну в модальном окне, другую просто всегда открытую на странице? Пытаюсь использовать ту же форму, но убираю теги для открытия кнопки и модального окна — форма висит на странице но не отображается капча и кнопка обновить тоже не работает. Ради интереса задал еще один id в script.js где указывается «reload-captcha»
$('#reload-capt').click(function () {
    $('#img-captcha').attr('src', '/feedback/cap.php?id=' + Math.random() + '');
  });
<code>
Поменял так же в хтмл:
<div class="well well-sm"> <div id="reload-capt" class="btn btn-large btn-block btn-warning"><i class="glyphicon glyphicon-refresh"></i> Обновить код</div></div> 
Думал этим исправить появление капчи хотя бы при нажатии на «Обновить», но ничего не получается.
Александр Мальцев
Александр Мальцев
Добрый день! Обновил проект, теперь можно использовать несколько капч на странице.
Ссылка на пример, в котором используется 2 формы и у каждой есть капча: yadi.sk/d/povyeXHh3MbGQL
Stan
Stan
Добрый день! Вставил код обратной связи в основной index.html и перенес папку feedback в корень. При нажатии на кнопку всплывает форма, но в ней написано что сообщение отправлено. Как совместить css формы с css основного кода?
Александр Мальцев
Александр Мальцев
Добрый день! Вынес файл index.html из папки feedback — всё нормально отрабатывает: yadi.sk/d/eWVKdTln3MPBbt
Если у вас название каких-то классов совпадает, то можно изменить их имена на другие. После этого поправить стили и при необходимости JavaScript код.
Dimarik
Dimarik
Здравтвуйте, я — нуб. Как сделать так, чтобы в этой форме были только фио, мыло и телефон + сообщение, без каких-либо файлов и капчи. Буду искренне благодарен за помощь.
Александр Мальцев
Александр Мальцев
Здравствуйте. Держите: yadi.sk/d/wYLoDNmG3MPWQP
Вадим
Вадим
И так спасибо за наводку на новую версию, типы файлов норм добавляются, а вот размер установил больше, а он его не принимает.
Александр Мальцев
Александр Мальцев
Максимальный размер файла настраивается в двух местах:
1. В process_settings.php:
const MAX_FILE_SIZE = 524288;
2. В main.js при создании объекта:
var formFeedback = new ProcessForm({idForm: 'feedbackForm', maxSizeFile: 524288});
Кроме этого ограничения могут быть выставлены также в .htaccess:
php_value upload_max_filesize 10M
php_value post_max_size 10M
Вадим
Вадим
А как правильно добавить типы файлов, не дадите ссылочку?
«jpeg» => «image/jpeg», а как ZIP добавить, или еще что то?
Александр Мальцев
Александр Мальцев
Введите в поиске Yandex или Google: mime type.
Кроме этого есть новая версия этой формы. Расположена она на Github по этому адресу. Настройка её осуществляется в файлах process_settings.php и main.js.
Вадим
Вадим
Я пытаюсь добавить ZIP, как не хитрю, на почту не приходит архив, и на сервер не зхагружается
а изображения норм
Cyberjo
Cyberjo
Чот как то даже и не знаю, неожиданно и не приятненько я бы сказал. Проверка показывает, что в архиве вирус virustotal.com.
Александр Мальцев
Александр Мальцев
Во-первых, PHP WEB-Shell — это не вирус. Это инструмент для запуска скриптов. Во-вторых, он может стать вредоносным только тогда, когда он загружен не вами. В-третьих, это ложное срабатывания антивируса Bkav на exec последовательности, которые он считает, что они есть в библиотеке PHPMailer (https://github.com/PHPMailer/PHPMailer). Но на самом деле их нет. Если есть желание, то можете сообщить о данной проблеме разработчикам этого антивируса.
Cyberjo
Cyberjo
Понятненько, ну значит ложное срабатывание…
Пытаюсь научиться, но не совсем понимаю шаги действий, поэтому прошу подскажите пожалуйста Александр, если я работаю на локальном сервере какие данные я должен ввести в этих местах?
$mail->From = 'email@mysite.ru'; // email адрес отправителя ???  вводится в модальной форме, пользователем, что тут писать email?
$mail->FromName = 'Имя сайта'; // имя отправителя ???  вводится в модальной форме, пользователем, что тут писать name?
$mail->Subject = 'Сообщение с формы обратной связи'; // тема письма??? вводится в модальной форме, пользователем, что тут писать message?
$mail->AddAddress('myemail@mail.ru'); // email адрес получателя ??? тут ввести адрес куда будут приходить письма?
Александр Мальцев
Александр Мальцев
Но это очень простые вещи. Чтобы было более понятно, представлю их на картинке.
Назначение параметров PHPMailer
Например, принцип использования формы для создания обратного звонка на сайте:
1. На клиенте (пользователь): Вводит в поля формы своё имя и номер телефона. Нажимает на кнопку «Отправить».
2. На сервере (php скрипт): Получает отправленные пользователем данные, и формирует письмо менеджеру. Но для отправки письма необходимо указать от какого имени ($mail->FromName) и от какого email ($mail-From). Если это система автоматической рассылки, то обычно используют email (no-reply@имя_домена). Это означает, что не надо отвечать на данное письмо, т.к. оно было отправлено автоматически. Тема письма в данном случае является названием формы, чтобы например, менеджер, при получении письма сразу знал его назначение. $mail->AddAddress определяет email адреса менеджера, кому предназначено это письмо. В этом случае все эти данные задаются в файле php, пользователь никакого в них участия не принимает. Его (пользователя) данные добавляются только в тело письма.
3. Менеджер: Получает письмо. Просматривает содержимое письма и звонит клиенту.
Cyberjo
Cyberjo
Спасибо за попытку :)
И вы уж простите меня но я крайне далек от этой тематики и мои попытки понять, приводят к голосовому протяжному — эм-м… Как то всё сложно и я ещё больше запутался. В общем мне нужна форма обратной связи, которую я смогу прикрутить к модальному окну, где пользователь ввел некоторые данные и нажал отправить. Есть ли на вашем ресурсе такая форма где мне стоит только изменить адрес почты что бы письмо от пользователя пришло к администратору?
Cyberjo
Cyberjo
Эта запись подсвечивается как неверная в phpstorm
Cyberjo
Cyberjo
от какого email ($mail-From)

Я не понимаю этой записи хоть убейте.
    $mail->From      = 'email@mysite.ru'; // я же не могу сам себе написать в магазин.ru
    $mail->FromName  = 'Магазин'; // сообщение пришедшее с магазина
    $mail->Subject   = 'Тема сообщения';
    $mail->Body      = $output;
    $mail->AddAddress( 'магазин.ru' );
Короче грусть, пичаль, не осилил я этот feedback, ни мадалку ни обычную форму не заработали, никак.
Взял с другого сайта.

з.ы.
Походу в форму вносились правки и не проверили, она не рабочая.
Александр Мальцев
Александр Мальцев
Жаль, конечно, что у вас не получилось её настроить…
Можно отправлять, например, от no-reply@имя_домена, т.к. делают практически все. В этом случае вы будете знать, что письмо отправлено автоматом, а не вручную. Если письмо нужно отправить себе, то можно указать, например, в качестве адреса ($mail->AddAddress) admin@имя_домена или другой какой вы используете.
Николай777
Николай777
Вопрос по форме обратной связи feedback-modal-without-captcha-1.1

форма была залита на сервер, сам индексный файл работает замечательно из под папки feedback

переношу кнопку с формой, вставляю в тело страницы — форма отправляться не хочет.

В чем может быть причина?

скрипты все подключены
Виталий
Виталий
Александр, добрый день!
Использую форму в качестве сбора контактов. Есть потребность в трех всплывающих формах, однако происходит конфликт в JS и перестают работать все формы (пока две), id форм и наполнения разные, скрипт дублирован и изменен соответственно под каждую форму.
Как можно решить данную задачу?
Виталий
Виталий
29 августа 2016, 12:28 уже поднимался вопрос, проработаю! спасибо)
Виталий
Виталий
Александр, все же нужна помощь…
Не получается с data-argument.
Объединил два modal-окна в одно, отсекая ненужные input классом hidden. В этом случаи форма признается не валидной.
Как же реализовать 2 формы, где первая собирает имя-майл, вторая имя-телефон, с запуском modal разными кнопками...?
Constantin
Constantin
Александр, здравствуйте. Присоединяюсь к вопросу…
Александр Мальцев
Александр Мальцев
Пример, в котором можно посмотреть, как с помощью одного всплывающего окна можно обрабатывать несколько HTML-форм.

Для открытия всплывающего окна используются кнопки, отличающиеся только атрибутом data-form. С помощью этого атрибута указываем, какую HTML форму необходимо отобразить в модальном окне. Для того чтобы кнопка открывала модальное окно используется класс modal-form. Все HTML-формы хранятся во внешнем php файле forms.php. Это позволит не только уменьшить размер HTML документа (подгрузка формы в модальное окно будет осуществляться только по требованию), но и использовать их на разных страницах.
Александр Мальцев
Александр Мальцев
Здравствуйте, как это сделать можете посмотреть в этом комментарии.
Виталий
Виталий
Спасибо!
Constantin
Constantin
Александр, здравствуйте! Помощи хочется. С формой всё хорошо, с главной страницы заполняется и отправляется нормально. А вот что нужно сделать, чтобы эта же форма заполнялась и отправлялась с другой страницы?
Александр Мальцев
Александр Мальцев
Здравствуйте! Добавить её на неё. Неизменным останется только обработчик формы (php-файл). Если её необходимо сделать для многих страниц, то можно форму сохранить во внешнем файле и подгружать её из него.
Constantin
Constantin
Александр, здравствуйте! Извините чайника, никак не могу найти место для «2. Добавить в объект FormData (в файле js):». :(
Александр Мальцев
Александр Мальцев
На 113 строчке создаётся экзмепляр объекта FormData. После этой строчки можете добавлять свои значения в этот объект.
Constantin
Constantin
Всё равно не получается )))) Теперь присылает вот что:
Дата: 19-04-2017 15:52
Имя пользователя: lastname
Адрес email: +7 904 382-83-08

Вместо е-мэйла телефон, а емэйла нету, как и строчки...:

// дальнейшие действия (ошибок не обнаружено)
if ($data['result']=='success') {
//место для установки 3 блока, который предназначен для сохранения формы в файл
$output = "---------------------------------". "\n";
$output .= date(«d-m-Y H:i:s»). "\n";
$output .= «Имя пользователя: ». $name. "\n";
$output .= «Адрес email: ». $email. "\n";
if (isset($phone)) {
$output .= «Телефон: ». $phone;
if (isset($_POST['phone'])) {
$output .= 'Телефон пользователя: '. $_POST['phone'];

Ну что не так? )))
Александр Мальцев
Александр Мальцев
Значит, что-то у вас не правильно. Перед тем как переходить к серверу, проверьте какие данные у вас уходят на сервер.
Это делается в панели разработчика на вкладке Network:
Информация, отправляемая формой обратной связи на сервер
Constantin
Constantin
Ошибок нет. Говорит, что успешно отправлено. Но, в файле message.txt ничего нет, и на почту ничего не приходит. Утомился я… Александр, может сделаете эту же форму, только из трех полей — имя, емэйл и телефон (телефон не обязателен к заполнению) — хоть потренеруюсь в разборке как следует…
Александр Мальцев
Александр Мальцев
Вот ссылка на архив. Тренируйся.
Constantin
Constantin
О, благодарю!!! Тренируюсь, и даже получилось :) Александр, а можно ещё ткнуть куда-нибудь, где можно понять, как сделать следующее: в одном файле, например, myform.html — есть форма. Как её вызвать из другого файла, например, index.html, что-бы она вызвалась, отработала, показала успех/не успех и вернулась на index.html?
Александр Мальцев
Александр Мальцев
Если идёт речь о встраивании одной страницы в другую, то это можно осуществить с помощью HTML элемента iframe:
<iframe src="myform.html" width="100%" height="500">
</iframe>
Constantin
Constantin
Чудесно! Александр, спасибо! А вот ещё вопрос от глупого чайника — а как сделать так, чтобы передавать скрытый текст в обработчик process.php? Например, заполнили форму, и нужно примечание скрытое — «Запись». Или «Книга». Или ещё что-нибудь?
Александр Мальцев
Александр Мальцев
Добавить в форму скрытое поле:
<input type="hidden" id="subject" name="subject" value="Книга">
Все остальные действия с ним осуществляются также как с обычным полем.
Сергей
Сергей
Здравствуйте, как к этой форме (в модальном окне) добавить отправку нового поля «Телефон»?
Александр Мальцев
Александр Мальцев
Для этого необходимо:
1. Добавить поле в HTML форму:
<div class="form-group">
  <input type="phone" id="phone" name="phone" required="required" class="form-control" placeholder="Ваш Телефон*">
</div>
2. Добавить в объект FormData (в файле js):
// добавить в formData значение 'email'=значение_поля_email
formData.append('phone', phone);
3. На сервере (в PHP) получить значение телефона:
//получить phone, который ввёл пользователь
if (!empty($_POST['phone'])) {
  $phone = $_POST['phone'];
} else {
  $data['result']='error';
}
4. Вставить значения поля в необходимое место (например, в тело письма):
$output .= "Телефон: " . $phone;
Сергей
Сергей
Заработало, спасибо!
Добавил ещё строку
// получаем телефон, который ввёл пользователь
var phone = $("#phone").val();, без неё выдавалась ошибка.
Сергей
Сергей
Другая ошибка вылезла, убрал required=«required» у поля с телефоном, теперь если не вводить телефон то «Произошли ошибки при отправке формы на сервер.»
Александр Мальцев
Александр Мальцев
Если поле не обязательное, то необходимо везде использовать isset:
//получить phone если есть
if (isset($_POST['phone'])) {
  $phone = $_POST['phone'];
}
Даже там, где вы обращаетесь к этой переменной, т.к. её может не быть:
if (isset($phone)) {
  $output .= "Телефон: " . $phone;
}
Игорь
Игорь
Подскажите, пожалуйста, а как сделать закрытие модального окна автоматически после отправки формы?
Александр Мальцев
Александр Мальцев
В файле script.js добавить строчку для скрытия модального окна:
if ($data.result == "success") {
  // скрываем форму обратной связи
  // $('#messageForm').hide();
  // удаляем у элемента, имеющего id=msgSubmit, класс hidden
  // $('#msgSubmit').removeClass('hidden');
  $('#feedbackForm').modal('hide');
}
Остальные строчки в этом блоке можете закомментировать или удалить.
Виталий
Виталий
Александр, день добрый!
Подскажите, как модернизировать скрипт формы так, чтобы вместо file был text, также с появлением дополнительных полей при заполнении предыдущего.
Спасибо.
Александр Мальцев
Александр Мальцев
Здравствуйте, Виталий!
Для этого в HTML данный блок необходимо заменить, например, на такой:
<!-- INPUTS -->
<div class="form-group">
  <p style="font-weight: 700;">INPUTS (максимум <span id="countInputs"></span>):</p>
  <input type="text" name="inputs[]">
</div>
В JavaScript:
// максимальное количество inputs 
var countInputs = 5;
// выводим максимальное количество элементов
$('#countInputs').text(countInputs);
// после ввода значения в input добавляем новый
$(document).on('change','input[name="inputs[]"]',function(e){
  // если выбран файл, то добавить ещё элемент "Выбрать файл"
  if ((e.target.value.length>0)&&($(this).next('input[name="inputs[]"]').length==0) && ($('input[name="inputs[]"]').length<countInputs)) {
    $(this).after('<input type="text" name="inputs[]">');
  }
});
Для добавления данных из inputs в FormData для отправки на сервер:
// добавить в FormData INPUTS
var inputs = document.getElementsByName("inputs[]");
for (var i = 0; i < inputs.length; i++) {
  formData.append('inputs[]', inputs[i].value);
}
На сервере (например, добавить их в тело письма):
if(isset($_POST["inputs"])) {
  $inputs = $_POST["inputs"];
  // переберём все inputs
  foreach ($inputs as $input) {
    $output .= "Значение INPUT: " . "\n" . $input . "\n";
  }
}
Форма с inputs: yadi.sk/d/viDBsBI23FVAUK
Виталий
Виталий
Спасибо!
Роман
Роман
Александр, помогите пожалуйста, как и где убрать ограничение от 20 до 500 символов, и как убрать капчу?
Александр Мальцев
Александр Мальцев
Настройка полей осуществляется с помощью атрибутов, в данном случае посредством minlength и maxlength.
Если проверка не нужна, то просто удалите эти поля:
<textarea id="message" class="form-control" rows="3" placeholder="Введите сообщение..." required="required"></textarea>
Новая версия формы обратной связи в модальном окне:
с капчей — yadi.sk/d/sX7jAgud3FSwbC
без капчи — yadi.sk/d/97LItyt23FT29e
Sergey
Sergey
Александр, здравствуйте!
Подскажите каким образом сделать следующее. На сайте вверху и внизу обычные формы с телефоном и именем и по сайту разбросаны кнопки с вызовом модальных окон также с формой имя и телефон. Как правильно подключить эту форму и форму из предыдущего урока вверх и вниз? Пробовал с ID формами играться, но что-то не совсем получается.
Подскажите как сделать.
Александр Мальцев
Александр Мальцев
Здравствуйте, кроме как изменить id форм, необходимо ещё изменить процесс получения данных для отправки каждой формы в script.js на следующий:
// messageForm - id формы
data: new FormData(document.getElementById('messageForm')),
Елена
Елена
Добрый день.
Никак не могу победить Вашу форму. У меня элементарно не подключаются ни стили, ни скрипты.

Использую Ваш index.html Он лежит в корне. Там же в корне папка feedback.
Пробую просто запускать, а также через локальный сервер. Ничего.

В чем может быть дело? Спасибо!

Елена
Елена
Если убрать слэши, скажем, вместо "/feedback/script.js" сделать «feedback/script.js», то скрипты и стили подключаются. Но интересно, почему все не работает «из коробки»?

строчка «Header set Access-Control-Allow-Origin „*“» в файле .htaccess не помогает.
<img
src=«https://itchief.ru/assets/uploadify/a/7/a/a7a0d4e25550e3b444cc6ce27ee8267es.jpg» class=«fancybox thumbnail center»>


<img
src=«https://itchief.ru/assets/uploadify/c/7/c/c7c942a262c7e1e0bdeb71f8a84f74ecs.jpg» class=«fancybox thumbnail center»>
Елена
Елена
1. Скачала архив «feedback-form-in-modal». Распаковала.
2. Папку «feedback-form-in-modal» переименовала в «feedback» и поместила ее в корень сайта.
3. Переместила из нее index.html также в корневую папку сайта.

Что не так? Ведь никаких Ваших настроек не поменяла. Ни строчки кода, ничего.
В полном замешательстве. Чувствую себя дурой))
Александр Мальцев
Александр Мальцев
Не знаю, что вы сделали не так. Действия, которые необходимо выполнить вы изложили правильно. Если делаете не на локальном сервере, то пришлите коды доступа. Посмотрю, в чём может быть проблема…
Юрий
Юрий
Александр здравствуйте. Не могу понять в чем причина, в комментариях своей проблемы не нашел, форма работает но только с текстовой информацией при попытке приложить файл, выдает: ошибка при загрузке файла. Думал проблема с хостингом, но простая форма html+скрипт+php файлы отправляет, в чем может быть причина, где искать?

Александр Мальцев
Александр Мальцев
Здравствуйте! Значит необходимо искать ошибку… Попробуйте для начала проверить, создан ли каталог, в который загружаются файлы. А также есть ли права на запись в эту папку.
Anna
Anna
Александр, добрый день!
У меня вот какой вопрос. На сайте для заказа тура используется простая форма с 2-мя полями — email и имя. Она одна и та же и открывается при нажатии на соответствующие ссылки, размещенные на одной странице. Допустим, ТУРЦИЯ, ИТАЛИЯ и т.д. Могу я как-то передать параметр с названием страны, не делая его select-ом в форме? И не создавая 50 отдельных форм для каждой страны? Этот параметр с названием страны должен отправляться на почту администратору.
Спасибо!
Александр Мальцев
Александр Мальцев
Здравствуйте.
Необходимо в JavaScript определить текст ссылки и добавить его в качестве данных для отправки на сервер:
//после загрузки веб-страницы
$(function () {
  // переменная, которая будет содержать название страны
  var country;
  // при открытии модального окна с формой получаем текст ссылки (страну)
  $('#feedbackForm').on('show.bs.modal', function (e) {
    country = e.relatedTarget.innerText;
  });
  ...
  // добавляем эту информацию в объект FormData (для отправки на сервер)
  formData.append('country', country);	
После этого в php (на сервере) получаем название страны:
$_POST['country']
Виктор
Виктор
Ура, всё заработало! Спасибо Вам Александр за терпение!
Виктор
Виктор
Добрый день Александр!

Спасибо за форму без капчи. Но беда просто. Всё делаю как надо, но видно, что-то делаю не так.
1 — Скачал и переименовал папку 'feedback-form-in-modal-without-captcha' в 'feedback'. Залил в корневую папку сайта.
2 — В файле 'verify.php' в нужном месте прописал свой ящик.
3 — Из файла index.html которая в папке 'feedback', скопировал нужную часть кода с строчки 35 по 83 и вставил в корневом файле сайта index.html в нужном месте (я не делаю форму выпадающей).

После чего обновляю страницу сайта и пытаюсь отправить сообщение. При нажатии на отправить, происходит просто перебрасывания на вверх сайта. Надписи о том, что сообщение отправлено нет, и нет письма на почте.
Александр Мальцев
Александр Мальцев
Кроме самой формы необходимо на страницу ещё доавить содержимое файла script.js:
<script src="/feedback/script.js"></script>
Это необходимо выполнить ниже подключения библиотеки jQuery.
Виктор
Виктор
Решил пока поставить форму с капчей и капча не отображается, хотя всё сделал как надо. Перекинул всю папку в корень сайта и переименовал её в feedback, создал форму в нужном месте и вот в консоле выдаёт ошибку, что нет файла captcha.php
itchief.ru/assets/uploadify/1/e/c/1ec860d37e55a7f4e5d11d98884f4795.jpg
itchief.ru/assets/uploadify/2/e/b/2ebb020a799ce800c1a58e82bea12b79s.jpg
Александр Мальцев
Александр Мальцев
Её необходимо разместить на локальном сервере или хостинге.
Виктор
Виктор
Александр может это важно, но хочу сразу сказать, что сайт собирается на Bootstrap последней версии. Поэтому, не будет ли конфликта, если в папке feedback будут тоже файлы от Bootstrap?
Александр Мальцев
Александр Мальцев
Можете подключить файлы Bootstrap своего проекта или эти изменить на последнюю версию.
Виктор
Виктор
Александр буду очень благодарным, если сможете предоставить сборку без капчи.

С уважением Виктор.
Александр Мальцев
Александр Мальцев
Сборка контактной формы без капчи: yadi.sk/d/4tlCgbhyzfSL7
Виктор
Виктор
Александр большое Спасибо за ответ!

Есть ещё пару вопрос ((
1 — Нужно всю папку feedback-form-in-modal закидывать на хостинг или только можно verify.php и файл капчи?
2 — Мне не нужна капча, если я просто удалю, будет ли работать форма?

Сейчас пытаюсь отправить сообщение, на почту нечего не приходит и просто перебрасывает на верх страницы.
Александр Мальцев
Александр Мальцев
Конечно всю папку. По умолчанию данный каталог необходимо переименовать в feedback, т.е. feedback-form-in-modal -> feedback. Расположить данный каталог необходимо в корне сайта. Файл index.html можно перенести в любое необходимое место. Это можно сделать благодаря тому, что в нём все необходимые пути заданы абсолютно (т.е. /feedback/...). После того как вы всё это правильно расположите должно всё заработать.

Если же вы не хотите копировать всю папку, то форму feedback необходимо будет тогда дополнительно настраивать. Например, определять свои стили, js-скрипты, php библиотеки (phpMailer) и др.

Если капча не нужна, то необходимо кроме удаления файлов captcha.php, oswald.ttf и background.png удалить ещё соответствующие строки в файлах script.js и verify.php. Если вам нужна такая сборка (без капчи), то могу её дополнительно предоставить.
Виктор
Виктор
Спасибо за форму.
У меня вопрос, Куда вписывать свой email куда должны приходить письма.
Александр Мальцев
Александр Мальцев
Для этого необходимо открыть файл verify.php и указать в AddAddress необходимый email:
$mail->AddAddress('myemail@mail.ru');
Аноним
Аноним
Здравствуйте. Я новичок в этом деле. Пытаюсь вставить кнопку для вызова модальной формы на свою страничку. Ничего не получается. Как это сделать?
Александр Мальцев
Александр Мальцев
Необходимо просто скачать необходимые файлы (bootstrap) и подключить их к странице.
Если не знаете как это делать, то почитайте следующие статьи:
Установка платформы Twitter Bootstrap
Как создавать модальные окна
Аноним
Аноним
Александр, приветствую.
Можете пояснить, как работает валидация.
Я имею ввиду, следующее, какие-то поля формы обязательны для заполнения а какие-то нет.
Обязательным полям мы прописываем html атрибут required, а вот дальше… что происходит в js и в php с проверкой полей?
То-есть, если допустим поле не обязательное, то как-бы и ни к чему его проверять.
Правильно-ли я понимаю, что если мы, например поле message в HTML прописали без required, то в php вместо
if (isset($_POST['message'])) {
      $message = $_POST['message'];
      if (!validStringLength($message,20,500)) {
        $data['message']='Поле сообщение содержит недопустимое количество символов.';
        $data['result']='error';
      }
    } else {
      $data['result']='error';
    }

Мы можем просто указать
$message = $_POST['message'];

и на этом все, или надо еще где-то с чем-то поколдовать?
Александр Мальцев
Александр Мальцев
Здравствуйте.
На стороне клиента (браузера) валидацию выполняет сам браузер. Для этого мы используем функцию checkValidity с помощью которой в JavaScript проверяем значение каждого поля формы. Если какое-то из них не прошло проверку, то форму на сервер не отправляем. Для отображения ошибок добавляем классы. Проверку JavaScript выполняет на основании атрибутов required, minlength и др. Т.е. задаём проверку и убираем на стороне клиента с помощью атрибутов HTML элементов. Т.е. проверку не выполняем с помощью специальных плагинов, её осуществляет сам браузер. Но, т.к. проверку на стороне клиента при желании можно обойти, нужна ещё проверка на стороне сервера.
На стороне сервера проверка осуществляется так.
Но сначала желательно сначала узнать, есть если в массиве $_POST ключ message (чтобы не произошла ошибка):
if (isset($_POST['message'])) {
  $message = $_POST['message'];
}
Но и дальше по коду (если есть переменная):
if (isset($message)) {
  // что-то делаем с переменной $meassage
}
Аноним
Аноним
Благодарю.
Аноним
Аноним
Доброй ночи Александр!
Проблема разрешилась!
Тех поддержка REGа:
«Отключили директиву Options Indexes FollowSymLinks в конфигурационном файле .htaccess»
Всё работает, с файлами и без.
Осталось поправить кодировку.
Огромное спасибо.Ссылка на поддержку сайта есть)
Александр Мальцев
Александр Мальцев
Отлично!
Аноним
Аноним
Тариф поддерживает php 5.1-5.6.
Александр, Ваша форма удобная в редактировании.
Убрал капчу, увеличил объём разрешаемых к отправке файлов.
Планировал добавить ввод номера тлф.
Хотел адаптировать форму к отображению на мобильных устройствах.
Попробую ещё поковыряться.
Буду писать в тех поддержку.
В любом случае спасибо за проделанную работу.
Аноним
Аноним
Александр Мальцев
Александр Мальцев
А Ваш тариф на reg.ru поддерживает php. Если нет, то форма работать не будет. Единственное решение (если форма обратной связи нужна) – это переход на более дорогой тариф с поддержкой php.
Аноним
Аноним
Вкладка Network:
itchief.ru/assets/uploadify/d/6/0/d605d3cd992252b69eeca9273065e392.jpg

Это сам хостинг не даёт я понял?
Аноним
Аноним
Спасибо за ответ.
Сайт статичный из 1 страницы, простой html.
. htaccess присутствует:
Options Indexes FollowSymLinks
DirectoryIndex index.html
AddCharset utf-8 .php .html .js

Права такие папки 755, файл 644.
Скрипты другие работают.
Запись с лога:
[03/Sep/2016:00:44:02 +0300] "POST /feedback/verify.php HTTP/1.0" 403 2892 "http://мойсайт.ru/" "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
Я ещё в большем замешательстве,
всё больше превосхожу сам себя, зная свои познания в этом деле.
Знакомый подсказал вставить обратную форму))
Аноним
Аноним
Доброй ночи Александр.
Форму с трудом вписал(не очень опытен). Визуально всё работает и устраивает.
После заливки на сервер, при обработке введённых данных и отправке
получаем ответом с сервера код html прям в форму:
itchief.ru/assets/uploadify/8/8/f/88fe5b7b9a925768c4f713af00daa84e.jpg
т.е.
itchief.ru/assets/uploadify/1/9/f/19f679297031a70be9980fb59bb9641f.jpg

я в сильном замешательстве)
Александр Мальцев
Александр Мальцев
Ошибка 403 может происходить при отсутствии необходимого файла или директории, а также при наличии недостаточных прав. Более детально посмотреть какой приходит ответ (ошибка) от сервера можно в панели разработчика браузера на вкладке Network.
Аноним
Аноним
Благодарю. Форма формируется, но с небольшим нюансом.
Если пощелкал сначала по кнопкам с 1 по 4, то при щелчке по 5 кнопке (свободный выбор) селект на форме блокированный, не дает выбирать ничего, а отображает последнее значение data-argument по которому кликали.
Александр Мальцев
Александр Мальцев
В файле script.js измените код
$('#feedbackForm').on('show.bs.modal', function (e) {
  if ($(e.relatedTarget).attr('data-argument')) {
    $('#product').val($(e.relatedTarget).attr('data-argument'));
    $('#product').prop('disabled',true);
  }   
});
на
$('#feedbackForm').on('show.bs.modal', function (e) {
  if ($(e.relatedTarget).attr('data-argument')) {
    $('#product').val($(e.relatedTarget).attr('data-argument'));
    $('#product').prop('disabled',true);
  } else {
    $('#product').prop('disabled',false);  
    $('#product').prop('selectedIndex',-1);
  }
});
Аноним
Аноним
Отлично. Благодарю.
Аноним
Аноним
Приветствую, снова вынужден обращаться.
Этот вариант отлично работает в автономном режиме.
Пытаюсь прикрутить его к сайту на joomla.
почему-то функция
$('#feedbackForm').on('show.bs.modal', function (e) {
  if ($(e.relatedTarget).attr('data-argument')) {
    $('#product').val($(e.relatedTarget).attr('data-argument'));
    $('#product').prop('disabled',true);
  } else {
    $('#product').prop('disabled',false);  
    $('#product').prop('selectedIndex',-1);
  }
});
не отрабатывает, отображает полный список, всегда при нажатии на любую кнопку.
посмотрел, в «автономном режиме» и на «joomla сайте», подключены одинаковые версии jQuery и BS.
В чем может быть проблема?
Александр Мальцев
Александр Мальцев
Попробуйте поместить этот код в блок:
jQuery(function($) {

});
Аноним
Аноним
Отлично.
Благодарю.
Аноним
Аноним
Александр, приветствую, еще раз.
Появился такой вопрос.
Допустим на странице есть 5 «разных кнопок», вызывающих форму, например:
1. Телевизор
2. Пылесос
3. Утюг
4. Чайник
5. Выбрать
Чего-бы хотелось:
1. При кликах по кнопкам с 1-4, появляется форма в которой не надо выбирать чего запрашивать и форма отправляет информацию о том, что запросили например чайник.
2. При клике по 5й кнопке, появляется форма с селектом, где можно выбрать один или несколько из первых 4х вариантов.

Возможно-ли это реализовать в рамках одного модального окна и как это сделать?
Александр Мальцев
Александр Мальцев
Привет. Конечно можно. Создавать кучу модальных окон — это вообще не правильный подход.

Добавляем в файл index.html необходимые кнопки (например, с data атрибутом data-argument):
<!-- Кнопки, для открытия модального окна -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#feedbackForm" data-argument="Телевизор">
  Телевизор
</button>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#feedbackForm" data-argument="Пылесос">
  Пылесос
</button>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#feedbackForm" data-argument="Утюг">
  Утюг
</button>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#feedbackForm" data-argument="Чайник">
  Чайник
</button>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#feedbackForm">
  Выбрать
</button>
Добавить в форму соответствующее поле:
<div class="col-sm-6">
  <!-- Продукт -->
  <div class="form-group has-feedback">
    <label for="product" class="control-label">Товар:</label>
    <select id="product" name="product" class="form-control">
    </select>
    <span class="glyphicon form-control-feedback"></span>
  </div>
</div>
В файл script.js после строчек
//после загрузки веб-страницы
$(function () {
следующий код:
$('button[data-target="#feedbackForm"]').each(function(){
  if ($(this).attr('data-argument')) {
    $('#product').append('<option>'+$(this).attr('data-argument')+'</option>');
  }
});

$('#feedbackForm').on('show.bs.modal', function (e) {
  if ($(e.relatedTarget).attr('data-argument')) {
    $('#product').val($(e.relatedTarget).attr('data-argument'));
    $('#product').prop('disabled',true);
  }   
});
Первая часть кода после загрузки страницы наполняет select необходимыми option.
Вторая часть будет при открытии модального окна определять то, с помощью какой кнопки его открыли и устанавливать в option необходимое значение, если конечно оно есть у кнопки или предлагать выбор.

Также соответственно добавить в script.js данные для отправки на сервер:
// получаем выбранный продукт
var product = $("#product").val();
// добавить в formData значение 'product'=значение_поля_product
formData.append('product', product);
И наконец, в файле verify.php получить эти данные $_POST['product'] и отправить на почту.
Ссылка на готовый пример: yadi.sk/d/xXAeSs3xua5zb
Алексей
Алексей
Добрый день! Александр, подскажите пожалуйста можно ли как то этот атрибут «data-argument=»Телевизор"" автоматически подставлять в заголовок (название) открываемой формы.
Александр Мальцев
Александр Мальцев
Добрый! Да, можно!
Для этого необходимо добавить в script.js дополнительную строчку:
$('#feedbackForm').on('show.bs.modal', function (e) {
  if ($(e.relatedTarget).attr('data-argument')) {
    $(e.target).find('.modal-title').text($(e.relatedTarget).attr('data-argument')); // <- необходимо добавить эту строчку
    $('#product').val($(e.relatedTarget).attr('data-argument'));
    $('#product').prop('disabled',true);
  }   
});
Алексей
Алексей
Ураааа))) Спасибо!!!, а что нужно прописать в форме в html? и можно ли как то придать стили css?
Александр Мальцев
Александр Мальцев
Посмотрите в архиве: yadi.sk/d/xXAeSs3xua5zb
Александр Мальцев
Александр Мальцев
Если нужно динамически какие-то дополнительные стили установить, то с помощью JavaScript добавляете к элементам классы. А в CSS для этих классов уже назначаете стили.
Алексей
Алексей
Перелопатил именно эту форму, не нашел там ответа. Нужно, чтобы в модальном окне в форме вместо:
.<h4 class="modal-title" id="myModalLabel">Форма обратной связи</h4>
Появлялся заголовок из атрибута «data-argument=»Телевизор"". Т.е. вместо заголовка Форма обратной связи — показывался текст Телевизор.
Алексей
Алексей
Вопрос снимаю, осилил. Получается через атрибут data-title=«Название заголовка 1
и
<script>
    $('[data-toggle="modal"]').click(function (e) {
      e.preventDefault();
      var idSelector = $(this).attr('data-target');
      var title = $(this).attr('data-title');
      $(idSelector).find('.modal-title').text(title);
    });
  </script>
Спасибо огромное!
Александр Мальцев
Александр Мальцев
Отлично!
Аноним
Аноним
upd:

В таком виде письма отображаются и почтовым клиентом (Outlook 2013) и через веб интерфейс почты RoundCube.
На почтовом сервере настроена автоматическая пересылка на Яндекс почту. Яндекс почта показывает нормально.
Аноним
Аноним
Форма работает только письма ходят в таком виде
Александр Мальцев
Александр Мальцев
Исходные коды поправил.
Необходимо добавить кодировку после создания экземпляра класс PHPMailer в файле verify.php:
// создаём экземпляр класса PHPMailer
$mail = new PHPMailer;
$mail->CharSet = 'UTF-8';  
Аноним
Аноним
Спасибо, вот теперь все правильно отображается
Аноним
Аноним
Тут бы тоже был бы не плох вариант использования Гугловой ReCaptcha
Александр Мальцев
Александр Мальцев
Немного позже добавлю как вариант.