Створення блогу на Symfony 2.8.1 lts [ Частина 2 ]

Сторінка з контактною інформацією: валідатори, форми та електронна пошта

Огляд

Тепер у нас є основні шаблони HTML, настав час впровадити трохи функціоналу в одну з сторінок. Ми почнемо з однією з найпростіших сторінок: сторінки контактів. В кінці цієї частини у вас буде форма, яка дозволяє користувачам відправляти запити веб-майстру.

У цій частині:

1. Валідатори
2. Форми
3. Конфігурація Бандла

Проект на github

Переміщення по частинах керівництва (Наприклад, якщо ви хочете почати проект відразу з цієї частини не проходячи першу)Завантажити потрібну вам частину в архіві можна посилання

Або скопіювати ввівши в консолі команду

git clone --branch Lesson* https://github.com/AntoscencoVladimir/symfony-blog
 

де замість зірочки номер потрібного вам уроку

Далі виконуємо в консолі команду

composer install
 


з папки скачаного репозиторію



Сторінка контактів

Маршрутизація

Як і зі сторінкою «About» створеної в попередній главі, ми почнемо з визначення маршруту для сторінки контактів. Відкрийте файл маршрутизації BloggerBlogBundle розташований у
src/Blogger/BlogBundle/Resources/config/routing.yml

і додайте наступне правило маршрутизації.

# src/Blogger/BlogBundle/Resources/config/routing.yml
BloggerBlogBundle_contact:
path: /contact
defaults: { _controller: "BloggerBlogBundle:Page:contact" }
вимога:
methods: GET

ПриміткаЗверніть увагу, опис маршруту, так повинні виглядати всі маршрути. У першій частині була допущена помилка, із-за чого з'являється попередження «deprecated». Якщо у вас виникли складнощі, правильне опис ви можете подивитися в файлі на github.


Тут немає нічого нового, правило діє для шаблону /contact, метод HTTP GET і виконує функцію contactAction в контролері Page в нашому бандл BloggerBlog.

Контролер

Давайте додамо функцію для сторінки Контактів контролер Page нашого пакету BloggerBlog який знаходиться в
src/Blogger/BlogBundle/Controller/PageController.php
 


class PageController extends Controller
{
//..

public function contactAction()
{
return $this- > render('BloggerBlogBundle:Page:contact.html.twig');
}

}

Зараз ця функція дуже проста, вона лише виводить шаблон для сторінки контактів. Ми повернемося до контролера пізніше.

Показати

Створіть шаблон:

src/Blogger/BlogBundle/Resources/views/Page/contact.html.twig 
 


І додайте наступний зміст:

