assign tags to an entry

This commit is contained in:
Nicolas Lœuillet 2015-08-19 11:46:21 +02:00 committed by Jeremy Benoist
parent 109d67dbb1
commit 7244d6cb61
9 changed files with 186 additions and 2 deletions

View file

@ -4,9 +4,59 @@ namespace Wallabag\CoreBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Wallabag\CoreBundle\Form\Type\NewTagType;
use Wallabag\CoreBundle\Entity\Tag;
use Wallabag\CoreBundle\Entity\Entry;
class TagController extends Controller
{
/**
* @param Request $request
*
* @Route("/new-tag/{entry}", requirements={"entry" = "\d+"}, name="new_tag")
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function addTagFormAction(Request $request, Entry $entry)
{
$tag = new Tag($this->getUser());
$form = $this->createForm(new NewTagType(), $tag);
$form->handleRequest($request);
if ($form->isValid()) {
$existingTag = $this->getDoctrine()
->getRepository('WallabagCoreBundle:Tag')
->findOneByLabelAndUserId($tag->getLabel(), $this->getUser()->getId());
$em = $this->getDoctrine()->getManager();
if (is_null($existingTag)) {
$entry->addTag($tag);
$em->persist($tag);
} else {
if (!$existingTag->hasEntry($entry)) {
$entry->addTag($existingTag);
$em->persist($existingTag);
}
}
$em->flush();
$this->get('session')->getFlashBag()->add(
'notice',
'Tag added'
);
return $this->redirect($this->generateUrl('view', array('id' => $entry->getId())));
}
return $this->render('WallabagCoreBundle:Tag:new_form.html.twig', array(
'form' => $form->createView(),
'entry' => $entry,
));
}
/**
* Shows tags for current user.
*

View file

@ -96,6 +96,11 @@ class Tag
$this->entries[] = $entry;
}
public function hasEntry($entry)
{
return $this->entries->contains($entry);
}
/**
* @return User
*/

View file

@ -0,0 +1,30 @@
<?php
namespace Wallabag\CoreBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class NewTagType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('label', 'text', array('required' => true))
->add('save', 'submit')
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Wallabag\CoreBundle\Entity\Tag',
));
}
public function getName()
{
return 'tag';
}
}

View file

@ -24,4 +24,21 @@ class TagRepository extends EntityRepository
return new Pagerfanta($pagerAdapter);
}
/**
* Find a tag by its label and its owner.
*
* @param string $label
* @param int $userId
*
* @return Tag|null
*/
public function findOneByLabelAndUserId($label, $userId)
{
return $this->createQueryBuilder('t')
->where('t.label = :label')->setParameter('label', $label)
->andWhere('t.user = :user_id')->setParameter('user_id', $userId)
->getQuery()
->getOneOrNullResult();
}
}

View file

@ -28,7 +28,8 @@
<h1>{{ entry.title|raw }} <a href="{{ path('edit', { 'id': entry.id }) }}" title="{% trans %}Edit tags{% endtrans %}">✎</a></h1>
</header>
<aside class="tags">
tags: {% for tag in entry.tags %}<a href="./?view=tag&amp;id={{ tag.id }}">{{ tag.label }}</a> {% endfor %}<a href="./?view=edit-tags&amp;id={{ entry.id }}" title="{% trans %}Edit tags{% endtrans %}">✎</a>
{% for tag in entry.tags %}<span class="mdi-action-label-outline">{{ tag.label }}</span>{% endfor %}
{{ render(controller( "WallabagCoreBundle:Tag:addTagForm", { 'id': entry.id } )) }}
</aside>
<article>
{{ entry.content | raw }}

View file

@ -0,0 +1,15 @@
<form name="tag" method="post" action="{{ path('new_tag', { 'entry': entry.id })}}">
{% if form_errors(form) %}
<span class="black-text">{{ form_errors(form) }}</span>
{% endif %}
{% if form_errors(form.label) %}
<span class="black-text">{{ form_errors(form.label) }}</span>
{% endif %}
{{ form_widget(form.label, { 'attr': {'autocomplete': 'off'} }) }}
{{ form_widget(form.save, { 'attr': {'class': 'btn waves-effect waves-light'}, 'label': 'add tag' }) }}
<div class="hidden">{{ form_rest(form) }}</div>
</form>

View file

@ -137,7 +137,8 @@ main {
<a href="{{ entry.url|e }}" target="_blank" title="{% trans %}original{% endtrans %} : {{ entry.title|e }}" class="tool link"><span>{{ entry.domainName }}</span></a>
</header>
<aside class="tags">
tags: {% for tag in entry.tags %}<a href="./?view=tag&amp;id={{ tag.id }}">{{ tag.label }}</a> {% endfor %}<a href="./?view=edit-tags&amp;id={{ entry.id }}" title="{% trans %}Edit tags{% endtrans %}">✎</a>
{% for tag in entry.tags %}<span class="mdi-action-label-outline">{{ tag.label }}</span>{% endfor %}
{{ render(controller( "WallabagCoreBundle:Tag:addTagForm", { 'id': entry.id } )) }}
</aside>
<article>
{{ entry.content | raw }}

View file

@ -0,0 +1,15 @@
<form name="tag" method="post" action="{{ path('new_tag', { 'entry': entry.id })}}">
{% if form_errors(form) %}
<span class="black-text">{{ form_errors(form) }}</span>
{% endif %}
{% if form_errors(form.label) %}
<span class="black-text">{{ form_errors(form.label) }}</span>
{% endif %}
{{ form_widget(form.label, { 'attr': {'autocomplete': 'off'} }) }}
{{ form_widget(form.save, { 'attr': {'class': 'btn waves-effect waves-light'}, 'label': 'add tag' }) }}
<div class="hidden">{{ form_rest(form) }}</div>
</form>

View file

@ -15,4 +15,54 @@ class TagControllerTest extends WallabagCoreTestCase
$this->assertEquals(200, $client->getResponse()->getStatusCode());
}
public function testAddTagToEntry()
{
$this->logInAs('admin');
$client = $this->getClient();
$entry = $client->getContainer()
->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Entry')
->findOneByIsArchived(false);
$crawler = $client->request('GET', '/view/'.$entry->getId());
$form = $crawler->filter('button[id=tag_save]')->form();
$data = array(
'tag[label]' => 'opensource',
);
$client->submit($form, $data);
$this->assertEquals(302, $client->getResponse()->getStatusCode());
$this->assertEquals(1, count($entry->getTags()));
# tag already exists and already assigned
$client->submit($form, $data);
$this->assertEquals(302, $client->getResponse()->getStatusCode());
$newEntry = $client->getContainer()
->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Entry')
->findOneById($entry->getId());
$this->assertEquals(1, count($newEntry->getTags()));
# tag already exists but still not assigned to this entry
$data = array(
'tag[label]' => 'foo',
);
$client->submit($form, $data);
$this->assertEquals(302, $client->getResponse()->getStatusCode());
$newEntry = $client->getContainer()
->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Entry')
->findOneById($entry->getId());
$this->assertEquals(2, count($newEntry->getTags()));
}
}