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.php141
-rw-r--r--src/Wallabag/CoreBundle/Controller/EntryController.php73
-rw-r--r--src/Wallabag/CoreBundle/Controller/ExportController.php2
-rw-r--r--src/Wallabag/CoreBundle/Controller/RssController.php38
-rw-r--r--src/Wallabag/CoreBundle/Controller/TagController.php14
5 files changed, 237 insertions, 31 deletions
diff --git a/src/Wallabag/CoreBundle/Controller/ConfigController.php b/src/Wallabag/CoreBundle/Controller/ConfigController.php
index 46fb9503..907bf78e 100644
--- a/src/Wallabag/CoreBundle/Controller/ConfigController.php
+++ b/src/Wallabag/CoreBundle/Controller/ConfigController.php
@@ -7,6 +7,7 @@ use Symfony\Bundle\FrameworkBundle\Controller\Controller;
7use Symfony\Component\HttpFoundation\JsonResponse; 7use Symfony\Component\HttpFoundation\JsonResponse;
8use Symfony\Component\HttpFoundation\RedirectResponse; 8use Symfony\Component\HttpFoundation\RedirectResponse;
9use Symfony\Component\HttpFoundation\Request; 9use Symfony\Component\HttpFoundation\Request;
10use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
10use Wallabag\CoreBundle\Entity\Config; 11use Wallabag\CoreBundle\Entity\Config;
11use Wallabag\CoreBundle\Entity\TaggingRule; 12use Wallabag\CoreBundle\Entity\TaggingRule;
12use Wallabag\CoreBundle\Form\Type\ConfigType; 13use Wallabag\CoreBundle\Form\Type\ConfigType;
@@ -34,7 +35,7 @@ class ConfigController extends Controller
34 $configForm = $this->createForm(ConfigType::class, $config, ['action' => $this->generateUrl('config')]); 35 $configForm = $this->createForm(ConfigType::class, $config, ['action' => $this->generateUrl('config')]);
35 $configForm->handleRequest($request); 36 $configForm->handleRequest($request);
36 37
37 if ($configForm->isValid()) { 38 if ($configForm->isSubmitted() && $configForm->isValid()) {
38 $em->persist($config); 39 $em->persist($config);
39 $em->flush(); 40 $em->flush();
40 41
@@ -56,7 +57,7 @@ class ConfigController extends Controller
56 $pwdForm = $this->createForm(ChangePasswordType::class, null, ['action' => $this->generateUrl('config').'#set4']); 57 $pwdForm = $this->createForm(ChangePasswordType::class, null, ['action' => $this->generateUrl('config').'#set4']);
57 $pwdForm->handleRequest($request); 58 $pwdForm->handleRequest($request);
58 59
59 if ($pwdForm->isValid()) { 60 if ($pwdForm->isSubmitted() && $pwdForm->isValid()) {
60 if ($this->get('craue_config')->get('demo_mode_enabled') && $this->get('craue_config')->get('demo_mode_username') === $user->getUsername()) { 61 if ($this->get('craue_config')->get('demo_mode_enabled') && $this->get('craue_config')->get('demo_mode_username') === $user->getUsername()) {
61 $message = 'flashes.config.notice.password_not_updated_demo'; 62 $message = 'flashes.config.notice.password_not_updated_demo';
62 } else { 63 } else {
@@ -78,7 +79,7 @@ class ConfigController extends Controller
78 ]); 79 ]);
79 $userForm->handleRequest($request); 80 $userForm->handleRequest($request);
80 81
81 if ($userForm->isValid()) { 82 if ($userForm->isSubmitted() && $userForm->isValid()) {
82 $userManager->updateUser($user, true); 83 $userManager->updateUser($user, true);
83 84
84 $this->get('session')->getFlashBag()->add( 85 $this->get('session')->getFlashBag()->add(
@@ -93,7 +94,7 @@ class ConfigController extends Controller
93 $rssForm = $this->createForm(RssType::class, $config, ['action' => $this->generateUrl('config').'#set2']); 94 $rssForm = $this->createForm(RssType::class, $config, ['action' => $this->generateUrl('config').'#set2']);
94 $rssForm->handleRequest($request); 95 $rssForm->handleRequest($request);
95 96
96 if ($rssForm->isValid()) { 97 if ($rssForm->isSubmitted() && $rssForm->isValid()) {
97 $em->persist($config); 98 $em->persist($config);
98 $em->flush(); 99 $em->flush();
99 100
@@ -124,7 +125,7 @@ class ConfigController extends Controller
124 $newTaggingRule = $this->createForm(TaggingRuleType::class, $taggingRule, ['action' => $action]); 125 $newTaggingRule = $this->createForm(TaggingRuleType::class, $taggingRule, ['action' => $action]);
125 $newTaggingRule->handleRequest($request); 126 $newTaggingRule->handleRequest($request);
126 127
127 if ($newTaggingRule->isValid()) { 128 if ($newTaggingRule->isSubmitted() && $newTaggingRule->isValid()) {
128 $taggingRule->setConfig($config); 129 $taggingRule->setConfig($config);
129 $em->persist($taggingRule); 130 $em->persist($taggingRule);
130 $em->flush(); 131 $em->flush();
@@ -150,6 +151,10 @@ class ConfigController extends Controller
150 'token' => $config->getRssToken(), 151 'token' => $config->getRssToken(),
151 ], 152 ],
152 'twofactor_auth' => $this->getParameter('twofactor_auth'), 153 'twofactor_auth' => $this->getParameter('twofactor_auth'),
154 'wallabag_url' => $this->get('craue_config')->get('wallabag_url'),
155 'enabled_users' => $this->getDoctrine()
156 ->getRepository('WallabagUserBundle:User')
157 ->getSumEnabledUsers(),
153 ]); 158 ]);
154 } 159 }
155 160
@@ -223,6 +228,78 @@ class ConfigController extends Controller
223 } 228 }
224 229
225 /** 230 /**
231 * Remove all annotations OR tags OR entries for the current user.
232 *
233 * @Route("/reset/{type}", requirements={"id" = "annotations|tags|entries"}, name="config_reset")
234 *
235 * @return RedirectResponse
236 */
237 public function resetAction($type)
238 {
239 switch ($type) {
240 case 'annotations':
241 $this->getDoctrine()
242 ->getRepository('WallabagAnnotationBundle:Annotation')
243 ->removeAllByUserId($this->getUser()->getId());
244 break;
245
246 case 'tags':
247 $this->removeAllTagsByUserId($this->getUser()->getId());
248 break;
249
250 case 'entries':
251 // SQLite doesn't care about cascading remove, so we need to manually remove associated stuf
252 // otherwise they won't be removed ...
253 if ($this->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver) {
254 $this->getDoctrine()->getRepository('WallabagAnnotationBundle:Annotation')->removeAllByUserId($this->getUser()->getId());
255 }
256
257 // manually remove tags to avoid orphan tag
258 $this->removeAllTagsByUserId($this->getUser()->getId());
259
260 $this->getDoctrine()
261 ->getRepository('WallabagCoreBundle:Entry')
262 ->removeAllByUserId($this->getUser()->getId());
263 }
264
265 $this->get('session')->getFlashBag()->add(
266 'notice',
267 'flashes.config.notice.'.$type.'_reset'
268 );
269
270 return $this->redirect($this->generateUrl('config').'#set3');
271 }
272
273 /**
274 * Remove all tags for a given user and cleanup orphan tags.
275 *
276 * @param int $userId
277 */
278 private function removeAllTagsByUserId($userId)
279 {
280 $tags = $this->getDoctrine()->getRepository('WallabagCoreBundle:Tag')->findAllTags($userId);
281
282 if (empty($tags)) {
283 return;
284 }
285
286 $this->getDoctrine()
287 ->getRepository('WallabagCoreBundle:Entry')
288 ->removeTags($userId, $tags);
289
290 // cleanup orphan tags
291 $em = $this->getDoctrine()->getManager();
292
293 foreach ($tags as $tag) {
294 if (count($tag->getEntries()) === 0) {
295 $em->remove($tag);
296 }
297 }
298
299 $em->flush();
300 }
301
302 /**
226 * Validate that a rule can be edited/deleted by the current user. 303 * Validate that a rule can be edited/deleted by the current user.
227 * 304 *
228 * @param TaggingRule $rule 305 * @param TaggingRule $rule
@@ -253,4 +330,58 @@ class ConfigController extends Controller
253 330
254 return $config; 331 return $config;
255 } 332 }
333
334 /**
335 * Delete account for current user.
336 *
337 * @Route("/account/delete", name="delete_account")
338 *
339 * @param Request $request
340 *
341 * @throws AccessDeniedHttpException
342 *
343 * @return \Symfony\Component\HttpFoundation\RedirectResponse
344 */
345 public function deleteAccountAction(Request $request)
346 {
347 $enabledUsers = $this->getDoctrine()
348 ->getRepository('WallabagUserBundle:User')
349 ->getSumEnabledUsers();
350
351 if ($enabledUsers <= 1) {
352 throw new AccessDeniedHttpException();
353 }
354
355 $user = $this->getUser();
356
357 // logout current user
358 $this->get('security.token_storage')->setToken(null);
359 $request->getSession()->invalidate();
360
361 $em = $this->get('fos_user.user_manager');
362 $em->deleteUser($user);
363
364 return $this->redirect($this->generateUrl('fos_user_security_login'));
365 }
366
367 /**
368 * Switch view mode for current user.
369 *
370 * @Route("/config/view-mode", name="switch_view_mode")
371 *
372 * @param Request $request
373 *
374 * @return \Symfony\Component\HttpFoundation\RedirectResponse
375 */
376 public function changeViewModeAction(Request $request)
377 {
378 $user = $this->getUser();
379 $user->getConfig()->setListMode(!$user->getConfig()->getListMode());
380
381 $em = $this->getDoctrine()->getManager();
382 $em->persist($user);
383 $em->flush();
384
385 return $this->redirect($request->headers->get('referer'));
386 }
256} 387}
diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php
index 97bb3d12..f7398e69 100644
--- a/src/Wallabag/CoreBundle/Controller/EntryController.php
+++ b/src/Wallabag/CoreBundle/Controller/EntryController.php
@@ -13,10 +13,45 @@ use Wallabag\CoreBundle\Form\Type\EntryFilterType;
13use Wallabag\CoreBundle\Form\Type\EditEntryType; 13use Wallabag\CoreBundle\Form\Type\EditEntryType;
14use Wallabag\CoreBundle\Form\Type\NewEntryType; 14use Wallabag\CoreBundle\Form\Type\NewEntryType;
15use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; 15use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
16use Wallabag\CoreBundle\Event\EntrySavedEvent;
17use Wallabag\CoreBundle\Event\EntryDeletedEvent;
18use Wallabag\CoreBundle\Form\Type\SearchEntryType;
16 19
17class EntryController extends Controller 20class EntryController extends Controller
18{ 21{
19 /** 22 /**
23 * @param Request $request
24 * @param int $page
25 *
26 * @Route("/search/{page}", name="search", defaults={"page" = 1})
27 *
28 * Default parameter for page is hardcoded (in duplication of the defaults from the Route)
29 * because this controller is also called inside the layout template without any page as argument
30 *
31 * @return \Symfony\Component\HttpFoundation\Response
32 */
33 public function searchFormAction(Request $request, $page = 1, $currentRoute = null)
34 {
35 // fallback to retrieve currentRoute from query parameter instead of injected one (when using inside a template)
36 if (null === $currentRoute && $request->query->has('currentRoute')) {
37 $currentRoute = $request->query->get('currentRoute');
38 }
39
40 $form = $this->createForm(SearchEntryType::class);
41
42 $form->handleRequest($request);
43
44 if ($form->isSubmitted() && $form->isValid()) {
45 return $this->showEntries('search', $request, $page);
46 }
47
48 return $this->render('WallabagCoreBundle:Entry:search_form.html.twig', [
49 'form' => $form->createView(),
50 'currentRoute' => $currentRoute,
51 ]);
52 }
53
54 /**
20 * Fetch content and update entry. 55 * Fetch content and update entry.
21 * In case it fails, entry will return to avod loosing the data. 56 * In case it fails, entry will return to avod loosing the data.
22 * 57 *
@@ -63,7 +98,7 @@ class EntryController extends Controller
63 98
64 $form->handleRequest($request); 99 $form->handleRequest($request);
65 100
66 if ($form->isValid()) { 101 if ($form->isSubmitted() && $form->isValid()) {
67 $existingEntry = $this->checkIfEntryAlreadyExists($entry); 102 $existingEntry = $this->checkIfEntryAlreadyExists($entry);
68 103
69 if (false !== $existingEntry) { 104 if (false !== $existingEntry) {
@@ -81,6 +116,9 @@ class EntryController extends Controller
81 $em->persist($entry); 116 $em->persist($entry);
82 $em->flush(); 117 $em->flush();
83 118
119 // entry saved, dispatch event about it!
120 $this->get('event_dispatcher')->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry));
121
84 return $this->redirect($this->generateUrl('homepage')); 122 return $this->redirect($this->generateUrl('homepage'));
85 } 123 }
86 124
@@ -107,6 +145,9 @@ class EntryController extends Controller
107 $em = $this->getDoctrine()->getManager(); 145 $em = $this->getDoctrine()->getManager();
108 $em->persist($entry); 146 $em->persist($entry);
109 $em->flush(); 147 $em->flush();
148
149 // entry saved, dispatch event about it!
150 $this->get('event_dispatcher')->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry));
110 } 151 }
111 152
112 return $this->redirect($this->generateUrl('homepage')); 153 return $this->redirect($this->generateUrl('homepage'));
@@ -140,7 +181,7 @@ class EntryController extends Controller
140 181
141 $form->handleRequest($request); 182 $form->handleRequest($request);
142 183
143 if ($form->isValid()) { 184 if ($form->isSubmitted() && $form->isValid()) {
144 $em = $this->getDoctrine()->getManager(); 185 $em = $this->getDoctrine()->getManager();
145 $em->persist($entry); 186 $em->persist($entry);
146 $em->flush(); 187 $em->flush();
@@ -236,8 +277,14 @@ class EntryController extends Controller
236 private function showEntries($type, Request $request, $page) 277 private function showEntries($type, Request $request, $page)
237 { 278 {
238 $repository = $this->get('wallabag_core.entry_repository'); 279 $repository = $this->get('wallabag_core.entry_repository');
280 $searchTerm = (isset($request->get('search_entry')['term']) ? $request->get('search_entry')['term'] : '');
281 $currentRoute = (!is_null($request->query->get('currentRoute')) ? $request->query->get('currentRoute') : '');
239 282
240 switch ($type) { 283 switch ($type) {
284 case 'search':
285 $qb = $repository->getBuilderForSearchByUser($this->getUser()->getId(), $searchTerm, $currentRoute);
286
287 break;
241 case 'untagged': 288 case 'untagged':
242 $qb = $repository->getBuilderForUntaggedByUser($this->getUser()->getId()); 289 $qb = $repository->getBuilderForUntaggedByUser($this->getUser()->getId());
243 290
@@ -272,7 +319,7 @@ class EntryController extends Controller
272 $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form, $qb); 319 $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form, $qb);
273 } 320 }
274 321
275 $pagerAdapter = new DoctrineORMAdapter($qb->getQuery()); 322 $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false);
276 323
277 $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries') 324 $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')
278 ->prepare($pagerAdapter, $page); 325 ->prepare($pagerAdapter, $page);
@@ -286,11 +333,11 @@ class EntryController extends Controller
286 } 333 }
287 334
288 return $this->render( 335 return $this->render(
289 'WallabagCoreBundle:Entry:entries.html.twig', 336 'WallabagCoreBundle:Entry:entries.html.twig', [
290 [
291 'form' => $form->createView(), 337 'form' => $form->createView(),
292 'entries' => $entries, 338 'entries' => $entries,
293 'currentPage' => $page, 339 'currentPage' => $page,
340 'searchTerm' => $searchTerm,
294 ] 341 ]
295 ); 342 );
296 } 343 }
@@ -343,6 +390,9 @@ class EntryController extends Controller
343 $em->persist($entry); 390 $em->persist($entry);
344 $em->flush(); 391 $em->flush();
345 392
393 // entry saved, dispatch event about it!
394 $this->get('event_dispatcher')->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry));
395
346 return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()])); 396 return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()]));
347 } 397 }
348 398
@@ -431,6 +481,9 @@ class EntryController extends Controller
431 UrlGeneratorInterface::ABSOLUTE_PATH 481 UrlGeneratorInterface::ABSOLUTE_PATH
432 ); 482 );
433 483
484 // entry deleted, dispatch event about it!
485 $this->get('event_dispatcher')->dispatch(EntryDeletedEvent::NAME, new EntryDeletedEvent($entry));
486
434 $em = $this->getDoctrine()->getManager(); 487 $em = $this->getDoctrine()->getManager();
435 $em->remove($entry); 488 $em->remove($entry);
436 $em->flush(); 489 $em->flush();
@@ -486,8 +539,8 @@ class EntryController extends Controller
486 { 539 {
487 $this->checkUserAction($entry); 540 $this->checkUserAction($entry);
488 541
489 if (null === $entry->getUuid()) { 542 if (null === $entry->getUid()) {
490 $entry->generateUuid(); 543 $entry->generateUid();
491 544
492 $em = $this->getDoctrine()->getManager(); 545 $em = $this->getDoctrine()->getManager();
493 $em->persist($entry); 546 $em->persist($entry);
@@ -495,7 +548,7 @@ class EntryController extends Controller
495 } 548 }
496 549
497 return $this->redirect($this->generateUrl('share_entry', [ 550 return $this->redirect($this->generateUrl('share_entry', [
498 'uuid' => $entry->getUuid(), 551 'uid' => $entry->getUid(),
499 ])); 552 ]));
500 } 553 }
501 554
@@ -512,7 +565,7 @@ class EntryController extends Controller
512 { 565 {
513 $this->checkUserAction($entry); 566 $this->checkUserAction($entry);
514 567
515 $entry->cleanUuid(); 568 $entry->cleanUid();
516 569
517 $em = $this->getDoctrine()->getManager(); 570 $em = $this->getDoctrine()->getManager();
518 $em->persist($entry); 571 $em->persist($entry);
@@ -528,7 +581,7 @@ class EntryController extends Controller
528 * 581 *
529 * @param Entry $entry 582 * @param Entry $entry
530 * 583 *
531 * @Route("/share/{uuid}", requirements={"uuid" = ".+"}, name="share_entry") 584 * @Route("/share/{uid}", requirements={"uid" = ".+"}, name="share_entry")
532 * @Cache(maxage="25200", smaxage="25200", public=true) 585 * @Cache(maxage="25200", smaxage="25200", public=true)
533 * 586 *
534 * @return \Symfony\Component\HttpFoundation\Response 587 * @return \Symfony\Component\HttpFoundation\Response
diff --git a/src/Wallabag/CoreBundle/Controller/ExportController.php b/src/Wallabag/CoreBundle/Controller/ExportController.php
index 79653cfe..abc3336a 100644
--- a/src/Wallabag/CoreBundle/Controller/ExportController.php
+++ b/src/Wallabag/CoreBundle/Controller/ExportController.php
@@ -48,7 +48,7 @@ class ExportController extends Controller
48 * 48 *
49 * @Route("/export/{category}.{format}", name="export_entries", requirements={ 49 * @Route("/export/{category}.{format}", name="export_entries", requirements={
50 * "format": "epub|mobi|pdf|json|xml|txt|csv", 50 * "format": "epub|mobi|pdf|json|xml|txt|csv",
51 * "category": "all|unread|starred|archive|tag_entries|untagged" 51 * "category": "all|unread|starred|archive|tag_entries|untagged|search"
52 * }) 52 * })
53 * 53 *
54 * @return \Symfony\Component\HttpFoundation\Response 54 * @return \Symfony\Component\HttpFoundation\Response
diff --git a/src/Wallabag/CoreBundle/Controller/RssController.php b/src/Wallabag/CoreBundle/Controller/RssController.php
index 38e3b5a0..92f18707 100644
--- a/src/Wallabag/CoreBundle/Controller/RssController.php
+++ b/src/Wallabag/CoreBundle/Controller/RssController.php
@@ -3,12 +3,15 @@
3namespace Wallabag\CoreBundle\Controller; 3namespace Wallabag\CoreBundle\Controller;
4 4
5use Pagerfanta\Adapter\DoctrineORMAdapter; 5use Pagerfanta\Adapter\DoctrineORMAdapter;
6use Pagerfanta\Exception\OutOfRangeCurrentPageException;
6use Pagerfanta\Pagerfanta; 7use Pagerfanta\Pagerfanta;
7use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; 8use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
8use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 9use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
10use Symfony\Component\HttpFoundation\Request;
9use Symfony\Bundle\FrameworkBundle\Controller\Controller; 11use Symfony\Bundle\FrameworkBundle\Controller\Controller;
10use Wallabag\CoreBundle\Entity\Entry; 12use Wallabag\CoreBundle\Entity\Entry;
11use Wallabag\UserBundle\Entity\User; 13use Wallabag\UserBundle\Entity\User;
14use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
12 15
13class RssController extends Controller 16class RssController extends Controller
14{ 17{
@@ -20,9 +23,9 @@ class RssController extends Controller
20 * 23 *
21 * @return \Symfony\Component\HttpFoundation\Response 24 * @return \Symfony\Component\HttpFoundation\Response
22 */ 25 */
23 public function showUnreadAction(User $user) 26 public function showUnreadAction(Request $request, User $user)
24 { 27 {
25 return $this->showEntries('unread', $user); 28 return $this->showEntries('unread', $user, $request->query->get('page', 1));
26 } 29 }
27 30
28 /** 31 /**
@@ -33,9 +36,9 @@ class RssController extends Controller
33 * 36 *
34 * @return \Symfony\Component\HttpFoundation\Response 37 * @return \Symfony\Component\HttpFoundation\Response
35 */ 38 */
36 public function showArchiveAction(User $user) 39 public function showArchiveAction(Request $request, User $user)
37 { 40 {
38 return $this->showEntries('archive', $user); 41 return $this->showEntries('archive', $user, $request->query->get('page', 1));
39 } 42 }
40 43
41 /** 44 /**
@@ -46,9 +49,9 @@ class RssController extends Controller
46 * 49 *
47 * @return \Symfony\Component\HttpFoundation\Response 50 * @return \Symfony\Component\HttpFoundation\Response
48 */ 51 */
49 public function showStarredAction(User $user) 52 public function showStarredAction(Request $request, User $user)
50 { 53 {
51 return $this->showEntries('starred', $user); 54 return $this->showEntries('starred', $user, $request->query->get('page', 1));
52 } 55 }
53 56
54 /** 57 /**
@@ -57,10 +60,11 @@ class RssController extends Controller
57 * 60 *
58 * @param string $type Entries type: unread, starred or archive 61 * @param string $type Entries type: unread, starred or archive
59 * @param User $user 62 * @param User $user
63 * @param int $page
60 * 64 *
61 * @return \Symfony\Component\HttpFoundation\Response 65 * @return \Symfony\Component\HttpFoundation\Response
62 */ 66 */
63 private function showEntries($type, User $user) 67 private function showEntries($type, User $user, $page = 1)
64 { 68 {
65 $repository = $this->getDoctrine()->getRepository('WallabagCoreBundle:Entry'); 69 $repository = $this->getDoctrine()->getRepository('WallabagCoreBundle:Entry');
66 70
@@ -81,14 +85,32 @@ class RssController extends Controller
81 throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type)); 85 throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type));
82 } 86 }
83 87
84 $pagerAdapter = new DoctrineORMAdapter($qb->getQuery()); 88 $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false);
85 $entries = new Pagerfanta($pagerAdapter); 89 $entries = new Pagerfanta($pagerAdapter);
86 90
87 $perPage = $user->getConfig()->getRssLimit() ?: $this->getParameter('wallabag_core.rss_limit'); 91 $perPage = $user->getConfig()->getRssLimit() ?: $this->getParameter('wallabag_core.rss_limit');
88 $entries->setMaxPerPage($perPage); 92 $entries->setMaxPerPage($perPage);
89 93
94 $url = $this->generateUrl(
95 $type.'_rss',
96 [
97 'username' => $user->getUsername(),
98 'token' => $user->getConfig()->getRssToken(),
99 ],
100 UrlGeneratorInterface::ABSOLUTE_URL
101 );
102
103 try {
104 $entries->setCurrentPage((int) $page);
105 } catch (OutOfRangeCurrentPageException $e) {
106 if ($page > 1) {
107 return $this->redirect($url.'?page='.$entries->getNbPages(), 302);
108 }
109 }
110
90 return $this->render('@WallabagCore/themes/common/Entry/entries.xml.twig', [ 111 return $this->render('@WallabagCore/themes/common/Entry/entries.xml.twig', [
91 'type' => $type, 112 'type' => $type,
113 'url' => $url,
92 'entries' => $entries, 114 'entries' => $entries,
93 ]); 115 ]);
94 } 116 }
diff --git a/src/Wallabag/CoreBundle/Controller/TagController.php b/src/Wallabag/CoreBundle/Controller/TagController.php
index 707f3bbe..8a093289 100644
--- a/src/Wallabag/CoreBundle/Controller/TagController.php
+++ b/src/Wallabag/CoreBundle/Controller/TagController.php
@@ -27,7 +27,7 @@ class TagController extends Controller
27 $form = $this->createForm(NewTagType::class, new Tag()); 27 $form = $this->createForm(NewTagType::class, new Tag());
28 $form->handleRequest($request); 28 $form->handleRequest($request);
29 29
30 if ($form->isValid()) { 30 if ($form->isSubmitted() && $form->isValid()) {
31 $this->get('wallabag_core.content_proxy')->assignTagsToEntry( 31 $this->get('wallabag_core.content_proxy')->assignTagsToEntry(
32 $entry, 32 $entry,
33 $form->get('label')->getData() 33 $form->get('label')->getData()
@@ -90,15 +90,15 @@ class TagController extends Controller
90 90
91 $flatTags = []; 91 $flatTags = [];
92 92
93 foreach ($tags as $key => $tag) { 93 foreach ($tags as $tag) {
94 $nbEntries = $this->getDoctrine() 94 $nbEntries = $this->getDoctrine()
95 ->getRepository('WallabagCoreBundle:Entry') 95 ->getRepository('WallabagCoreBundle:Entry')
96 ->countAllEntriesByUserIdAndTagId($this->getUser()->getId(), $tag['id']); 96 ->countAllEntriesByUserIdAndTagId($this->getUser()->getId(), $tag->getId());
97 97
98 $flatTags[] = [ 98 $flatTags[] = [
99 'id' => $tag['id'], 99 'id' => $tag->getId(),
100 'label' => $tag['label'], 100 'label' => $tag->getLabel(),
101 'slug' => $tag['slug'], 101 'slug' => $tag->getSlug(),
102 'nbEntries' => $nbEntries, 102 'nbEntries' => $nbEntries,
103 ]; 103 ];
104 } 104 }
@@ -143,7 +143,7 @@ class TagController extends Controller
143 'form' => null, 143 'form' => null,
144 'entries' => $entries, 144 'entries' => $entries,
145 'currentPage' => $page, 145 'currentPage' => $page,
146 'tag' => $tag->getLabel(), 146 'tag' => $tag->getSlug(),
147 ]); 147 ]);
148 } 148 }
149} 149}