Создание простой контактной формы с FormType в Symfony 3

Работа с HTML-формами является одной из наиболее распространенных и сложных задач для веб-разработчика. Symfony интегрирует компонент Form, который упрощает работу с формами.

В этой статье вы узнаете, как создать базовую контактную форму в Symfony 3, используя FormBuilder и SwiftMailer для отправки электронного письма.

Требования

  • Symfony 3.
  • SwiftMailer Bundle (который обычно поставляется с предустановленной версией и всеми дистрибутивами Symfony).

Реализация

Рекомендуется использовать FormType, так как это правильный рабочий процесс при использовании Symfony. Это поможет вам легко справиться с настройкой ошибок, свойств легко.

Создание FormType для формы контакта

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

add('name', TextType::class, array('attr' => array('placeholder' => 'Your name'),
'constraints' => array(
new NotBlank(array("message" => "Please provide your name")),
)
))
->add('subject', TextType::class, array('attr' => array('placeholder' => 'Subject'),
'constraints' => array(
new NotBlank(array("message" => "Please give a Subject")),
)
))
->add('email', EmailType::class, array('attr' => array('placeholder' => 'Your email address'),
'constraints' => array(
new NotBlank(array("message" => "Please provide a valid email")),
new Email(array("message" => "Your email doesn't seems to be valid")),
)
))
->add('message', TextareaType::class, array('attr' => array('placeholder' => 'Your message here'),
'constraints' => array(
new NotBlank(array("message" => "Please provide a message here")),
)
))
;
}
public function setDefaultOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'error_bubbling' => true
));
}
public function getName()
{
return 'contact_form';
}
}

Замечания: измените пространство имен в соответствии с расположением FormType в вашем пакете и сохраните его для использования на следующем шаге.

Создание вида в Twig

Теперь представление (в данном случае, которое будет отображаться с помощью ветки), должно быть основным для тестирования:

{# contact.html.twig #}
{{ form_start(form) }}
{{ form_widget(form.subject) }}
{{ form_errors(form.subject) }}
{{ form_widget(form.name) }}
{{ form_errors(form.name) }}
{{ form_widget(form.email) }}
{{ form_errors(form.email) }}
{{ form_widget(form.message) }}
{{ form_errors(form.message) }}
{# Render CSRF token etc .#}
{{ form_rest(form) }}
{{ form_end(form) }}

Создание контроллера

Теперь самое важное в учебнике — контроллер, который будет обрабатывать нашу форму.

Как обычно, ваше действие в контроллере уже должно иметь путь в файле routing.yml, и он нацелен на него:

myapplication_contact:
path:     /contact
defaults: { _controller: myBundle:Default:contact }

Наконец, наш контроллер (с действием контакта) должен выглядеть так:

createForm('myapplication\myBundle\Form\ContactType',null,array(
// To set the action use $this->generateUrl('route_identifier')
'action' => $this->generateUrl('myapplication_contact'),
'method' => 'POST'
));
if ($request->isMethod('POST')) {
// Refill the fields in case the form is not valid.
$form->handleRequest($request);
if($form->isValid()){
// Send mail
if($this->sendEmail($form->getData())){
// Everything OK, redirect to wherever you want ! :
return $this->redirectToRoute('redirect_to_somewhere_now');
}else{
// An error ocurred, handle
var_dump("Errooooor :(");
}
}
}
return $this->render('myBundle:Default:contact.html.twig', array(
'form' => $form->createView()
));
}
private function sendEmail($data){
$myappContactMail = 'mycontactmail@mymail.com';
$myappContactPassword = 'yourmailpassword';
// In this case we'll use the ZOHO mail services.
// If your service is another, then read the following article to know which smpt code to use and which port

$transport = \Swift_SmtpTransport::newInstance('smtp.zoho.com', 465,'ssl')
->setUsername($myappContactMail)
->setPassword($myappContactPassword);
$mailer = \Swift_Mailer::newInstance($transport);
$message = \Swift_Message::newInstance("Our Code World Contact Form ". $data["subject"])
->setFrom(array($myappContactMail => "Message by ".$data["name"]))
->setTo(array(
$myappContactMail => $myappContactMail
))
->setBody($data["message"]."
ContactMail :".$data["email"]);
return $mailer->send($message);
}
}

contactAction является нормальной и типичной формой Symfony 3 Проверяется, была ли форма отправлена ​​вместе с POST метод, затем он проверяет, являются ли данные ограничения, указанные в ContactType, корректными. Если они действительны, отправьте электронное письмо, используя sendEmail функция.

FormType Symfony 3

Заключение

  • Обратите внимание, что функция sendEmail — это прямая реализация SwiftMailer. Мы только что использовали реализацию с Zoho Mail, если вы используете другого провайдера электронной почты, вам нужно изменить SMTP-адрес и проверить, требует ли ваша служба SSL. В этой функции вам просто нужно изменить почтовую переменную и пароль, и вы получите электронное письмо, отправленное в том же направлении, что и вы (mymail@mail.com отправляет на mymail@mail.com).
  • Вы можете легко добавить больше полей в форму в FormType, чтобы получить их в функции sendEmail (которая становится массивом из $form->getData) используйте это ключевое значение.
  • Вы также можете использовать Google Recaptcha в своих формах, если вы хотите предотвратить роботов и т. Д.
  • Использование компонента Symfony Form более надежно, чем самостоятельная реализация формы без защиты CSRF, и обеспечивает простой способ обработки ошибок.
Ссылка на основную публикацию
Adblock
detector