Делаем обработчик форм в цикле foreach

Бывает такое, что на сайте несколько разных форм и одним стандартным обработчиком с условиями не обойтись как могло бы показаться. Исправим это!

  • eye 75
  • 0

Итак у нас на сайте несколько разных форм или есть очень громоздкие формы, как вот эта:

В которой так много всяких элементов формы, что не помещаются даже в экран. Как быть в таких случаях?
Я решил этот вопрос следующим образом: для каждого элемента формы будь то input, select, textarea, checkbox, radio и т.д., создавался ещё один скрытый input, который повествовал, что это за элемент ниже. А сами атрибуты name для них сделал одинаковыми и передавал в виде массива. Как это выгляди в коде:


<form method="POST" action="/action.php">
	
<div class="calc__group cgroup">
		<label for="user_name_calc" class="cgroup__label">Ваше имя</label>
		<input name="user_name_calc[field]" value="Ваше имя: " type="hidden">
		<input placeholder="Name" id="user_name_calc" name="user_name_calc[value]" value="" class="cgroup__input" type="text">
	</div>


	
<div class="calc__group cgroup">
		<label for="your_text" class="cgroup__label">Ваш вопрос</label>
		<input name="your_text[field]" value="Ваш вопрос: " type="hidden">
		<textarea id="your_text" name="your_text[value]" class="cgroup__area" placeholder="Введите ваш вопрос"></textarea>
	</div>

	
<div class="calc__group cgroup">
	    <input name="send_recall[field]" value="Отправлено: " type="hidden">
	    <button type="submit" name="send_recall[value]" value="2018.04.05 12:28" class="button button--yellow">Send</button>
	</div>

</form>

И так мы видим, что name в полях имеет значения в скобках field и value, они необходимы для идентификации в обработчике. Перейдем теперь непосредственно к нему. Обработчик я обычно реализую в виде action, а для отправки писем пользовательский класс, простейший вариант:

// Регистрируем нашу функцию как action
add_action('wp_loaded', 'send_mail');
function send_mail(){
	// Проверяем массив POST
	if(isset($_POST["send_recall"])){
		// берем почту админа для отправки и получения писем
		$to =  get_bloginfo('admin_email');
		$from = get_bloginfo('admin_email');
		// получаем весь переданный массив данных с формы и кодируем
		$requst_json_encode = json_encode($_POST);
		// декодируем
		$requst_json_decode = json_decode($requst_json_encode);
		// переменная для записи текста
		$text = "";
		// начинаем перебирать весь массив данных
		foreach ($requst_json_decode as $key) {
	     // если вдруг был отправлен пустой элемент, то так и скажем, что поле не заполено
	     if (empty($key->value)){ $not_exsist = "Не указан"; }else{ $not_exsist = ""; }
	     // а здесь собственно и собираем наши значения $key->field это значение, которое содержиться в скрытом поле name="name[field]", 
	     // $key->value это как раз значение введенное/выбранное пользователем в форме name="name[value]"
	     $text.= "

" . $key->field . ": " . $key->value . " ". $not_exsist . "

";
	     
		}

		// отправляем письмо
		$subject = __('Вам пришло оповещение с сайта '  ) . get_bloginfo('name');

		$m= new Mail; // начинаем
		$m->From( $from ); // от кого отправляется почта
		$m->To( $to ); // кому адресованно
		$m->Subject( $subject );
		$m->Body( $text,"html" ); 
		$m->Send();

	}
}
comments powered by HyperComments

Поделиться

На вашу почту будет отправлена одноразовая ссылка на портфолио

Отправлено!

Что-то пошло не так... Попробуйте отправить позже