{# src/Blogger/BlogBundle/Resources/views/Page/contact.html.twig #}
{% extends 'BloggerBlogBundle::layout.html.twig' %}


{% block title %}Contact{% endblock%}

{% block body %}
<header>
<h1>Contact symblog</h1>
</header>

<p>Want to contact symblog?</p>
{% endblock %}



Цей шаблон також досить простий. Він розширює шаблон layout, перевизначає заголовок і визначає певний контент для блоку body.

Посилання на сторінки
Нарешті, ми повинні оновити посилання в шаблоні програми, щоб додати посилання на сторінку контактів
app/Resources/views/base.html.twig 


#app/Resources/views/base.html.twig
{% block navigation %}
<nav>
<ul class="navigation">
<li><a href="{{ path('BloggerBlogBundle_homepage') }}">Home</a></li>
<li><a href="{{ path('BloggerBlogBundle_about') }}">About</a></li>
<li><a href="{{ path('BloggerBlogBundle_contact') }}">Contact</a></li>
</ul>
</nav>
{% endblock %}


Якщо ви перейдете за адресою http://localhost:8000 і натиснете на посилання «Contact» в навігаційній панелі, ви побачите дуже просту сторінку контактів. Тепер у нас є правильно налаштована сторінка і саме час, попрацювати з формою. Це включає в себе 2 окремі частини: Валідатори і безпосередньо сама Форма. Перш ніж ми зможемо звернутися до концепції Валідаторів і Форм, ми повинні подумати про те, як ми будемо обробляти дані з запиту.

Сутність Contact

Давайте почнемо з створення класу, який представляє запит від користувача. Ми хочемо, прийняти деяку базову інформацію, таку як ім'я, тема та тіло запиту. Створіть новий файл
src/Blogger/BlogBundle/Entity/Enquiry.php 
і вставте в наступний зміст:
<?php

// src/Blogger/BlogBundle/Entity/Enquiry.php

namespace Blogger\BlogBundle\Entity;


class Enquiry
{
protected $name;

protected $email;

protected $subject;

protected $body;

/**
* @return mixed
*/
public function getName()
{
return $this- > name;
}

/**
* @param mixed $name
*/
public function setName($name)
{
$this- > name = $name;
}

/**
* @return mixed
*/
public function getEmail()
{
return $this->email;
}

/**
* @param mixed $email
*/
public function setEmail($email)
{
$this->email = $email;
}

/**
* @return mixed
*/
public function getSubject()
{
return $this->subject;
}

/**
* @param mixed $subject
*/
public function setSubject($subject)
{
$this->subject = $subject;
}

/**
* @return mixed
*/
public function getBody()
{
return $this->body;
}

/**
* @param mixed $body
*/
public function setBody($body)
{
$this->body = $body;
}

}

Рада (якщо ви використовуєте IDE PHPStorm)У вас є можливість генерувати геттери і сетери автоматично.

Для цього:

1. Натисніть на праву кнопку миші у файлі (або комбінацію alt+insert), виберіть Generate



2. Далі Getters and Setters



3. Виділіть і натисніть ОК.





Як ви можете бачити цей клас просто визначає деякі захищені змінні і методи доступу до них. Там немає нічого, що визначає, як ми будемо валідувати змінні або як змінні відносяться до елементів форми. Ми повернемося до цього пізніше.

Примітка

Давайте поговоримо про те, як використовуються простору імен в Symfony2. Клас сутності який ми створили задає простір імен
Blogger\BlogBundle\Entity
. Так як Symfony2 підтримує стандарт автозавантаження PSR-0 простір імен вказує безпосередньо на структуру файлів пакету. Клас сутності Enquiry знаходиться в
src/Blogger/BlogBundle/Entity/Enquiry.php
, що забезпечує Symfony2 правильну автозавантаження класу.
Яким чином Symfony2 автозавантажувач розуміє, що простір імен Blogger знаходиться у каталозі src? Це забезпечується завдяки конфігурацій автозавантажувач
app/autoload.php 


/**
* @var ClassLoader $loader
*/
$loader = require __DIR__.'/../vendor/autoload.php';

AnnotationRegistry::registerLoader(array($loader, 'loadClass'));

return $loader;



Він реєструє всі простори імен, які не були зареєстровані. Так як простір імен Blogger не зареєстровано, Symfony2 автозавантажувач буде шукати необхідні файли в директорії src.
Автозавантажувач і простір імен дуже потужна концепція в Symfony2. Якщо ви отримуєте помилки, де PHP не може знайти класи, ймовірно, у вас є помилка у вашому просторі імен або в структурі папок. Ви не повинні піддаватися спокусі виправити це за допомогою РНР require або include включення.



Форми

Давайте створимо форму.

Symfony2 поставляється з дуже потужним інструментом для роботи з формами. Як і всі компоненти Symfony2, він може бути використаний за межами Symfony2 в інших проектах. Компонент роботи з Формами доступний на GitHub. Ми почнемо зі створення AbstractType класу, який представляє форму запиту. Ми могли б створити форму безпосередньо в контролері, а не возитися з цим класом, однак відділення форми в окремий клас дозволяє повторно використовувати форму у всьому додатку. Він так само дозволяє не захаращувати контролер. Контролер повинен бути простим.

EnquiryType
Створіть новий файл
src/Blogger/BlogBundle/Form/EnquiryType.php
і додайте наступний зміст:

<?php

namespace Blogger\BlogBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class EnquiryType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name', TextType::class);
$builder->add('email', EmailType::class);
$builder->add('subject', TextType::class);
$builder->add('body', TextareaType::class);
}

