]> Raphaël G. Git Repositories - blogbundle/blob - Controller/DefaultController.php
Replace sent parameter by a notice
[blogbundle] / Controller / DefaultController.php
1 <?php declare(strict_types=1);
2
3 /*
4 * This file is part of the Rapsys BlogBundle package.
5 *
6 * (c) Raphaël Gertz <symfony@rapsys.eu>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12 namespace Rapsys\BlogBundle\Controller;
13
14 use Symfony\Bridge\Twig\Mime\TemplatedEmail;
15 use Symfony\Component\HttpFoundation\Request;
16 use Symfony\Component\HttpFoundation\Response;
17 use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
18 use Symfony\Component\Mime\Address;
19
20 use Rapsys\BlogBundle\Entity\Article;
21
22 /**
23 * {@inheritdoc}
24 */
25 class DefaultController extends AbstractController {
26 /**
27 * The about page
28 *
29 * Display the about informations
30 *
31 * @param Request $request The request instance
32 * @return Response The rendered view or redirection
33 */
34 public function about(Request $request): Response {
35 //Set page
36 $this->context['title']['page'] = $this->translator->trans('About');
37
38 //Set description
39 $this->context['description'] = $this->translator->trans('Welcome to raphaël\'s developer diary about page');
40
41 //Set keywords
42 $this->context['keywords'] = $this->translator->trans('about');
43
44 //Create response
45 $response = new Response();
46
47 //Set etag
48 //XXX: only for public to force revalidation by last modified
49 $response->setEtag(md5(serialize($this->context)));
50
51 //Set last modified
52 $response->setLastModified((new \DateTime)->setTimestamp(getlastmod()));
53
54 //Set as public
55 $response->setPublic();
56
57 //Without role and modification
58 if ($response->isNotModified($request)) {
59 //Return 304 response
60 return $response;
61 }
62
63 //Render template
64 return $this->render('@RapsysBlog/about.html.twig', $this->context, $response);
65 }
66
67 /**
68 * The contact page
69 *
70 * Send a contact mail to configured contact
71 *
72 * @param Request $request The request instance
73 * @return Response The rendered view or redirection
74 */
75 public function contact(Request $request): Response {
76 //Set title
77 $this->context['title']['page'] = $this->translator->trans('Contact');
78
79 //Set description
80 $this->context['description'] = $this->translator->trans('Welcome to raphaël\'s developer diary contact page');
81
82 //Set keywords
83 $this->context['keywords'] = $this->translator->trans('contact');
84
85 //Set data
86 $data = [];
87
88 //With user
89 if ($user = $this->security->getUser()) {
90 //Set data
91 $data = [
92 'name' => $user->getRecipientName(),
93 'mail' => $user->getMail()
94 ];
95 }
96
97 //Create response
98 $response = new Response();
99
100 //Create the form according to the FormType created previously.
101 //And give the proper parameters
102 $form = $this->createForm('Rapsys\PackBundle\Form\ContactType', $data, [
103 'action' => $this->generateUrl('rapsysblog_contact'),
104 'method' => 'POST'
105 ]);
106
107 if ($request->isMethod('POST')) {
108 // Refill the fields in case the form is not valid.
109 $form->handleRequest($request);
110
111 if ($form->isSubmitted() && $form->isValid()) {
112 //Get data
113 $data = $form->getData();
114
115 //Set context
116 $context = [
117 'subject' => $data['subject'],
118 'message' => strip_tags($data['message']),
119 ]+$this->context;
120
121 //Create message
122 $message = (new TemplatedEmail())
123 //Set sender
124 ->from(new Address($data['mail'], $data['name']))
125 //Set recipient
126 ->to(new Address($this->config['contact']['address'], $this->config['contact']['name']))
127 //Set subject
128 ->subject($data['subject'])
129
130 //Set path to twig templates
131 ->htmlTemplate('@RapsysBlog/mail/contact.html.twig')
132 ->textTemplate('@RapsysBlog/mail/contact.text.twig')
133
134 //Set context
135 ->context($context);
136
137 //Try sending message
138 //XXX: mail delivery may silently fail
139 try {
140 //Send message
141 $this->mailer->send($message);
142
143 //Add verification notice
144 $this->addFlash('notice', $this->translator->trans('Your message has been sent'));
145
146 //Redirect on the same route with sent=1 to cleanup form
147 return $this->redirectToRoute($request->get('_route'), $request->get('_route_params'));
148 //Catch obvious transport exception
149 } catch(TransportExceptionInterface $e) {
150 //Add error message mail unreachable
151 $form->get('mail')->addError(new FormError($this->translator->trans('Unable to reach account')));
152 }
153 }
154 //With logged user
155 } elseif ($this->checker->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
156 //Set last modified
157 $response->setLastModified(new \DateTime('-1 year'));
158
159 //Set as private
160 $response->setPrivate();
161 //Without logged user
162 } else {
163 //Set etag
164 //XXX: only for public to force revalidation by last modified
165 $response->setEtag(md5(serialize($this->context)));
166
167 //Set last modified
168 $response->setLastModified((new \DateTime)->setTimestamp(getlastmod()));
169
170 //Set as public
171 $response->setPublic();
172
173 //Without role and modification
174 if ($response->isNotModified($request)) {
175 //Return 304 response
176 return $response;
177 }
178 }
179
180 //Render template
181 return $this->render('@RapsysBlog/form/contact.html.twig', ['contact' => $form->createView()]+$this->context, $response);
182 }
183
184 /**
185 * The index page
186 *
187 * Display articles
188 *
189 * @param Request $request The request instance
190 * @return Response The rendered view
191 */
192 public function index(Request $request): Response {
193 //With not enough articles
194 if (($this->count = $this->doctrine->getRepository(Article::class)->findCountAsInt()) < $this->page * $this->limit) {
195 //Throw 404
196 throw $this->createNotFoundException($this->translator->trans('Unable to find articles'));
197 }
198
199 //Get articles
200 if ($this->context['articles'] = $this->doctrine->getRepository(Article::class)->findAllAsArray($this->page, $this->limit)) {
201 //Set modified
202 $this->modified = max(array_map(function ($v) { return $v['modified']; }, $this->context['articles']));
203 //Without keywords
204 } else {
205 //Set empty modified
206 $this->modified = new \DateTime('-1 year');
207 }
208
209 //Create response
210 $response = new Response();
211
212 //With logged user
213 if ($this->checker->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
214 //Set last modified
215 $response->setLastModified(new \DateTime('-1 year'));
216
217 //Set as private
218 $response->setPrivate();
219 //Without logged user
220 } else {
221 //Set etag
222 //XXX: only for public to force revalidation by last modified
223 $response->setEtag(md5(serialize($this->context['articles'])));
224
225 //Set last modified
226 $response->setLastModified($this->modified);
227
228 //Set as public
229 $response->setPublic();
230
231 //Without role and modification
232 if ($response->isNotModified($request)) {
233 //Return 304 response
234 return $response;
235 }
236 }
237
238 //Set keywords
239 $this->context['head']['keywords'] = implode(
240 ', ',
241 //Use closure to extract each unique article keywords sorted
242 (function ($t) {
243 //Return array
244 $r = [];
245
246 //Iterate on articles
247 foreach($t as $a) {
248 //Non empty keywords
249 if (!empty($a['keywords'])) {
250 //Iterate on keywords
251 foreach($a['keywords'] as $k) {
252 //Set keyword
253 $r[$k['title']] = $k['title'];
254 }
255 }
256 }
257
258 //Sort array
259 sort($r);
260
261 //Return array
262 return $r;
263 })($this->context['articles'])
264 );
265
266 //Set title
267 $this->context['title']['page'] = $this->translator->trans('Home');
268
269 //Set description
270 $this->context['description'] = $this->translator->trans('Welcome to raphaël\'s developer diary');
271
272 //Render the view
273 return $this->render('@RapsysBlog/index.html.twig', $this->context, $response);
274 }
275 }