PageRenderTime 32ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/src/Aggregator/DealsBundle/Controller/FeedController.php

https://bitbucket.org/rami_mikhail/deal-aggregator
PHP | 439 lines | 281 code | 57 blank | 101 comment | 28 complexity | 490802cd421003f0a47872da0d2988d7 MD5 | raw file
Possible License(s): BSD-3-Clause, BSD-2-Clause, LGPL-2.0, MIT, Apache-2.0, LGPL-2.1, LGPL-3.0
  1. <?php
  2. namespace Aggregator\DealsBundle\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  4. use Aggregator\DealsBundle\Entity\Feed;
  5. use Aggregator\DealsBundle\Entity\link;
  6. use Aggregator\DealsBundle\Entity\Category;
  7. use Aggregator\DealsBundle\Form\FeedType;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  10. use Symfony\Component\Security\Acl\Domain\ObjectIdentity;
  11. use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity;
  12. use Symfony\Component\Security\Acl\Permission\MaskBuilder;
  13. /**
  14. * Feed controller.
  15. *
  16. */
  17. class FeedController extends Controller {
  18. /**
  19. * Lists all Feed entities.
  20. *
  21. */
  22. public function __construct($container = null) {
  23. $this->container = $container;
  24. // ... deal with any more arguments etc here
  25. }
  26. public function indexAction() {
  27. $em = $this->getDoctrine()->getEntityManager();
  28. $entities = $em->getRepository('AggregatorDealsBundle:Feed')->findAll();
  29. return $this->render('AggregatorDealsBundle:Feed:index.html.twig', array(
  30. 'entities' => $entities
  31. ));
  32. }
  33. /**
  34. * Finds and displays a Feed entity.
  35. *
  36. */
  37. public function showAction($id) {
  38. $em = $this->getDoctrine()->getEntityManager();
  39. $entity = $em->getRepository('AggregatorDealsBundle:Feed')->find($id);
  40. if (!$entity) {
  41. throw $this->createNotFoundException('Unable to find Feed entity.');
  42. }
  43. $deleteForm = $this->createDeleteForm($id);
  44. return $this->render('AggregatorDealsBundle:Feed:show.html.twig', array(
  45. 'entity' => $entity,
  46. 'delete_form' => $deleteForm->createView(),
  47. ));
  48. }
  49. /**
  50. * Displays a form to create a new Feed entity.
  51. *
  52. */
  53. public function newAction() {
  54. $entity = new Feed();
  55. $form = $this->createForm(new FeedType(), $entity);
  56. return $this->render('AggregatorDealsBundle:Feed:new.html.twig', array(
  57. 'entity' => $entity,
  58. 'form' => $form->createView()
  59. ));
  60. }
  61. /**
  62. * Creates a new Feed entity.
  63. *
  64. */
  65. public function createAction() {
  66. $entity = new Feed();
  67. $request = $this->getRequest();
  68. $form = $this->createForm(new FeedType(), $entity);
  69. $form->bindRequest($request);
  70. if ($form->isValid()) {
  71. $em = $this->getDoctrine()->getEntityManager();
  72. $em->persist($entity);
  73. $em->flush();
  74. return $this->redirect($this->generateUrl('feed_show', array('id' => $entity->getId())));
  75. }
  76. return $this->render('AggregatorDealsBundle:Feed:new.html.twig', array(
  77. 'entity' => $entity,
  78. 'form' => $form->createView()
  79. ));
  80. }
  81. /**
  82. * Displays a form to edit an existing Feed entity.
  83. *
  84. */
  85. public function editAction($id) {
  86. $em = $this->getDoctrine()->getEntityManager();
  87. $entity = $em->getRepository('AggregatorDealsBundle:Feed')->find($id);
  88. if (!$entity) {
  89. throw $this->createNotFoundException('Unable to find Feed entity.');
  90. }
  91. $editForm = $this->createForm(new FeedType(), $entity);
  92. $deleteForm = $this->createDeleteForm($id);
  93. return $this->render('AggregatorDealsBundle:Feed:edit.html.twig', array(
  94. 'entity' => $entity,
  95. 'edit_form' => $editForm->createView(),
  96. 'delete_form' => $deleteForm->createView(),
  97. ));
  98. }
  99. /**
  100. * Edits an existing Feed entity.
  101. *
  102. */
  103. public function updateAction($id) {
  104. $em = $this->getDoctrine()->getEntityManager();
  105. $entity = $em->getRepository('AggregatorDealsBundle:Feed')->find($id);
  106. if (!$entity) {
  107. throw $this->createNotFoundException('Unable to find Feed entity.');
  108. }
  109. $editForm = $this->createForm(new FeedType(), $entity);
  110. $deleteForm = $this->createDeleteForm($id);
  111. $request = $this->getRequest();
  112. $editForm->bindRequest($request);
  113. if ($editForm->isValid()) {
  114. $em->persist($entity);
  115. $em->flush();
  116. return $this->redirect($this->generateUrl('feed_edit', array('id' => $id)));
  117. }
  118. return $this->render('AggregatorDealsBundle:Feed:edit.html.twig', array(
  119. 'entity' => $entity,
  120. 'edit_form' => $editForm->createView(),
  121. 'delete_form' => $deleteForm->createView(),
  122. ));
  123. }
  124. /**
  125. * Deletes a Feed entity.
  126. *
  127. */
  128. public function deleteAction($id) {
  129. $form = $this->createDeleteForm($id);
  130. $request = $this->getRequest();
  131. $form->bindRequest($request);
  132. if ($form->isValid()) {
  133. $em = $this->getDoctrine()->getEntityManager();
  134. $entity = $em->getRepository('AggregatorDealsBundle:Feed')->find($id);
  135. if (!$entity) {
  136. throw $this->createNotFoundException('Unable to find Feed entity.');
  137. }
  138. $link = $em->getRepository('AggregatorDealsBundle:link')->findBy(array('feed' => $entity->getId()));
  139. foreach ($link as $ln) {
  140. $em->remove($ln);
  141. }
  142. $em->remove($entity);
  143. $em->flush();
  144. }
  145. return $this->redirect($this->generateUrl('feed'));
  146. }
  147. private function createDeleteForm($id) {
  148. return $this->createFormBuilder(array('id' => $id))
  149. ->add('id', 'hidden')
  150. ->getForm()
  151. ;
  152. }
  153. public function testAction() {
  154. $em = $this->getDoctrine()->getEntityManager();
  155. $em->createQuery("delete from AggregatorDealsBundle:link")->execute();
  156. $entity = $em->getRepository('AggregatorDealsBundle:Feed')->findAll();
  157. $ch = curl_init();
  158. foreach ($entity as $feed) {
  159. if ($feed->getLink() != null || $feed->getLink() != '') {
  160. // Set request url
  161. curl_setopt($ch, CURLOPT_URL, $feed->getLink());
  162. // TRUE to include the header in the output.
  163. curl_setopt($ch, CURLOPT_HEADER, false);
  164. // A custom request method to use instead of "GET" or "HEAD" when doing a HTTP request.
  165. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  166. //curl_setopt($ch, CURLOPT_GET, $feed);
  167. $data = curl_exec($ch);
  168. //print_r($data);
  169. //die();
  170. $xml = new SimpleXMLElement($data);
  171. //print_r($xml);
  172. //die();
  173. foreach ($xml->channel->item as $items) {
  174. $link = new link();
  175. //$link->setImage(urldecode($xml->channel->image->url));
  176. $link->setLink(urldecode($items->link));
  177. $link->setTitle(addslashes(trim(urldecode($items->title))));
  178. $link->setDescription(trim(strip_tags(urldecode($items->description))));
  179. $image = $this->scrapeImage(urldecode($items->description));
  180. if (isset($image[1][2]) && $image[1][2] != null) {
  181. $link->setImage($image[1][2]);
  182. } else {
  183. $link->setImage($image[1][1]);
  184. }
  185. $deal = $items->children('http://www.dealfind.com/ns/1.0/deal#');
  186. $category = $this->getDoctrine()->getRepository('AggregatorDealsBundle:Category')->findBy(array('name' => $deal->category));
  187. //print_r($category);
  188. if (count($category) == 0) {
  189. $category = new Category();
  190. $category->setName($deal->category);
  191. $em->persist($category);
  192. } else {
  193. $link->setCategory($category[0]);
  194. }
  195. $link->setPrice($deal->price);
  196. $link->setAvailable($deal->voucherlimit);
  197. $link->setStartdate($deal->start);
  198. $link->setEnddate($deal->end);
  199. $link->setRegularprice($deal->regularPrice);
  200. $link->setFeed($feed);
  201. $em = $this->getDoctrine()->getEntityManager();
  202. $em->persist($link);
  203. $em->flush();
  204. }
  205. }
  206. //print_r($allItems);
  207. }
  208. /*
  209. $objectIdentity = new ObjectIdentity('class', 'Aggregator\\DealsBundle\\Entity\\link');
  210. //print('<xmp>');
  211. //print_r($objectIdentity);
  212. $aclProvider = $this->get('security.acl.provider');
  213. //print_r($aclProvider);
  214. $aclProvider->deleteAcl($objectIdentity);
  215. $acl = $aclProvider->createAcl($objectIdentity);
  216. //print_r($acl);
  217. // retrieving the security identity of the currently logged-in user
  218. //print('<xmp>');
  219. $securityContext = $this->get('security.context');
  220. //print_r($securityContext);
  221. $user = $securityContext->getToken()->getUser();
  222. //print_r($user);
  223. $securityIdentity = UserSecurityIdentity::fromAccount($user);
  224. //print_r($securityIdentity);
  225. //print('hi');
  226. //print('</xmp>');
  227. //error_log($securityIdentity);
  228. // grant owner access
  229. $builder = new MaskBuilder();
  230. $builder
  231. ->add('view')
  232. ->add('edit');
  233. // print_r($builder->get());
  234. $mask = $builder->get(); // int(29)
  235. $acl->insertObjectAce($securityIdentity, $mask);
  236. $aclProvider->updateAcl($acl);
  237. */
  238. $this->yipitAction();
  239. return new Response(
  240. 'Done'
  241. );
  242. }
  243. public function parseGrouponAction() {
  244. $url = "http://api.groupon.com/v2/deals?client_id=a663679ed3c8b01097634333fa743cf3a721f4fe";
  245. $ch = curl_init();
  246. // Set request url
  247. curl_setopt($ch, CURLOPT_URL, $url);
  248. // TRUE to include the header in the output.
  249. curl_setopt($ch, CURLOPT_HEADER, false);
  250. // A custom request method to use instead of "GET" or "HEAD" when doing a HTTP request.
  251. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  252. //curl_setopt($ch, CURLOPT_GET, $feed);
  253. $data = curl_exec($ch);
  254. $data = json_decode($data);
  255. //print_r($data);
  256. foreach ($data->deals as $dat) {
  257. foreach ($dat as $test) {
  258. foreach ($test as $t) {
  259. echo($t->title);
  260. echo($t->price->formattedAmount);
  261. echo($t->value->formattedAmount);
  262. print_r($t->tags);
  263. print_r($t->locationNote);
  264. echo("<br>");
  265. }
  266. print_r($test->tags);
  267. print_r($test->locationNote);
  268. }
  269. print_r($dat->tags);
  270. print_r($dat->locationNote);
  271. }
  272. return $this->render('AggregatorDealsBundle:Feed:me.html.twig', array('rss' => $data));
  273. }
  274. public function yipitAction() {
  275. $em = $this->getDoctrine()->getEntityManager();
  276. $em->createQuery("delete from AggregatorDealsBundle:link")->execute();
  277. $city = $this->getDoctrine()->getRepository('AggregatorDealsBundle:City')->findAll();
  278. $allCities = array();
  279. foreach($city as $cit)
  280. {
  281. $allCities[]=$cit->getName();
  282. }
  283. //die();
  284. $places = urlencode(strtolower(implode(',',$allCities)));
  285. $url = "http://api.yipit.com/v1/deals/?key=shh5kNSS9GXkVYVM&division=".$places."&limit=5000";
  286. $ch = curl_init();
  287. // Set request url
  288. curl_setopt($ch, CURLOPT_URL, $url);
  289. // TRUE to include the header in the output.
  290. curl_setopt($ch, CURLOPT_HEADER, false);
  291. // A custom request method to use instead of "GET" or "HEAD" when doing a HTTP request.
  292. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  293. //curl_setopt($ch, CURLOPT_GET, $feed);
  294. $data = curl_exec($ch);
  295. $data = json_decode($data);
  296. //print('<xmp>');
  297. //print_r($data);
  298. //print('</xmp>');
  299. //die();
  300. foreach ($data->response->deals as $deal) {
  301. $link = new link();
  302. $link->setImage($deal->images->image_small);
  303. $link->setLink($deal->yipit_url);
  304. if(gettype($deal->title)==='string')
  305. {
  306. $link->setTitle($deal->title);
  307. }
  308. else
  309. {
  310. $link->setTitle('na');
  311. }
  312. $link->setDescription('');
  313. $category = $this->getDoctrine()->getRepository('AggregatorDealsBundle:Category')->findBy(array('name' => $deal->tags[0]->name));
  314. //print_r($category);
  315. if (count($category) == 0) {
  316. $category = new Category();
  317. $category->setName($deal->tags[0]->name);
  318. $em->persist($category);
  319. } else {
  320. $link->setCategory($category[0]);
  321. }
  322. $feed = $this->getDoctrine()->getRepository('AggregatorDealsBundle:Feed')->findBy(array('name' => $deal->source->name));
  323. //print_r($category);
  324. if (count($feed) == 0) {
  325. $feed = new Feed();
  326. $feed->setName($deal->source->name);
  327. $em->persist($feed);
  328. } else {
  329. $link->setFeed($feed[0]);
  330. }
  331. $city = $this->getDoctrine()->getRepository('AggregatorDealsBundle:City')->findBy(array('name' => $deal->division->name));
  332. if (count($city) == 0) {
  333. $city = new City();
  334. $city->setName($deal->division->name);
  335. $em->persist($city);
  336. } else {
  337. $link->setCity($city[0]);
  338. }
  339. $link->setPrice($deal->price->raw);
  340. $link->setAvailable(1);
  341. $link->setStartdate($deal->date_added);
  342. $link->setEnddate($deal->end_date);
  343. $link->setRegularprice($deal->value->raw);
  344. $link->setLatitude($deal->business->locations[0]->lat);
  345. $link->setLongitude($deal->business->locations[0]->lon);
  346. $em->persist($link);
  347. $em->flush();
  348. // echo($deal->title.' '.$deal->source->name);
  349. // echo("<img src='".$deal->images->image_small."'>");
  350. // echo("<b>".$deal->price->formatted."</b>");
  351. // echo("<b>".$deal->value->formatted."</b>");
  352. // echo("<b>".$deal->yipit_url."</b>");
  353. // echo("<b>".$deal->tags[0]->name."</b>");
  354. // echo("<br>");
  355. }
  356. return $this->render('AggregatorDealsBundle:Feed:yipit.html.twig', array('rss' => $data));
  357. }
  358. public function doctrineAction() {
  359. $kernel = $this->get('kernel');
  360. $application = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel);
  361. $application->setAutoExit(false);
  362. //Create de Schema
  363. $options = array('command' => 'doctrine:schema:update', "--force" => true);
  364. $application->run(new \Symfony\Component\Console\Input\ArrayInput($options));
  365. }
  366. public function clearAction() {
  367. $kernel = $this->get('kernel');
  368. $application = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel);
  369. $application->setAutoExit(false);
  370. //Create de Schema
  371. $options = array('command' => 'cache:clear');
  372. $output = array();
  373. return new Response($application->run(new \Symfony\Component\Console\Input\ArrayInput($options), new \Symfony\Component\Console\Output\ConsoleOutput($output)));
  374. }
  375. private function scrapeImage($text) {
  376. $pattern = '/src=[\'"]?([^\'" >]+)[\'" >]/';
  377. preg_match_all($pattern, $text, $link);
  378. return $link;
  379. }
  380. }