public function configureOptions(OptionsResolver $resolver)
{

}

public function getBlockPrefix()
{
return 'contact';
}
}

Рада (якщо ви використовуєте IDE PHPStorm)Якщо ви використовуєте IDE PHPStorm c плагіном Symfony створення класу EnquiryType буде ще простіше

Натисніть правою кнопкою миші на папці бандлу, виберіть New -> Form (або натисніть комбінацію Alt + Insert виберіть Form)



потім введіть назву EnquiryType і додайте відсутні рядки як описано вище ( зверніть увагу, останній метод повинен бути getBlockPrefix )



Клас EnquiryType представляє інтерфейс FormBuilderInterface. Цей інтерфейс використовується класом FormBuilder. Клас FormBuilder це ваш кращий друг, коли справа доходить до створення форм. Він здатний спростити процес визначення полів на основі метаданих. Оскільки наша сутність Enquiry дуже проста ми не буде поки визначати метадані, так що FormBuilder буде виводити значення за замовчуванням.

Примітка

Тут потрібно згадати, що метод getBlockPrefix повинен повертати унікальний ідентифікатор.

Створення форми у контролері



Ми визначили сутності Enquiry і EnquiryType, тепер ми можемо оновити функцію contact, щоб використовувати їх. Замініть вміст функції, розташованої
src/Blogger/BlogBundle/Controller/PageController.php
наступним:

// src/Blogger/BlogBundle/Controller/PageController.php
public function contactAction(Request $request)
{
$enquiry = new Enquiry();

$form = $this->createForm(EnquiryType::class, $enquiry);

if ($request->getMethod() == 'POST') {
$form->submit($request);

if ($form->isValid()) {
// Perform some action, such as sending an email

// Redirect - This is important to prevent users re-posting
// the form if they refresh the page
return $this->redirect($this->generateUrl('BloggerBlogBundle_contact'));
}
}

return $this- > render('BloggerBlogBundle:Page:contact.html.twig', array(
'form' => $form->createView()
));
}



Ми почнемо зі створення екземпляра сутності Enquiry. Ця сутність є дані про contact запиті. Далі ми створимо форму. Визначимо EnquiryType, який ми створили раніше, і передамо нашу enquiry entity object.
Так як ці дії контролера будуть мати справу з відображенням і обробкою відправленої форми, ми повинні перевірити метод HTTP. Форми, як правило, передаються через метод POST, і наша форма не буде винятком. Якщо метод запиту POST, виклик
submit($request)
перетворить надіслані дані назад в елементи нашого $enquiry object. На даний момент об'єкт $enquiry містить уявлення про те, що відправив користувач. Далі ми зробимо перевірку, щоб переконатися, що форма заповнена вірно. Так як ми не вказали жодного валідатора на цей момент, форма завжди буде дійсна. І нарешті ми вкажемо шаблон для візуалізації.

Ми повинні імпортувати простору імен в наш контролер т. к. використовуємо нові класи. Оновіть файл контролера, розташований в
src/Blogger/BlogBundle/Controller/PageController.php


Заяви повинні бути розміщені під уже наявними.

<?php
// src/Blogger/BlogBundle/Controller/PageController.php

namespace Blogger\BlogBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

// Import new namespaces
use Symfony\Component\HttpFoundation\Request;
use Blogger\BlogBundle\Entity\Enquiry;
use Blogger\BlogBundle\Form\EnquiryType;


