]> Raphaël G. Git Repositories - blogbundle/blob - Controller/DefaultController.php
Add about page
[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'] = $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'] = $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\BlogBundle\Form\ContactType', $data, [
103 'action' => $this->generateUrl('rapsys_blog_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 //Redirect on the same route with sent=1 to cleanup form
144 return $this->redirectToRoute($request->get('_route'), ['sent' => 1]+$request->get('_route_params'));
145 //Catch obvious transport exception
146 } catch(TransportExceptionInterface $e) {
147 if ($message = $e->getMessage()) {
148 //Add error message mail unreachable
149 $form->get('mail')->addError(new FormError($this->translator->trans('Unable to contact: %mail%: %message%', ['%mail%' => $this->config['contact']['mail'], '%message%' => $this->translator->trans($message)])));
150 } else {
151 //Add error message mail unreachable
152 $form->get('mail')->addError(new FormError($this->translator->trans('Unable to contact: %mail%', ['%mail%' => $this->config['contact']['mail']])));
153 }
154 }
155 }
156 //With logged user
157 } elseif ($this->checker->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
158 //Set last modified
159 $response->setLastModified(new \DateTime('-1 year'));
160
161 //Set as private
162 $response->setPrivate();
163 //Without logged user
164 } else {
165 //Set etag
166 //XXX: only for public to force revalidation by last modified
167 $response->setEtag(md5(serialize($this->context)));
168
169 //Set last modified
170 $response->setLastModified((new \DateTime)->setTimestamp(getlastmod()));
171
172 //Set as public
173 $response->setPublic();
174
175 //Without role and modification
176 if ($response->isNotModified($request)) {
177 //Return 304 response
178 return $response;
179 }
180 }
181
182 //Render template
183 return $this->render('@RapsysBlog/form/contact.html.twig', ['contact' => $form->createView(), 'sent' => $request->query->get('sent', 0)]+$this->context, $response);
184 }
185
186 /**
187 * The index page
188 *
189 * Display articles
190 *
191 * @param Request $request The request instance
192 * @return Response The rendered view
193 */
194 public function index(Request $request): Response {
195 //With not enough articles
196 if (($this->count = $this->doctrine->getRepository(Article::class)->findCountAsInt()) < $this->page * $this->limit) {
197 //Throw 404
198 throw $this->createNotFoundException($this->translator->trans('Unable to find articles'));
199 }
200
201 //Get articles
202 if ($this->context['articles'] = $this->doctrine->getRepository(Article::class)->findAllAsArray($this->page, $this->limit)) {
203 //Set modified
204 $this->modified = max(array_map(function ($v) { return $v['modified']; }, $this->context['articles']));
205 //Without keywords
206 } else {
207 //Set empty modified
208 $this->modified = new \DateTime('-1 year');
209 }
210
211 //Create response
212 $response = new Response();
213
214 //With logged user
215 if ($this->checker->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
216 //Set last modified
217 $response->setLastModified(new \DateTime('-1 year'));
218
219 //Set as private
220 $response->setPrivate();
221 //Without logged user
222 } else {
223 //Set etag
224 //XXX: only for public to force revalidation by last modified
225 $response->setEtag(md5(serialize($this->context['articles'])));
226
227 //Set last modified
228 $response->setLastModified($this->modified);
229
230 //Set as public
231 $response->setPublic();
232
233 //Without role and modification
234 if ($response->isNotModified($request)) {
235 //Return 304 response
236 return $response;
237 }
238 }
239
240 //Set keywords
241 $this->context['head']['keywords'] = implode(
242 ', ',
243 //Use closure to extract each unique article keywords sorted
244 (function ($t) {
245 //Return array
246 $r = [];
247
248 //Iterate on articles
249 foreach($t as $a) {
250 //Non empty keywords
251 if (!empty($a['keywords'])) {
252 //Iterate on keywords
253 foreach($a['keywords'] as $k) {
254 //Set keyword
255 $r[$k['title']] = $k['title'];
256 }
257 }
258 }
259
260 //Sort array
261 sort($r);
262
263 //Return array
264 return $r;
265 })($this->context['articles'])
266 );
267
268 //Set title
269 $this->context['title'] = $this->translator->trans('Home');
270
271 //Set description
272 $this->context['description'] = $this->translator->trans('Welcome to raphaël\'s developer diary');
273
274 //Render the view
275 return $this->render('@RapsysBlog/index.html.twig', $this->context, $response);
276 }
277 }