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.
*
$this->entries[] = $entry;
}
+ public function hasEntry($entry)
+ {
+ return $this->entries->contains($entry);
+ }
+
/**
* @return User
*/
--- /dev/null
+<?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';
+ }
+}
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();
+ }
}
<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 }}
--- /dev/null
+<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>
<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 }}
--- /dev/null
+<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>
$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()));
+ }
}