class PageController extends Controller
{
//..



Відображення форми

Завдяки шаблонизатору Twig висновок форм дуже простий. Twig надає багаторівневу систему для виведення форм, що дозволяє виводити форму як одну цілу сутність або у вигляді окремих помилок і елементів, в залежності від рівня налаштування яка вам потрібна. Щоб продемонструвати міць методів Twig виведемо всю форму, наступним фрагментом коду:

< form action="{{ path('BloggerBlogBundle_contact') }}" method="post" >
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

<input type="submit" />
</form>


У той час як, це дуже просто для створення прототипів і простих форм, це має і свої обмеження, коли необхідні додаткові параметри, що часто буває з формами.

Для нашої контактної форми, ми виберемо золоту середину. Замініть код шаблону, розташований в
src/Blogger/BlogBundle/Resources/views/Page/contact.html.twig


{# src/Blogger/BlogBundle/Resources/views/Page/contact.html.twig #}
{% extends 'BloggerBlogBundle::layout.html.twig' %}

{% block title %}Contact{% endblock%}

{% block body %}
<header>
<h1>Contact symblog</h1>
</header>

<p>Want to contact symblog?</p>

<form action="{{ path('BloggerBlogBundle_contact') }}" method="post" {{ form_start(form { 'attr': {'class': 'blogger'} }) }}
{{ form_errors(form) }}

{{ form_row(form.name) }}
{{ form_row(form.email) }}
{{ form_row(form.subject) }}
{{ form_row(form.body) }}

{{ form_rest(form) }}

<input type="submit" value="Submit" />

{% endblock %}


Як ви можете бачити, ми використовуємо 4 нових методу Twig для виведення форми.

Перший метод form_start (вид, змінні) виводить тег початку форми. Цей помічник піклується про виведення методу конфігурації і action у формі. Він також включає в себе правильне значення ENCTYPE якщо форма містить поля завантаження.

Другий методform_errors буде виводити помилки форми в тому разі, якщо перевірка не вдалася.

Третій метод form_row виводить цілі елементи, пов'язані з кожною областю форми. Це включає в себе які-небудь помилки в поле label поля і актуальний елемент поля.

Нарешті ми використовуємо метод form_rest. Це безпечний варіант, щоб використовувати метод у кінці форми, щоб зробити будь-які поля, які ви, можливо, забули, у тому числі приховані поля і Symfony2 Form CSRF token.

Примітка

Підробка запиту cross-site (CSRF) пояснюється докладно у розділі Форми книги Symfony2.


Стилізація форми



Давайте додамо деякі стилі, щоб покращити вигляд форми. Так як ці стилі є специфічними в межах нашого бандла ми створимо стилі в новому файлі стилів всередині самого пакету. Створіть новий файл
src/Blogger/BlogBundle/Resources/public/css/blog.css
та вставте стилі.

.blogger-notice { text-align: center; padding: 10px; background: #DFF2BF; border: 1px solid; color: #4F8A10; margin-bottom: 10px; }
form.blogger { font-size: 16px; }
form.blogger div { clear: left; margin-bottom: 10px; }
form.blogger label { float: left; margin-right: 10px; text-align: right; width: 100px; font-weight: bold; vertical-align: top; padding-top: 10px; }
form.blogger input[type="text"],
form.blogger input[type="email"]
{ width: 500px; line-height: 26px; font-size: 20px; min-height: 26px; }
form.blogger textarea { width: 500px; height: 150px; line-height: 26px; font-size: 20px; }
form.blogger input[type="submit"] { margin-left: 110px; width: 508px; line-height: 26px; font-size: 20px; min-height: 26px; }
form.blogger ul li { color: #ff0000; margin-bottom: 5px; }



Нам потрібно, щоб програма знало, що ми хочемо використовувати цю таблицю стилів. Ми могли б підключити таблиці стилів в шаблон сторінки Контакти, але так як інші шаблони будуть також використовувати ці стилі пізніше, має сенс, імпортувати стилі layout Blogger BlogBundle який ми створили в першій частині. Відкрийте BloggerBlogBundlelayout
src/Blogger/BlogBundle/Resources/views/layout.html.twig
і замініть зміст наступним:

{# src/Blogger/BlogBundle/Resources/views/layout.html.twig #}
{% extends '::base.html.twig' %}

{% block stylesheets %}
{{ parent() }}
<link href="{{ asset('bundles/bloggerblog/css/blog.css') }}" type="text/css" rel="stylesheet" />
{% endblock %}

{% block sidebar %}
Sidebar content
{% endblock %}



Ви можете бачити, що ми вивели блок стилів для його змінення, який в свою чергу визначений у батьківському шаблоні. Важливо зауважити, що викликається батьківський метод. Це буде підключати файли стилів, які визначені в
app/Resources/base.html.twig
, і дозволяє додати новий файл стилів. Ми не хочемо, змінити вже існуючі таблиці стилів.
Для того, щоб функція asset правильно поключала файли, нам потрібно скопіювати або зв'язати ресурси бандла в папці web нашої програми. Це може бути зроблено наступною командою в консолі:

php app/console assets:install --web symlink
 


Тепер, якщо ви поновіть сторінку форма буде виглядати набагато привабливіше.



Давайте змінимо маршрут, розташований
src/Blogger/BlogBundle/Resources/config/routing.yml
для обробки POST запитів.


# src/Blogger/BlogBundle/Resources/config/routing.yml
BloggerBlogBundle_contact:
path: /contact
defaults: { _controller: "BloggerBlogBundle:Page:contact" }
вимога:
methods: GET|POST



Примітка

Тепер, коли ви відправите форму вона має функціонувати як очікується, проте сторінка буде просто перенаправляти вас назад у контактну форму.


Валідатори

Symfony2 валідатор дозволяє нам виконувати перевірку даних. Перевірка, є поширеною завданням при роботі з даними з форми. Перевірка даних також повинна бути виконана, перш ніж вони будуть відправлені в базу даних.
Symfony2 валідатор дозволяє відокремити нашу логіку перевірки від компонентів, які можуть використовувати його, наприклад, компонента форми або компонента бази даних. Цей підхід означає, що ми маємо один набір правил для валідації об'єкта.

Давайте почнемо з оновлення сутності Enquiry, розташованої в
src/Blogger/BlogBundle/Entity/Enquiry.php
вкажемо декілька валідаторів. Переконайтеся, що ви додали 4 нових заяви у верхній частині файлу.

<?php

// src/Blogger/BlogBundle/Entity/Enquiry.php

namespace Blogger\BlogBundle\Entity;

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\Length;


class Enquiry
{

public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addPropertyConstraint('name', new NotBlank());
$metadata->addPropertyConstraint('email', new Email());
$metadata->addPropertyConstraint('subject', new Length(array(
'max' => 50

)));
$metadata->addPropertyConstraint('body', new Length(array(
'min' => 50
)));
}
//..



Щоб визначити валідатори, ми повинні реалізувати статичний метод loadValidatorMetadata. Він дасть нам об'єкт ClassMetadata. Ми можемо використовувати цей об'єкт, щоб встановити обмеження на елементи наших сутностей.
Перша заява NotBlank застосовується до елемента name. NotBlank валідатор перевіряє не є пустим.
Далі ми перевіряємо правильно користувач ввів свій e-mail. Служба Symfony2 надає валідатор який перевіряє правильність заповнення поля e-mail включаючи перевірку домену.
Ми хочемо, щоб теми не було порожнім і містив не більше 50 символів, а повідомлення не менше 50 символів.
Ви можете застосувати стільки валідаторів до одного поля скільки вам необхідно.

Повний список валідаторів надається в довідкових документах Symfony2. Також можна створювати і користувальницькі валідатори.

Тепер, при відправці форми ваші дані будуть проходити валідацію. Спробуйте ввести неправильний адресу електронної пошти. Ви повинні побачити повідомлення про помилку, що інформує про те, що адреса електронної пошти є недійсним. Кожен валідатор виводить повідомлення за замовчуванням, яке може бути перевизначено, якщо потрібно. Наприклад, щоб змінити повідомлення e-mail валідатора ви можете зробити наступне:

$metadata->addPropertyConstraint('email', new Email(array(
'message' => 'symblog does not like invalid emails. Give me a real one!'
)));



Примітка

Якщо ви використовуєте браузер, який підтримує HTML5, вам буде виведено повідомлення HTML5 певних обмежень. Це перевірка на стороні клієнта і Symfony2 встановить відповідні обмеження HTML5 на основі метаданих Entity. Ви можете побачити це на елементі email. Відображення HTML

<input type="email" id="contact_email" name="contact[email]" required="required">


Він використав один з нових типів полів HTML5, email і поставив необхідний атрибут. Перевірка на стороні клієнта є великим плюсом тому що вона не вимагає запитів на сервер, щоб перевірити форму. Однак перевірка на стороні клієнта не повинна використовуватися поодинці. Ви завжди повинні перевіряти подані на сторону сервера дані, так як досить легко обійти перевірку на стороні клієнта.



Відправка Email

У той час як наша форма контактів дозволяє користувачам відправляти запити, нічого насправді поки не відбувається. Давайте поновимо контролер, щоб надіслати листа веб-мастеру блогу. Symfony2 поставляється в комплекті з бібліотекою SwiftMailer для відправки електронної пошти. Swift Mailer є дуже потужною бібліотекою, ми лише доторкнемося до того, що ця бібліотека може виконувати.

Конфігурація настройок SwiftMailer
Swift Mailer вже налаштований з коробки працювати в Symfony2, проте нам потрібно налаштувати деякі параметри, що стосуються способів відправлення і повноважень. Відкрийте файл параметрів, розташований в
app/config/parameters.yml
і знайдіть налаштування з префіксом mailer_.

mailer_transport: smtp
 
mailer_host: 127.0.0.1
 
mailer_user: null
 
mailer_password: null
 


Swift Mailer надає ряд методів для відправки електронної пошти, у тому числі з використанням сервера SMTP, використовуючи 'місцеву' установку Sendmail, або навіть з допомогою облікового запису Gmail. Для простоти ми будемо використовувати обліковий запис Gmail. Оновіть параметри, підставивши свій логін і пароль.

mailer_transport: gmail
 
mailer_encryption: ssl
 
mailer_auth_mode: login
 
mailer_host: smtp.gmail.com
 
mailer_user: ваш_логін
 
mailer_password: ваш_пароль
 

 


Важливо !

Будьте обережні, якщо ви використовуєте систему контролю версій (VCS) як Git для вашого проекту, особливо якщо ваше сховище загальнодоступно. Ви повинні переконатися, що файл програми
app/config/parameters.yml
доданий в список ігнорованих вашого СКВ.



Контролер
Оновіть Page контролер розташований
src/Blogger/BlogBundle/Controller/PageController.php
скопіювавши в нього наступний код:

if ($form->isValid()) {
$message = \Swift_Message::newInstance()
->setSubject('Contact enquiry from symblog')
->setFrom('enquiries@symblog.co.uk')
->setTo('email@email.com')
->setBody($this->renderView('BloggerBlogBundle:Page:contactEmail.txt.twig', array('enquiry' => $enquiry)));


$this- > get('mailer')->send($message);

$this- > get('session')->getFlashBag()->add('blogger-notice', 'Your contact enquiry was successfully sent. Thank you!');

// Redirect - This is important to prevent users re-posting
// the form if they refresh the page
return $this->redirect($this->generateUrl('BloggerBlogBundle_contact'));

}



Коли ви використовуєте бібліотеку SwiftMailer щоб створити Swift_Message, він може бути відправлений у вигляді електронної пошти.

Примітка

Так як бібліотека Swift Mailer не використовує простору імен, ми повинні поставити префікс перед класом Swift Mailer \. Це говорить PHP, повернутися назад у глобальний простір. Вам потрібно буде додати префікс всіх класів і функцій, які не мають простір імен з \. Якщо ви не розмістите цей префікс перед класом Swift_Message PHP буде видно для класу в поточному просторі імен, яке в цьому прикладі є Blogger\BlogBundle\Controller, в результаті чого буде виведена помилка.


Ми також встановили flash повідомлення у сесії. Flash повідомлення являють собою повідомлення, які зберігаються протягом одного запиту. Після цього вони автоматично очищаються з Symfony2. Повідомлення flash буде показано в шаблоні контакту, щоб повідомити користувачу що запит був відправлений. Так як flash повідомлення тільки протягом одного запиту, воно ідеально підходить для повідомлення користувача про успіх попередніх дій.

Для відображення flash повідомлення нам необхідно оновити шаблон контактів, розташований
src/Blogger/BlogBundle/Resources/views/Page/contact.html.twig
оновити вміст шаблону:
//..
<header>
<h1>Contact symblog</h1>
</header>

{% for flashMessage in app.session.flashbag.get('blogger-notice') %}
<div class="blogger-notice">
{{ flashMessage }}
</div>
{% endfor %}

<p>Want to contact symblog?</p>
//..



Цей код перевіряє, чи є flash повідомлення з ідентифікатором blogger-notice встановленим та виведено.

Реєстрація email а веб-майстри

Symfony2 надає систему конфігурації, яку ми можемо використовувати, щоб визначити наші власні налаштування. Ми будемо використовувати цю систему для установки електронної пошти, веб-майстри, а не жорсткого кодування адреси в контролері вище. Таким чином, ми можемо легко повторно використовувати це значення в інших місцях без дублювання коду. Крім того, коли ваш блог викликає стільки трафіку якого стало занадто багато для вас, ви можете легко оновити адресу електронної пошти, щоб передати листа вашому помічникові. Створіть новий файл
src/Blogger/BlogBundle/Resources/config/config.yml
і вставити наступне:

parameters:
# Blogger contact email address
blogger_blog.emails.contact_email: contact@email.com


При визначенні параметрів хорошою практикою є розділення імен параметрів на кількість компонентів. Перша частина повинна бути в нижньому регістрі і використовувати нижнє підкреслення для розділення слів. У нашому прикладі ми перетворили бандл BloggerBlogBundle в blogger_blog… Решта імені параметра може містити будь-яку кількість частин розділених. (Точкою). Це дозволяє логічно групувати параметри.
Для того, щоб додаток Symfony2 використовувало нові параметри, ми повинні імпортувати конфігурацію в головний файл конфігурації програми,
app/config/config.yml
для цього, додайте наступне:

# app/config/config.yml
imports:
# .. existing import here
- { resource: "@BloggerBlogBundle/Resources/config/config.yml"}


Шлях імпорту – це фізичне розташування файлів на диску.

Нарешті давайте поновимо функцію contactAction для використання параметра.

// src/Blogger/BlogBundle/Controller/PageController.php

public function contactAction(Request $request)
{
$enquiry = new Enquiry();

$form = $this->createForm(EnquiryType::class, $enquiry);

if ($request->getMethod() == 'POST') {
$form->handleRequest($request);
if ($form->isValid()) {
$message = \Swift_Message::newInstance()
->setSubject('Contact enquiry from symblog')
->setFrom('enquiries@symblog.co.uk')
->setTo($this->container->getParameter('blogger_blog.emails.contact_email'))
->setBody($this->renderView('BloggerBlogBundle:Page:contactEmail.txt.twig', array('enquiry' => $enquiry)));


$this- > get('mailer')->send($message);

$this- > get('session')->getFlashBag()->add('blogger-notice', 'Your contact enquiry was successfully sent. Thank you!');

// Redirect - This is important to prevent users re-posting
// the form if they refresh the page
return $this->redirect($this->generateUrl('BloggerBlogBundle_contact'));

}

}

return $this- > render('BloggerBlogBundle:Page:contact.html.twig', array(
'form' => $form->createView()
));
}




Підказка

Так як конфігураційний файл імпортується в верхню частину файл конфігурації програми ми можемо легко змінити будь-який з імпортованих параметрів у додатку. Наприклад, додавши наступний рядок в нижню частину
app/config/config.yml
буде перевизначено значення параметра.

# app/config/config.yml
parameters:
# Blogger contact email address
blogger_blog.emails.contact_email: assistant@email.com



Створення шаблону e-mail

Тіло нашого email, виводить шаблон. Створіть цей шаблон
src/Blogger/BlogBundle/Resources/views/Page/contactEmail.txt.twig

і додайте наступне:
{# src/Blogger/BlogBundle/Resources/views/Page/contactEmail.txt.twig #}
A contact enquiry was made by {{ enquiry.name }} о {{ "now" | date("Y-m-d H:i") }}.

Reply-To: {{ enquiry.email }}
Subject: {{ enquiry.subject }}
Body:
{{ enquiry.body }}



Ви може так само помітили, що розширення цього шаблону відрізняється від інших шаблонів, які ми створили. Він використовує розширення .txt.twig. Першою частиною розширення, .txt визначається формат файлу для генерації. Загальні формати включають, .txt, .html .css .js, XML та .json. В останній частині розширення визначає, який движок шаблону використовувати, в даному випадку Twig. Розширення .php використовувало б PHP для відображення шаблону.
Тепер, коли Ви відправили запит лист буде надіслано на адресу, вказану у параметріblogger_blog.emails.contact_email.

Підказка

Symfony2 дозволяє налаштувати поведінку бібліотеки SwiftMailer при роботі в різних середовищах Symfony2. Ми вже бачимо це у використанні для тестового середовища. За замовчуванням, Symfony 2 налаштовує SwiftMailer не посилати електронну пошту, коли працює в середовищі. Це встановлюється в конфігураційному файлі
app/config/config_test.yml


swiftmailer:
disable_delivery: true



Це може бути корисно, щоб продублювати цю функціональність середовища Dev. В кінці кінців, ви напевне не хочете, випадково відправити лист за неправильною адресою при розробці. Для досягнення цієї мети, додайте вищевказану конфігурацію в файл конфігурації Dev, розташованого
app/config/config_dev.yml



Ви можете будете здивовані, як ви можете перевірити, що листи були відправлені. Symfony2 має рішення для цього за допомогою панелі інструментів розробника. Коли лист буде відправлено значок-повідомлення електронної пошти з'явиться на панелі інструментів, який має всю інформацію про листі.
Якщо ви виконуєте перенаправлення після відправки електронної пошти, як ми робимо для контактної форми, вам потрібно буде встановити intercept_redirects налаштування
app/config/config_dev.yml
значенняtrue для того, щоб побачити повідомлення електронної пошти на панелі інструментів.



Ми могли б налаштувати SwiftMailer для відправки всіх листів на певний адреса електронної пошти у середовищі Dev, помістивши наступний параметр в конфігураційному файлі Dev, розташованого
app/config/config_dev.yml


swiftmailer:
delivery_address: development@symblog.dev


Висновок

Ми продемонстрували концепції, для створення однієї з найбільш фундаментальних частин будь-якого веб-сайту: форми.
Далі ми розглянемо більшу частину цього керівництва, Модель. Розповімо про Doctrine 2 і використовуємо його для визначення blog Model. А також досліджуємо концепцію Data fixtures.

Джерела і допоміжні матеріали:

https://symfony.com/
http://tutorial.symblog.co.uk/
http://twig.sensiolabs.org/
http://www.doctrine-project.org/
https://getcomposer.org/

Частина 1

Post Scriptum
дякую Всім за увагу і зауваження зроблені за проектом, якщо у вас виникли труднощі чи питання, отписывайтесь в коментарі або особисті повідомлення, додавайтеся в друзі.


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.