diff --git a/src/Wallabag/CoreBundle/Controller/TagController.php b/src/Wallabag/CoreBundle/Controller/TagController.php index 16ded948e..7df73e8c7 100644 --- a/src/Wallabag/CoreBundle/Controller/TagController.php +++ b/src/Wallabag/CoreBundle/Controller/TagController.php @@ -2,6 +2,7 @@ namespace Wallabag\CoreBundle\Controller; +use Doctrine\ORM\QueryBuilder; use Pagerfanta\Adapter\ArrayAdapter; use Pagerfanta\Exception\OutOfRangeCurrentPageException; use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; @@ -190,4 +191,35 @@ class TagController extends Controller return $this->redirect($redirectUrl); } + + /** + * Tag search results with the current search term. + * + * @Route("/tag/search/{filter}", name="tag_this_search") + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function tagThisSearchAction($filter, Request $request) + { + $currentRoute = $request->query->has('currentRoute') ? $request->query->get('currentRoute') : ''; + + /** @var QueryBuilder $qb */ + $qb = $this->get('wallabag_core.entry_repository')->getBuilderForSearchByUser($this->getUser()->getId(), $filter, $currentRoute); + $em = $this->getDoctrine()->getManager(); + + $entries = $qb->getQuery()->getResult(); + + foreach ($entries as $entry) { + $this->get('wallabag_core.tags_assigner')->assignTagsToEntry( + $entry, + $filter + ); + + $em->persist($entry); + } + + $em->flush(); + + return $this->redirect($this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'), '', true)); + } } diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml index 14c3fdf77..298baf8e1 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml @@ -237,6 +237,7 @@ entry: toogle_as_star: Toggle starred delete: Delete export_title: Export + assign_search_tag: Assign this search as a tag to each result filters: title: Filters status_label: Status diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig index 9d6f39977..c5dc97e01 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig @@ -34,6 +34,7 @@ {% include "@WallabagCore/themes/common/Entry/_feed_link.html.twig" %} {% endif %} + {% if currentRoute == 'search' %}
{% endif %} {% if entries.getNbPages > 1 %} {{ pagerfanta(entries, 'twitter_bootstrap_translated', {'proximity': 1}) }} {% endif %} diff --git a/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php b/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php index 20796f776..e3d3ff5e0 100644 --- a/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/TagControllerTest.php @@ -476,4 +476,35 @@ class TagControllerTest extends WallabagCoreTestCase $this->assertNotFalse(array_search('cache', $tags, true), 'Tag cache is assigned to the entry'); $this->assertNotFalse(array_search('caché', $tags, true), 'Tag caché is assigned to the entry'); } + + public function testAssignTagsOnSearchResults() + { + $this->logInAs('admin'); + $client = $this->getClient(); + + // Search on unread list + $crawler = $client->request('GET', '/unread/list'); + + $form = $crawler->filter('form[name=search]')->form(); + $data = [ + 'search_entry[term]' => 'title', + ]; + + $crawler = $client->submit($form, $data); + + $client->click($crawler->selectLink('entry.list.assign_search_tag')->link()); + $client->followRedirect(); + + $entries = $client->getContainer() + ->get('doctrine.orm.entity_manager') + ->getRepository('WallabagCoreBundle:Entry') + ->getBuilderForSearchByUser($this->getLoggedInUserId(), 'title', 'unread') + ->getQuery()->getResult(); + + foreach ($entries as $entry) { + $tags = $entry->getTagsLabel(); + + $this->assertContains('title', $tags); + } + } }