aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Wallabag/CoreBundle/Controller
diff options
context:
space:
mode:
Diffstat (limited to 'src/Wallabag/CoreBundle/Controller')
-rw-r--r--src/Wallabag/CoreBundle/Controller/ConfigController.php83
-rw-r--r--src/Wallabag/CoreBundle/Controller/DeveloperController.php100
-rw-r--r--src/Wallabag/CoreBundle/Controller/EntryController.php150
-rw-r--r--src/Wallabag/CoreBundle/Controller/ExceptionController.php40
-rw-r--r--src/Wallabag/CoreBundle/Controller/ExportController.php2
-rw-r--r--src/Wallabag/CoreBundle/Controller/FooterController.php27
-rw-r--r--src/Wallabag/CoreBundle/Controller/RssController.php2
-rw-r--r--src/Wallabag/CoreBundle/Controller/StaticController.php6
-rw-r--r--src/Wallabag/CoreBundle/Controller/TagController.php71
9 files changed, 278 insertions, 203 deletions
diff --git a/src/Wallabag/CoreBundle/Controller/ConfigController.php b/src/Wallabag/CoreBundle/Controller/ConfigController.php
index 4f75511b..91cdcae5 100644
--- a/src/Wallabag/CoreBundle/Controller/ConfigController.php
+++ b/src/Wallabag/CoreBundle/Controller/ConfigController.php
@@ -11,7 +11,6 @@ use Wallabag\CoreBundle\Entity\Config;
11use Wallabag\CoreBundle\Entity\TaggingRule; 11use Wallabag\CoreBundle\Entity\TaggingRule;
12use Wallabag\CoreBundle\Form\Type\ConfigType; 12use Wallabag\CoreBundle\Form\Type\ConfigType;
13use Wallabag\CoreBundle\Form\Type\ChangePasswordType; 13use Wallabag\CoreBundle\Form\Type\ChangePasswordType;
14use Wallabag\CoreBundle\Form\Type\NewUserType;
15use Wallabag\CoreBundle\Form\Type\RssType; 14use Wallabag\CoreBundle\Form\Type\RssType;
16use Wallabag\CoreBundle\Form\Type\TaggingRuleType; 15use Wallabag\CoreBundle\Form\Type\TaggingRuleType;
17use Wallabag\CoreBundle\Form\Type\UserInformationType; 16use Wallabag\CoreBundle\Form\Type\UserInformationType;
@@ -106,7 +105,21 @@ class ConfigController extends Controller
106 105
107 // handle tagging rule 106 // handle tagging rule
108 $taggingRule = new TaggingRule(); 107 $taggingRule = new TaggingRule();
109 $newTaggingRule = $this->createForm(TaggingRuleType::class, $taggingRule, ['action' => $this->generateUrl('config').'#set5']); 108 $action = $this->generateUrl('config').'#set5';
109
110 if ($request->query->has('tagging-rule')) {
111 $taggingRule = $this->getDoctrine()
112 ->getRepository('WallabagCoreBundle:TaggingRule')
113 ->find($request->query->get('tagging-rule'));
114
115 if ($this->getUser()->getId() !== $taggingRule->getConfig()->getUser()->getId()) {
116 return $this->redirect($action);
117 }
118
119 $action = $this->generateUrl('config').'?tagging-rule='.$taggingRule->getId().'#set5';
120 }
121
122 $newTaggingRule = $this->createForm(TaggingRuleType::class, $taggingRule, ['action' => $action]);
110 $newTaggingRule->handleRequest($request); 123 $newTaggingRule->handleRequest($request);
111 124
112 if ($newTaggingRule->isValid()) { 125 if ($newTaggingRule->isValid()) {
@@ -122,45 +135,12 @@ class ConfigController extends Controller
122 return $this->redirect($this->generateUrl('config').'#set5'); 135 return $this->redirect($this->generateUrl('config').'#set5');
123 } 136 }
124 137
125 // handle adding new user
126 $newUser = $userManager->createUser();
127 // enable created user by default
128 $newUser->setEnabled(true);
129 $newUserForm = $this->createForm(NewUserType::class, $newUser, [
130 'validation_groups' => ['Profile'],
131 'action' => $this->generateUrl('config').'#set6',
132 ]);
133 $newUserForm->handleRequest($request);
134
135 if ($newUserForm->isValid() && $this->get('security.authorization_checker')->isGranted('ROLE_SUPER_ADMIN')) {
136 $userManager->updateUser($newUser, true);
137
138 $config = new Config($newUser);
139 $config->setTheme($this->getParameter('wallabag_core.theme'));
140 $config->setItemsPerPage($this->getParameter('wallabag_core.items_on_page'));
141 $config->setRssLimit($this->getParameter('wallabag_core.rss_limit'));
142 $config->setLanguage($this->getParameter('wallabag_core.language'));
143 $config->setReadingSpeed($this->getParameter('wallabag_core.reading_speed'));
144
145 $em->persist($config);
146
147 $em->flush();
148
149 $this->get('session')->getFlashBag()->add(
150 'notice',
151 $this->get('translator')->trans('flashes.config.notice.user_added', ['%username%' => $newUser->getUsername()])
152 );
153
154 return $this->redirect($this->generateUrl('config').'#set6');
155 }
156
157 return $this->render('WallabagCoreBundle:Config:index.html.twig', [ 138 return $this->render('WallabagCoreBundle:Config:index.html.twig', [
158 'form' => [ 139 'form' => [
159 'config' => $configForm->createView(), 140 'config' => $configForm->createView(),
160 'rss' => $rssForm->createView(), 141 'rss' => $rssForm->createView(),
161 'pwd' => $pwdForm->createView(), 142 'pwd' => $pwdForm->createView(),
162 'user' => $userForm->createView(), 143 'user' => $userForm->createView(),
163 'new_user' => $newUserForm->createView(),
164 'new_tagging_rule' => $newTaggingRule->createView(), 144 'new_tagging_rule' => $newTaggingRule->createView(),
165 ], 145 ],
166 'rss' => [ 146 'rss' => [
@@ -210,9 +190,7 @@ class ConfigController extends Controller
210 */ 190 */
211 public function deleteTaggingRuleAction(TaggingRule $rule) 191 public function deleteTaggingRuleAction(TaggingRule $rule)
212 { 192 {
213 if ($this->getUser()->getId() != $rule->getConfig()->getUser()->getId()) { 193 $this->validateRuleAction($rule);
214 throw $this->createAccessDeniedException('You can not access this tagging rule.');
215 }
216 194
217 $em = $this->getDoctrine()->getManager(); 195 $em = $this->getDoctrine()->getManager();
218 $em->remove($rule); 196 $em->remove($rule);
@@ -227,6 +205,34 @@ class ConfigController extends Controller
227 } 205 }
228 206
229 /** 207 /**
208 * Edit a tagging rule.
209 *
210 * @param TaggingRule $rule
211 *
212 * @Route("/tagging-rule/edit/{id}", requirements={"id" = "\d+"}, name="edit_tagging_rule")
213 *
214 * @return RedirectResponse
215 */
216 public function editTaggingRuleAction(TaggingRule $rule)
217 {
218 $this->validateRuleAction($rule);
219
220 return $this->redirect($this->generateUrl('config').'?tagging-rule='.$rule->getId().'#set5');
221 }
222
223 /**
224 * Validate that a rule can be edited/deleted by the current user.
225 *
226 * @param TaggingRule $rule
227 */
228 private function validateRuleAction(TaggingRule $rule)
229 {
230 if ($this->getUser()->getId() != $rule->getConfig()->getUser()->getId()) {
231 throw $this->createAccessDeniedException('You can not access this tagging rule.');
232 }
233 }
234
235 /**
230 * Retrieve config for the current user. 236 * Retrieve config for the current user.
231 * If no config were found, create a new one. 237 * If no config were found, create a new one.
232 * 238 *
@@ -238,6 +244,7 @@ class ConfigController extends Controller
238 ->getRepository('WallabagCoreBundle:Config') 244 ->getRepository('WallabagCoreBundle:Config')
239 ->findOneByUser($this->getUser()); 245 ->findOneByUser($this->getUser());
240 246
247 // should NEVER HAPPEN ...
241 if (!$config) { 248 if (!$config) {
242 $config = new Config($this->getUser()); 249 $config = new Config($this->getUser());
243 } 250 }
diff --git a/src/Wallabag/CoreBundle/Controller/DeveloperController.php b/src/Wallabag/CoreBundle/Controller/DeveloperController.php
deleted file mode 100644
index d85ba5ee..00000000
--- a/src/Wallabag/CoreBundle/Controller/DeveloperController.php
+++ /dev/null
@@ -1,100 +0,0 @@
1<?php
2
3namespace Wallabag\CoreBundle\Controller;
4
5use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
6use Symfony\Component\HttpFoundation\Request;
7use Symfony\Bundle\FrameworkBundle\Controller\Controller;
8use Wallabag\ApiBundle\Entity\Client;
9use Wallabag\CoreBundle\Form\Type\ClientType;
10
11class DeveloperController extends Controller
12{
13 /**
14 * List all clients and link to create a new one.
15 *
16 * @Route("/developer", name="developer")
17 *
18 * @return \Symfony\Component\HttpFoundation\Response
19 */
20 public function indexAction()
21 {
22 $clients = $this->getDoctrine()->getRepository('WallabagApiBundle:Client')->findAll();
23
24 return $this->render('WallabagCoreBundle:Developer:index.html.twig', [
25 'clients' => $clients,
26 ]);
27 }
28
29 /**
30 * Create a client (an app).
31 *
32 * @param Request $request
33 *
34 * @Route("/developer/client/create", name="developer_create_client")
35 *
36 * @return \Symfony\Component\HttpFoundation\Response
37 */
38 public function createClientAction(Request $request)
39 {
40 $em = $this->getDoctrine()->getManager();
41 $client = new Client();
42 $clientForm = $this->createForm(ClientType::class, $client);
43 $clientForm->handleRequest($request);
44
45 if ($clientForm->isValid()) {
46 $client->setAllowedGrantTypes(['token', 'authorization_code', 'password', 'refresh_token']);
47 $em->persist($client);
48 $em->flush();
49
50 $this->get('session')->getFlashBag()->add(
51 'notice',
52 'flashes.developer.notice.client_created'
53 );
54
55 return $this->render('WallabagCoreBundle:Developer:client_parameters.html.twig', [
56 'client_id' => $client->getPublicId(),
57 'client_secret' => $client->getSecret(),
58 ]);
59 }
60
61 return $this->render('WallabagCoreBundle:Developer:client.html.twig', [
62 'form' => $clientForm->createView(),
63 ]);
64 }
65
66 /**
67 * Remove a client.
68 *
69 * @param Client $client
70 *
71 * @Route("/developer/client/delete/{id}", requirements={"id" = "\d+"}, name="developer_delete_client")
72 *
73 * @return \Symfony\Component\HttpFoundation\RedirectResponse
74 */
75 public function deleteClientAction(Client $client)
76 {
77 $em = $this->getDoctrine()->getManager();
78 $em->remove($client);
79 $em->flush();
80
81 $this->get('session')->getFlashBag()->add(
82 'notice',
83 'flashes.developer.notice.client_deleted'
84 );
85
86 return $this->redirect($this->generateUrl('developer'));
87 }
88
89 /**
90 * Display developer how to use an existing app.
91 *
92 * @Route("/developer/howto/first-app", name="developer_howto_firstapp")
93 *
94 * @return \Symfony\Component\HttpFoundation\Response
95 */
96 public function howtoFirstAppAction()
97 {
98 return $this->render('WallabagCoreBundle:Developer:howto_app.html.twig');
99 }
100}
diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php
index ccdf9406..3b28e635 100644
--- a/src/Wallabag/CoreBundle/Controller/EntryController.php
+++ b/src/Wallabag/CoreBundle/Controller/EntryController.php
@@ -4,7 +4,6 @@ namespace Wallabag\CoreBundle\Controller;
4 4
5use Pagerfanta\Adapter\DoctrineORMAdapter; 5use Pagerfanta\Adapter\DoctrineORMAdapter;
6use Pagerfanta\Exception\OutOfRangeCurrentPageException; 6use Pagerfanta\Exception\OutOfRangeCurrentPageException;
7use Pagerfanta\Pagerfanta;
8use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 7use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
9use Symfony\Bundle\FrameworkBundle\Controller\Controller; 8use Symfony\Bundle\FrameworkBundle\Controller\Controller;
10use Symfony\Component\HttpFoundation\Request; 9use Symfony\Component\HttpFoundation\Request;
@@ -13,30 +12,40 @@ use Wallabag\CoreBundle\Entity\Entry;
13use Wallabag\CoreBundle\Form\Type\EntryFilterType; 12use Wallabag\CoreBundle\Form\Type\EntryFilterType;
14use Wallabag\CoreBundle\Form\Type\EditEntryType; 13use Wallabag\CoreBundle\Form\Type\EditEntryType;
15use Wallabag\CoreBundle\Form\Type\NewEntryType; 14use Wallabag\CoreBundle\Form\Type\NewEntryType;
15use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
16 16
17class EntryController extends Controller 17class EntryController extends Controller
18{ 18{
19 /** 19 /**
20 * @param Entry $entry 20 * Fetch content and update entry.
21 * In case it fails, entry will return to avod loosing the data.
22 *
23 * @param Entry $entry
24 * @param string $prefixMessage Should be the translation key: entry_saved or entry_reloaded
25 *
26 * @return Entry
21 */ 27 */
22 private function updateEntry(Entry $entry) 28 private function updateEntry(Entry $entry, $prefixMessage = 'entry_saved')
23 { 29 {
30 // put default title in case of fetching content failed
31 $entry->setTitle('No title found');
32
33 $message = 'flashes.entry.notice.'.$prefixMessage;
34
24 try { 35 try {
25 $entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl()); 36 $entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl());
26
27 $em = $this->getDoctrine()->getManager();
28 $em->persist($entry);
29 $em->flush();
30 } catch (\Exception $e) { 37 } catch (\Exception $e) {
31 $this->get('logger')->error('Error while saving an entry', [ 38 $this->get('logger')->error('Error while saving an entry', [
32 'exception' => $e, 39 'exception' => $e,
33 'entry' => $entry, 40 'entry' => $entry,
34 ]); 41 ]);
35 42
36 return false; 43 $message = 'flashes.entry.notice.'.$prefixMessage.'_failed';
37 } 44 }
38 45
39 return true; 46 $this->get('session')->getFlashBag()->add('notice', $message);
47
48 return $entry;
40 } 49 }
41 50
42 /** 51 /**
@@ -66,12 +75,11 @@ class EntryController extends Controller
66 return $this->redirect($this->generateUrl('view', ['id' => $existingEntry->getId()])); 75 return $this->redirect($this->generateUrl('view', ['id' => $existingEntry->getId()]));
67 } 76 }
68 77
69 $message = 'flashes.entry.notice.entry_saved'; 78 $this->updateEntry($entry);
70 if (false === $this->updateEntry($entry)) {
71 $message = 'flashes.entry.notice.entry_saved_failed';
72 }
73 79
74 $this->get('session')->getFlashBag()->add('notice', $message); 80 $em = $this->getDoctrine()->getManager();
81 $em->persist($entry);
82 $em->flush();
75 83
76 return $this->redirect($this->generateUrl('homepage')); 84 return $this->redirect($this->generateUrl('homepage'));
77 } 85 }
@@ -95,6 +103,10 @@ class EntryController extends Controller
95 103
96 if (false === $this->checkIfEntryAlreadyExists($entry)) { 104 if (false === $this->checkIfEntryAlreadyExists($entry)) {
97 $this->updateEntry($entry); 105 $this->updateEntry($entry);
106
107 $em = $this->getDoctrine()->getManager();
108 $em->persist($entry);
109 $em->flush();
98 } 110 }
99 111
100 return $this->redirect($this->generateUrl('homepage')); 112 return $this->redirect($this->generateUrl('homepage'));
@@ -226,6 +238,10 @@ class EntryController extends Controller
226 $repository = $this->get('wallabag_core.entry_repository'); 238 $repository = $this->get('wallabag_core.entry_repository');
227 239
228 switch ($type) { 240 switch ($type) {
241 case 'untagged':
242 $qb = $repository->getBuilderForUntaggedByUser($this->getUser()->getId());
243
244 break;
229 case 'starred': 245 case 'starred':
230 $qb = $repository->getBuilderForStarredByUser($this->getUser()->getId()); 246 $qb = $repository->getBuilderForStarredByUser($this->getUser()->getId());
231 break; 247 break;
@@ -257,9 +273,10 @@ class EntryController extends Controller
257 } 273 }
258 274
259 $pagerAdapter = new DoctrineORMAdapter($qb->getQuery()); 275 $pagerAdapter = new DoctrineORMAdapter($qb->getQuery());
260 $entries = new Pagerfanta($pagerAdapter);
261 276
262 $entries->setMaxPerPage($this->getUser()->getConfig()->getItemsPerPage()); 277 $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')
278 ->prepare($pagerAdapter, $page);
279
263 try { 280 try {
264 $entries->setCurrentPage($page); 281 $entries->setCurrentPage($page);
265 } catch (OutOfRangeCurrentPageException $e) { 282 } catch (OutOfRangeCurrentPageException $e) {
@@ -311,15 +328,11 @@ class EntryController extends Controller
311 { 328 {
312 $this->checkUserAction($entry); 329 $this->checkUserAction($entry);
313 330
314 $message = 'flashes.entry.notice.entry_reloaded'; 331 $this->updateEntry($entry, 'entry_reloaded');
315 if (false === $this->updateEntry($entry)) {
316 $message = 'flashes.entry.notice.entry_reload_failed';
317 }
318 332
319 $this->get('session')->getFlashBag()->add( 333 $em = $this->getDoctrine()->getManager();
320 'notice', 334 $em->persist($entry);
321 $message 335 $em->flush();
322 );
323 336
324 return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()])); 337 return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()]));
325 } 338 }
@@ -434,7 +447,7 @@ class EntryController extends Controller
434 */ 447 */
435 private function checkUserAction(Entry $entry) 448 private function checkUserAction(Entry $entry)
436 { 449 {
437 if ($this->getUser()->getId() != $entry->getUser()->getId()) { 450 if (null === $this->getUser() || $this->getUser()->getId() != $entry->getUser()->getId()) {
438 throw $this->createAccessDeniedException('You can not access this entry.'); 451 throw $this->createAccessDeniedException('You can not access this entry.');
439 } 452 }
440 } 453 }
@@ -450,4 +463,91 @@ class EntryController extends Controller
450 { 463 {
451 return $this->get('wallabag_core.entry_repository')->findByUrlAndUserId($entry->getUrl(), $this->getUser()->getId()); 464 return $this->get('wallabag_core.entry_repository')->findByUrlAndUserId($entry->getUrl(), $this->getUser()->getId());
452 } 465 }
466
467 /**
468 * Get public URL for entry (and generate it if necessary).
469 *
470 * @param Entry $entry
471 *
472 * @Route("/share/{id}", requirements={"id" = "\d+"}, name="share")
473 *
474 * @return \Symfony\Component\HttpFoundation\Response
475 */
476 public function shareAction(Entry $entry)
477 {
478 $this->checkUserAction($entry);
479
480 if (null === $entry->getUuid()) {
481 $entry->generateUuid();
482
483 $em = $this->getDoctrine()->getManager();
484 $em->persist($entry);
485 $em->flush();
486 }
487
488 return $this->redirect($this->generateUrl('share_entry', [
489 'uuid' => $entry->getUuid(),
490 ]));
491 }
492
493 /**
494 * Disable public sharing for an entry.
495 *
496 * @param Entry $entry
497 *
498 * @Route("/share/delete/{id}", requirements={"id" = "\d+"}, name="delete_share")
499 *
500 * @return \Symfony\Component\HttpFoundation\Response
501 */
502 public function deleteShareAction(Entry $entry)
503 {
504 $this->checkUserAction($entry);
505
506 $entry->cleanUuid();
507
508 $em = $this->getDoctrine()->getManager();
509 $em->persist($entry);
510 $em->flush();
511
512 return $this->redirect($this->generateUrl('view', [
513 'id' => $entry->getId(),
514 ]));
515 }
516
517 /**
518 * Ability to view a content publicly.
519 *
520 * @param Entry $entry
521 *
522 * @Route("/share/{uuid}", requirements={"uuid" = ".+"}, name="share_entry")
523 * @Cache(maxage="25200", smaxage="25200", public=true)
524 *
525 * @return \Symfony\Component\HttpFoundation\Response
526 */
527 public function shareEntryAction(Entry $entry)
528 {
529 if (!$this->get('craue_config')->get('share_public')) {
530 throw $this->createAccessDeniedException('Sharing an entry is disabled for this user.');
531 }
532
533 return $this->render(
534 '@WallabagCore/themes/common/Entry/share.html.twig',
535 ['entry' => $entry]
536 );
537 }
538
539 /**
540 * Shows untagged articles for current user.
541 *
542 * @param Request $request
543 * @param int $page
544 *
545 * @Route("/untagged/list/{page}", name="untagged", defaults={"page" = "1"})
546 *
547 * @return \Symfony\Component\HttpFoundation\Response
548 */
549 public function showUntaggedEntriesAction(Request $request, $page)
550 {
551 return $this->showEntries('untagged', $request, $page);
552 }
453} 553}
diff --git a/src/Wallabag/CoreBundle/Controller/ExceptionController.php b/src/Wallabag/CoreBundle/Controller/ExceptionController.php
new file mode 100644
index 00000000..abfa9c2f
--- /dev/null
+++ b/src/Wallabag/CoreBundle/Controller/ExceptionController.php
@@ -0,0 +1,40 @@
1<?php
2
3namespace Wallabag\CoreBundle\Controller;
4
5use Symfony\Bundle\TwigBundle\Controller\ExceptionController as BaseExceptionController;
6use Symfony\Component\HttpFoundation\Request;
7
8/**
9 * This controller allow us to customize the error template.
10 * The only modified line from the parent template is for "WallabagCoreBundle".
11 */
12class ExceptionController extends BaseExceptionController
13{
14 protected function findTemplate(Request $request, $format, $code, $showException)
15 {
16 $name = $showException ? 'exception' : 'error';
17 if ($showException && 'html' == $format) {
18 $name = 'exception_full';
19 }
20
21 // For error pages, try to find a template for the specific HTTP status code and format
22 if (!$showException) {
23 $template = sprintf('WallabagCoreBundle:Exception:%s.%s.twig', $name, $format);
24 if ($this->templateExists($template)) {
25 return $template;
26 }
27 }
28
29 // try to find a template for the given format
30 $template = sprintf('@Twig/Exception/%s.%s.twig', $name, $format);
31 if ($this->templateExists($template)) {
32 return $template;
33 }
34
35 // default to a generic HTML exception
36 $request->setRequestFormat('html');
37
38 return sprintf('@Twig/Exception/%s.html.twig', $showException ? 'exception_full' : $name);
39 }
40}
diff --git a/src/Wallabag/CoreBundle/Controller/ExportController.php b/src/Wallabag/CoreBundle/Controller/ExportController.php
index 944c755d..6191d5d7 100644
--- a/src/Wallabag/CoreBundle/Controller/ExportController.php
+++ b/src/Wallabag/CoreBundle/Controller/ExportController.php
@@ -46,7 +46,7 @@ class ExportController extends Controller
46 * 46 *
47 * @Route("/export/{category}.{format}", name="export_entries", requirements={ 47 * @Route("/export/{category}.{format}", name="export_entries", requirements={
48 * "format": "epub|mobi|pdf|json|xml|txt|csv", 48 * "format": "epub|mobi|pdf|json|xml|txt|csv",
49 * "category": "all|unread|starred|archive" 49 * "category": "all|unread|starred|archive|tag_entries|untagged"
50 * }) 50 * })
51 * 51 *
52 * @return \Symfony\Component\HttpFoundation\Response 52 * @return \Symfony\Component\HttpFoundation\Response
diff --git a/src/Wallabag/CoreBundle/Controller/FooterController.php b/src/Wallabag/CoreBundle/Controller/FooterController.php
deleted file mode 100644
index fd93c436..00000000
--- a/src/Wallabag/CoreBundle/Controller/FooterController.php
+++ /dev/null
@@ -1,27 +0,0 @@
1<?php
2
3namespace Wallabag\CoreBundle\Controller;
4
5use Symfony\Bundle\FrameworkBundle\Controller\Controller;
6
7class FooterController extends Controller
8{
9 /**
10 * Display the footer.
11 *
12 * @return \Symfony\Component\HttpFoundation\Response
13 */
14 public function indexAction()
15 {
16 $addonsUrl = $this->container->getParameter('addons_url');
17 $socialsUrl = $this->container->getParameter('socials_url');
18
19 return $this->render(
20 'WallabagCoreBundle::footer.html.twig',
21 [
22 'addonsUrl' => $addonsUrl,
23 'socialsUrl' => $socialsUrl,
24 ]
25 );
26 }
27}
diff --git a/src/Wallabag/CoreBundle/Controller/RssController.php b/src/Wallabag/CoreBundle/Controller/RssController.php
index 2118885c..38e3b5a0 100644
--- a/src/Wallabag/CoreBundle/Controller/RssController.php
+++ b/src/Wallabag/CoreBundle/Controller/RssController.php
@@ -87,7 +87,7 @@ class RssController extends Controller
87 $perPage = $user->getConfig()->getRssLimit() ?: $this->getParameter('wallabag_core.rss_limit'); 87 $perPage = $user->getConfig()->getRssLimit() ?: $this->getParameter('wallabag_core.rss_limit');
88 $entries->setMaxPerPage($perPage); 88 $entries->setMaxPerPage($perPage);
89 89
90 return $this->render('WallabagCoreBundle:Entry:entries.xml.twig', [ 90 return $this->render('@WallabagCore/themes/common/Entry/entries.xml.twig', [
91 'type' => $type, 91 'type' => $type,
92 'entries' => $entries, 92 'entries' => $entries,
93 ]); 93 ]);
diff --git a/src/Wallabag/CoreBundle/Controller/StaticController.php b/src/Wallabag/CoreBundle/Controller/StaticController.php
index 2a57f06f..82714217 100644
--- a/src/Wallabag/CoreBundle/Controller/StaticController.php
+++ b/src/Wallabag/CoreBundle/Controller/StaticController.php
@@ -15,7 +15,7 @@ class StaticController extends Controller
15 $addonsUrl = $this->container->getParameter('addons_url'); 15 $addonsUrl = $this->container->getParameter('addons_url');
16 16
17 return $this->render( 17 return $this->render(
18 'WallabagCoreBundle:Static:howto.html.twig', 18 '@WallabagCore/themes/common/Static/howto.html.twig',
19 ['addonsUrl' => $addonsUrl] 19 ['addonsUrl' => $addonsUrl]
20 ); 20 );
21 } 21 }
@@ -26,7 +26,7 @@ class StaticController extends Controller
26 public function aboutAction() 26 public function aboutAction()
27 { 27 {
28 return $this->render( 28 return $this->render(
29 'WallabagCoreBundle:Static:about.html.twig', 29 '@WallabagCore/themes/common/Static/about.html.twig',
30 [ 30 [
31 'version' => $this->getParameter('wallabag_core.version'), 31 'version' => $this->getParameter('wallabag_core.version'),
32 'paypal_url' => $this->getParameter('wallabag_core.paypal_url'), 32 'paypal_url' => $this->getParameter('wallabag_core.paypal_url'),
@@ -40,7 +40,7 @@ class StaticController extends Controller
40 public function quickstartAction() 40 public function quickstartAction()
41 { 41 {
42 return $this->render( 42 return $this->render(
43 'WallabagCoreBundle:Static:quickstart.html.twig', 43 '@WallabagCore/themes/common/Static/quickstart.html.twig',
44 [] 44 []
45 ); 45 );
46 } 46 }
diff --git a/src/Wallabag/CoreBundle/Controller/TagController.php b/src/Wallabag/CoreBundle/Controller/TagController.php
index 8645fb44..5acc6852 100644
--- a/src/Wallabag/CoreBundle/Controller/TagController.php
+++ b/src/Wallabag/CoreBundle/Controller/TagController.php
@@ -2,12 +2,15 @@
2 2
3namespace Wallabag\CoreBundle\Controller; 3namespace Wallabag\CoreBundle\Controller;
4 4
5use Pagerfanta\Adapter\ArrayAdapter;
6use Pagerfanta\Exception\OutOfRangeCurrentPageException;
5use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 7use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
6use Symfony\Bundle\FrameworkBundle\Controller\Controller; 8use Symfony\Bundle\FrameworkBundle\Controller\Controller;
7use Symfony\Component\HttpFoundation\Request; 9use Symfony\Component\HttpFoundation\Request;
8use Wallabag\CoreBundle\Entity\Entry; 10use Wallabag\CoreBundle\Entity\Entry;
9use Wallabag\CoreBundle\Entity\Tag; 11use Wallabag\CoreBundle\Entity\Tag;
10use Wallabag\CoreBundle\Form\Type\NewTagType; 12use Wallabag\CoreBundle\Form\Type\NewTagType;
13use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
11 14
12class TagController extends Controller 15class TagController extends Controller
13{ 16{
@@ -60,10 +63,12 @@ class TagController extends Controller
60 $entry->removeTag($tag); 63 $entry->removeTag($tag);
61 $em = $this->getDoctrine()->getManager(); 64 $em = $this->getDoctrine()->getManager();
62 $em->flush(); 65 $em->flush();
63 if (count($tag->getEntries()) == 0) { 66
67 // remove orphan tag in case no entries are associated to it
68 if (count($tag->getEntries()) === 0) {
64 $em->remove($tag); 69 $em->remove($tag);
70 $em->flush();
65 } 71 }
66 $em->flush();
67 72
68 $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer')); 73 $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'));
69 74
@@ -83,11 +88,61 @@ class TagController extends Controller
83 ->getRepository('WallabagCoreBundle:Tag') 88 ->getRepository('WallabagCoreBundle:Tag')
84 ->findAllTags($this->getUser()->getId()); 89 ->findAllTags($this->getUser()->getId());
85 90
86 return $this->render( 91 $flatTags = [];
87 'WallabagCoreBundle:Tag:tags.html.twig', 92
88 [ 93 foreach ($tags as $key => $tag) {
89 'tags' => $tags, 94 $nbEntries = $this->getDoctrine()
90 ] 95 ->getRepository('WallabagCoreBundle:Entry')
91 ); 96 ->countAllEntriesByUserIdAndTagId($this->getUser()->getId(), $tag['id']);
97
98 $flatTags[] = [
99 'id' => $tag['id'],
100 'label' => $tag['label'],
101 'slug' => $tag['slug'],
102 'nbEntries' => $nbEntries,
103 ];
104 }
105
106 return $this->render('WallabagCoreBundle:Tag:tags.html.twig', [
107 'tags' => $flatTags,
108 ]);
109 }
110
111 /**
112 * @param Tag $tag
113 * @param int $page
114 *
115 * @Route("/tag/list/{slug}/{page}", name="tag_entries", defaults={"page" = "1"})
116 * @ParamConverter("tag", options={"mapping": {"slug": "slug"}})
117 *
118 * @return \Symfony\Component\HttpFoundation\Response
119 */
120 public function showEntriesForTagAction(Tag $tag, $page, Request $request)
121 {
122 $entriesByTag = $this->getDoctrine()
123 ->getRepository('WallabagCoreBundle:Entry')
124 ->findAllByTagId($this->getUser()->getId(), $tag->getId());
125
126 $pagerAdapter = new ArrayAdapter($entriesByTag);
127
128 $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')
129 ->prepare($pagerAdapter, $page);
130
131 try {
132 $entries->setCurrentPage($page);
133 } catch (OutOfRangeCurrentPageException $e) {
134 if ($page > 1) {
135 return $this->redirect($this->generateUrl($request->get('_route'), [
136 'slug' => $tag->getSlug(),
137 'page' => $entries->getNbPages(),
138 ]), 302);
139 }
140 }
141
142 return $this->render('WallabagCoreBundle:Entry:entries.html.twig', [
143 'form' => null,
144 'entries' => $entries,
145 'currentPage' => $page,
146 ]);
92 } 147 }
93} 148}