GenerateRobotFilesCommand.php 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. namespace Muzich\CoreBundle\Command;
  3. use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
  4. use Symfony\Component\Console\Input\InputInterface;
  5. use Symfony\Component\Console\Output\OutputInterface;
  6. class GenerateRobotFilesCommand extends ContainerAwareCommand
  7. {
  8. protected $sitemap_content;
  9. protected $sitemap_urls;
  10. protected $router;
  11. protected $locales;
  12. protected $siteurl_prefix;
  13. protected $em;
  14. protected function configure()
  15. {
  16. $this
  17. ->setName('generate:robot:files')
  18. ->setDescription('Generate files for bots')
  19. ;
  20. }
  21. protected function execute(InputInterface $input, OutputInterface $output)
  22. {
  23. $this->init();
  24. $this->generateRobotsTxt();
  25. $this->generateSitemap();
  26. $output->writeln('<info>Terminé !</info>');
  27. }
  28. protected function init()
  29. {
  30. $this->sitemap_content = new \DOMDocument('1.0', 'utf-8');
  31. $this->sitemap_urls = $this->sitemap_content->createElement('urlset');
  32. $this->sitemap_urls->setAttributeNode(new \DOMAttr('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9'));
  33. $this->router = $this->getContainer()->get('router');
  34. $this->locales = $this->getContainer()->getParameter('supported_langs');
  35. $this->siteurl_prefix = $this->getContainer()->getParameter('siteurl');
  36. $this->em = $this->getContainer()->get('doctrine')->getEntityManager();
  37. }
  38. protected function generateRobotsTxt()
  39. {
  40. $robotstxt_content = "User-agent: *\n".
  41. "Sitemap: http://muzi.ch/sitemap.xml";
  42. file_put_contents('web/robots.txt', $robotstxt_content);
  43. }
  44. protected function generateSitemap()
  45. {
  46. $this->addStaticsUrlsToUrlNode();
  47. $this->addUserUrlsToUrlNode();
  48. $this->addGroupUrlsToUrlNode();
  49. $this->addPlaylistUrlsToUrlNode();
  50. $this->addElementPermalinkUrlsToUrlNode();
  51. $this->sitemap_content->appendChild($this->sitemap_urls);
  52. $this->sitemap_content->save('web/sitemap.xml');
  53. }
  54. protected function addStaticsUrlsToUrlNode()
  55. {
  56. $this->addUrlsToNode($this->sitemap_urls, $this->generateUrls('home'), 'always');
  57. $this->addUrlsToNode($this->sitemap_urls, $this->generateUrls('element_show_need_tags'), 'hourly');
  58. }
  59. protected function addUserUrlsToUrlNode()
  60. {
  61. $users = $this->em->createQueryBuilder()
  62. ->from('MuzichCoreBundle:User', 'user')
  63. ->select('user.id, user.slug')
  64. ->getQuery()->getScalarResult();
  65. foreach ($users as $user)
  66. {
  67. $this->addUrlsToNode($this->sitemap_urls, $this->generateUrls('show_user', array(
  68. 'slug' => $user['slug']
  69. )), 'weekly');
  70. $this->addUrlsToNode($this->sitemap_urls, $this->generateUrls('favorite_user_list', array(
  71. 'slug' => $user['slug']
  72. )), 'weekly');
  73. $this->addUrlsToNode($this->sitemap_urls, $this->generateUrls('playlists_user', array(
  74. 'user_slug' => $user['slug']
  75. )), 'weekly');
  76. }
  77. }
  78. protected function addGroupUrlsToUrlNode()
  79. {
  80. $groups = $this->em->createQueryBuilder()
  81. ->from('MuzichCoreBundle:Group', 'g')
  82. ->select('g.id, g.slug')
  83. ->getQuery()->getScalarResult();
  84. foreach ($groups as $group)
  85. {
  86. $this->addUrlsToNode($this->sitemap_urls, $this->generateUrls('show_group', array(
  87. 'slug' => $group['slug']
  88. )), 'weekly');
  89. }
  90. }
  91. protected function addPlaylistUrlsToUrlNode()
  92. {
  93. $playlists = $this->em->createQueryBuilder()
  94. ->from('MuzichCoreBundle:Playlist', 'playlist')
  95. ->leftJoin('playlist.owner', 'owner')
  96. ->select('playlist.id, owner.slug')
  97. ->getQuery()->getScalarResult();
  98. foreach ($playlists as $playlist)
  99. {
  100. $this->addUrlsToNode($this->sitemap_urls, $this->generateUrls('playlist', array(
  101. 'playlist_id' => $playlist['id'],
  102. 'user_slug' => $playlist['slug']
  103. )), 'monthly');
  104. }
  105. }
  106. protected function addElementPermalinkUrlsToUrlNode()
  107. {
  108. $elements = $this->em->createQueryBuilder()
  109. ->from('MuzichCoreBundle:Element', 'element')
  110. ->select('element.id, element.slug')
  111. ->where('element.private = 0')
  112. ->getQuery()->getScalarResult();
  113. foreach ($elements as $element)
  114. {
  115. $this->addUrlsToNode($this->sitemap_urls, $this->generateUrls('element_show_one', array(
  116. 'element_id' => $element['id'],
  117. 'element_slug' => $element['slug']
  118. )), 'yearly');
  119. }
  120. }
  121. /** @return array */
  122. protected function generateUrls($route, $parameters = array())
  123. {
  124. $urls = array();
  125. foreach ($this->locales as $locale)
  126. {
  127. $urls[] = $this->siteurl_prefix . $this->router->generate($route, array_merge($parameters, array(
  128. '_locale' => $locale
  129. )));
  130. }
  131. return $urls;
  132. }
  133. protected function addUrlsToNode(\DOMNode $node, $urls, $changefreq = null)
  134. {
  135. foreach ($urls as $url)
  136. {
  137. $url_loc_content = $this->sitemap_content->createTextNode($url);
  138. $url_node = $this->sitemap_content->createElement('url');
  139. $loc_node = $this->sitemap_content->createElement('loc');
  140. $loc_node->appendChild($url_loc_content);
  141. $url_node->appendChild($loc_node);
  142. if ($changefreq)
  143. {
  144. $changefreq_node = $this->sitemap_content->createElement('changefreq');
  145. $changefreq_node->appendChild($this->sitemap_content->createTextNode($changefreq));
  146. $url_node->appendChild($changefreq_node);
  147. }
  148. $node->appendChild($url_node);
  149. }
  150. }
  151. }