/**
  * {@inheritdoc}
  */
 public function execute(InputInterface $input, OutputInterface $output)
 {
     $this->getContainer()->get('router')->getContext()->setHost($input->getArgument('host'));
     $this->getContainer()->get('router')->getContext()->setScheme($input->getOption('scheme'));
     $this->getContainer()->get('router')->getContext()->setBaseUrl($input->getOption('baseurl'));
     $tempFolder = sys_get_temp_dir() . '/sonata_sitemap_' . md5(__DIR__);
     $fs = new Filesystem();
     // step 1
     $output->writeln(sprintf('Creating temporary folder: %s', $tempFolder));
     if ($fs->exists($tempFolder)) {
         $output->writeln('<error>The temporary folder already exists</error>');
         $output->writeln('<error>If the task is not running please delete this folder</error>');
         return 1;
     }
     $fs->mkdir($tempFolder);
     // step 2
     $manager = $this->getContainer()->get('sonata.seo.sitemap.manager');
     // step 3
     $output->writeln(sprintf('Generating sitemap - this can take a while'));
     foreach ($manager as $group => $sitemap) {
         $write = new SitemapWriter($tempFolder, $group, $sitemap->types, false);
         try {
             Handler::create($sitemap->sources, $write)->export();
         } catch (\Exception $e) {
             $fs->remove($tempFolder);
             throw $e;
         }
     }
     // generate global sitemap index
     $appendPath = $input->hasOption('sitemap_path') ? $input->getOption('sitemap_path') : $input->getOption('baseurl');
     SitemapWriter::generateSitemapIndex($tempFolder, sprintf('%s://%s%s', $input->getOption('scheme'), $input->getArgument('host'), $appendPath), 'sitemap*.xml', 'sitemap.xml');
     // step 4
     $output->writeln(sprintf('Moving temporary file to %s ...', $input->getArgument('folder')));
     $oldFiles = Finder::create()->files()->name('sitemap*.xml')->in($input->getArgument('folder'));
     foreach ($oldFiles as $file) {
         $fs->remove($file->getRealPath());
     }
     $newFiles = Finder::create()->files()->name('sitemap*.xml')->in($tempFolder);
     foreach ($newFiles as $file) {
         $fs->rename($file->getRealPath(), sprintf('%s/%s', $input->getArgument('folder'), $file->getFilename()));
     }
     $fs->remove($tempFolder);
     $output->writeln('<info>done!</info>');
 }
Exemplo n.º 2
0
 public function testLimitUrl()
 {
     $writer = new SitemapWriter($this->folder);
     $writer->open();
     foreach (range(1, SitemapWriter::LIMIT_URL + 1) as $i) {
         $writer->write(array('url' => str_repeat('x', 40), 'lastmod' => 'now', 'change' => 'daily'));
     }
     $writer->close();
     $generatedFiles = $this->getFiles();
     $this->assertEquals(3, count($generatedFiles));
     // this will throw an exception if the xml is invalid
     $file1 = new SimpleXMLElement(file_get_contents($generatedFiles[1]));
     $file2 = new SimpleXMLElement(file_get_contents($generatedFiles[2]));
     $info = stat($generatedFiles[0]);
     $this->assertLessThan(SitemapWriter::LIMIT_SIZE, $info['size']);
     $this->assertEquals(SitemapWriter::LIMIT_URL, count($file1->children()));
     $this->assertEquals(1, count($file2->children()));
 }