mirror of
https://github.com/wallabag/wallabag.git
synced 2024-12-24 16:40:30 +00:00
assign tags to an entry
This commit is contained in:
parent
109d67dbb1
commit
7244d6cb61
9 changed files with 186 additions and 2 deletions
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -96,6 +96,11 @@ class Tag
|
|||
$this->entries[] = $entry;
|
||||
}
|
||||
|
||||
public function hasEntry($entry)
|
||||
{
|
||||
return $this->entries->contains($entry);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return User
|
||||
*/
|
||||
|
|
30
src/Wallabag/CoreBundle/Form/Type/NewTagType.php
Normal file
30
src/Wallabag/CoreBundle/Form/Type/NewTagType.php
Normal 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';
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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&id={{ tag.id }}">{{ tag.label }}</a> {% endfor %}<a href="./?view=edit-tags&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 }}
|
||||
|
|
|
@ -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>
|
|
@ -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&id={{ tag.id }}">{{ tag.label }}</a> {% endfor %}<a href="./?view=edit-tags&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 }}
|
||||
|
|
|
@ -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>
|
|
@ -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()));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue