X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2FWallabag%2FCoreBundle%2FController%2FEntryController.php;h=9097810c22ff4dd3a88f3e8edba3f95d67fda4bf;hb=303768dfe9b85f87d043eb225c5c8c3a88d8c051;hp=b73e9eecd52e5aeb81e0c72e75fdf3a97f0c290a;hpb=ec00964de22a338d8f814c5440f8e09f542fdbbf;p=github%2Fwallabag%2Fwallabag.git diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php index b73e9eec..9097810c 100644 --- a/src/Wallabag/CoreBundle/Controller/EntryController.php +++ b/src/Wallabag/CoreBundle/Controller/EntryController.php @@ -5,8 +5,8 @@ namespace Wallabag\CoreBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Wallabag\CoreBundle\Entity\Entry; -use Wallabag\CoreBundle\Service\Extractor; use Wallabag\CoreBundle\Form\Type\NewEntryType; use Wallabag\CoreBundle\Form\Type\EditEntryType; use Wallabag\CoreBundle\Filter\EntryFilterType; @@ -15,6 +15,23 @@ use Pagerfanta\Pagerfanta; class EntryController extends Controller { + /** + * @param Entry $entry + */ + private function updateEntry(Entry $entry) + { + try { + $entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl()); + $em = $this->getDoctrine()->getManager(); + $em->persist($entry); + $em->flush(); + } catch (\Exception $e) { + return false; + } + + return true; + } + /** * @param Request $request * @@ -24,6 +41,7 @@ class EntryController extends Controller */ public function addEntryFormAction(Request $request) { + $em = $this->getDoctrine()->getManager(); $entry = new Entry($this->getUser()); $form = $this->createForm(new NewEntryType(), $entry); @@ -31,15 +49,20 @@ class EntryController extends Controller $form->handleRequest($request); if ($form->isValid()) { - $content = Extractor::extract($entry->getUrl()); + $existingEntry = $em + ->getRepository('WallabagCoreBundle:Entry') + ->findOneByUrlAndUserId($entry->getUrl(), $this->getUser()->getId()); - $entry->setTitle($content->getTitle()); - $entry->setContent($content->getBody()); + if (count($existingEntry) > 0) { + $this->get('session')->getFlashBag()->add( + 'notice', + 'Entry already saved on '.$existingEntry[0]->getCreatedAt()->format('d-m-Y') + ); - $em = $this->getDoctrine()->getManager(); - $em->persist($entry); - $em->flush(); + return $this->redirect($this->generateUrl('view', array('id' => $existingEntry[0]->getId()))); + } + $this->updateEntry($entry); $this->get('session')->getFlashBag()->add( 'notice', 'Entry saved' @@ -53,6 +76,22 @@ class EntryController extends Controller )); } + /** + * @param Request $request + * + * @Route("/bookmarklet", name="bookmarklet") + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function addEntryViaBookmarklet(Request $request) + { + $entry = new Entry($this->getUser()); + $entry->setUrl($request->get('url')); + $this->updateEntry($entry); + + return $this->redirect($this->generateUrl('homepage')); + } + /** * @param Request $request * @@ -196,7 +235,7 @@ class EntryController extends Controller throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type)); } - $form = $this->get('form.factory')->create(new EntryFilterType()); + $form = $this->get('form.factory')->create(new EntryFilterType($repository, $this->getUser())); if ($request->query->has($form->getName())) { // manually bind values from the request @@ -241,6 +280,33 @@ class EntryController extends Controller ); } + /** + * Reload an entry. + * Refetch content from the website and make it readable again. + * + * @param Entry $entry + * + * @Route("/reload/{id}", requirements={"id" = "\d+"}, name="reload_entry") + * + * @return \Symfony\Component\HttpFoundation\RedirectResponse + */ + public function reloadAction(Entry $entry) + { + $this->checkUserAction($entry); + + $message = 'Entry reloaded'; + if (false === $this->updateEntry($entry)) { + $message = 'Failed to reload entry'; + } + + $this->get('session')->getFlashBag()->add( + 'notice', + $message + ); + + return $this->redirect($this->generateUrl('view', array('id' => $entry->getId()))); + } + /** * Changes read status for an entry. * @@ -292,10 +358,9 @@ class EntryController extends Controller } /** - * Deletes entry. + * Deletes entry and redirect to the homepage or the last viewed page. * - * @param Request $request - * @param Entry $entry + * @param Entry $entry * * @Route("/delete/{id}", requirements={"id" = "\d+"}, name="delete_entry") * @@ -305,6 +370,14 @@ class EntryController extends Controller { $this->checkUserAction($entry); + // generates the view url for this entry to check for redirection later + // to avoid redirecting to the deleted entry. Ugh. + $url = $this->generateUrl( + 'view', + array('id' => $entry->getId()), + UrlGeneratorInterface::ABSOLUTE_URL + ); + $em = $this->getDoctrine()->getManager(); $em->remove($entry); $em->flush(); @@ -314,7 +387,8 @@ class EntryController extends Controller 'Entry deleted' ); - return $this->redirect($request->headers->get('referer')); + // don't redirect user to the deleted entry + return $this->redirect($url !== $request->headers->get('referer') ? $request->headers->get('referer') : $this->generateUrl('homepage')); } /**