diff options
Diffstat (limited to 'src/Wallabag/CoreBundle/Controller')
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; | |||
7 | use Symfony\Component\HttpFoundation\JsonResponse; | 7 | use Symfony\Component\HttpFoundation\JsonResponse; |
8 | use Symfony\Component\HttpFoundation\RedirectResponse; | 8 | use Symfony\Component\HttpFoundation\RedirectResponse; |
9 | use Symfony\Component\HttpFoundation\Request; | 9 | use Symfony\Component\HttpFoundation\Request; |
10 | use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; | ||
10 | use Wallabag\CoreBundle\Entity\Config; | 11 | use Wallabag\CoreBundle\Entity\Config; |
11 | use Wallabag\CoreBundle\Entity\TaggingRule; | 12 | use Wallabag\CoreBundle\Entity\TaggingRule; |
12 | use Wallabag\CoreBundle\Form\Type\ConfigType; | 13 | use 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; | |||
13 | use Wallabag\CoreBundle\Form\Type\EditEntryType; | 13 | use Wallabag\CoreBundle\Form\Type\EditEntryType; |
14 | use Wallabag\CoreBundle\Form\Type\NewEntryType; | 14 | use Wallabag\CoreBundle\Form\Type\NewEntryType; |
15 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; | 15 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; |
16 | use Wallabag\CoreBundle\Event\EntrySavedEvent; | ||
17 | use Wallabag\CoreBundle\Event\EntryDeletedEvent; | ||
18 | use Wallabag\CoreBundle\Form\Type\SearchEntryType; | ||
16 | 19 | ||
17 | class EntryController extends Controller | 20 | class 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 @@ | |||
3 | namespace Wallabag\CoreBundle\Controller; | 3 | namespace Wallabag\CoreBundle\Controller; |
4 | 4 | ||
5 | use Pagerfanta\Adapter\DoctrineORMAdapter; | 5 | use Pagerfanta\Adapter\DoctrineORMAdapter; |
6 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; | ||
6 | use Pagerfanta\Pagerfanta; | 7 | use Pagerfanta\Pagerfanta; |
7 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; | 8 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; |
8 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; | 9 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; |
10 | use Symfony\Component\HttpFoundation\Request; | ||
9 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | 11 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; |
10 | use Wallabag\CoreBundle\Entity\Entry; | 12 | use Wallabag\CoreBundle\Entity\Entry; |
11 | use Wallabag\UserBundle\Entity\User; | 13 | use Wallabag\UserBundle\Entity\User; |
14 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | ||
12 | 15 | ||
13 | class RssController extends Controller | 16 | class 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 | } |