/** * Generates document with all sitemap items from $items array * * @param string $format (options: xml, html, txt, ror-rss, ror-rdf, sitemapindex) * * @return array */ public function generate($format = 'xml') { if ($this->isCached()) { $format == 'sitemapindex' ? $this->model->sitemaps = Cache::get($this->model->getCacheKey()) : ($this->model->items = Cache::get($this->model->getCacheKey())); } elseif ($this->model->getUseCache()) { $format == 'sitemapindex' ? Cache::put($this->model->getCacheKey(), $this->model->getSitemaps(), $this->model->getCacheDuration()) : Cache::put($this->model->getCacheKey(), $this->model->getItems(), $this->model->getCacheDuration()); } if (!$this->model->getLink()) { $this->model->setLink(Config::get('app.url')); } if (!$this->model->getTitle()) { $this->model->setTitle('Sitemap for ' . $this->model->getLink()); } $channel = ['title' => $this->model->getTitle(), 'link' => $this->model->getLink()]; // check if this sitemap have more than 50000 elements if (count($this->model->getItems()) > 50000) { // option 1: reset items to 50000 elements $this->model->resetItems(); // TODO option 2: split them to two partial sitemaps and add them to sitemapindex } switch ($format) { case 'ror-rss': return ['content' => View::make('sitemap::ror-rss', ['items' => $this->model->getItems(), 'channel' => $channel])->render(), 'headers' => ['Content-type' => 'text/rss+xml; charset=utf-8']]; case 'ror-rdf': return ['content' => View::make('sitemap::ror-rdf', ['items' => $this->model->getItems(), 'channel' => $channel])->render(), 'headers' => ['Content-type' => 'text/rdf+xml; charset=utf-8']]; case 'html': return ['content' => View::make('sitemap::html', ['items' => $this->model->getItems(), 'channel' => $channel])->render(), 'headers' => ['Content-type' => 'text/html']]; case 'txt': return ['content' => View::make('sitemap::txt', ['items' => $this->model->getItems()])->render(), 'headers' => ['Content-type' => 'text/plain']]; case 'sitemapindex': return ['content' => View::make('sitemap::sitemapindex', ['sitemaps' => $this->model->getSitemaps()])->render(), 'headers' => ['Content-type' => 'text/xml; charset=utf-8']]; default: return ['content' => View::make('sitemap::' . $format, ['items' => $this->model->getItems()])->render(), 'headers' => ['Content-type' => 'text/xml; charset=utf-8']]; } }
/** * Generates document with all sitemap items from $items array * * @param string $format (options: xml, html, txt, ror-rss, ror-rdf, sitemapindex) * * @return array */ public function generate($format = 'xml') { if (!$this->model->getLink()) { $this->model->setLink(Config::get('app.url')); } if (!$this->model->getTitle()) { $this->model->setTitle('Sitemap for ' . $this->model->getLink()); } $channel = array('title' => $this->model->getTitle(), 'link' => $this->model->getLink()); if ($this->model->getUseCache()) { if (Cache::has($this->model->getCacheKey())) { $format == 'sitemapindex' ? $this->model->sitemaps = Cache::get($this->model->getCacheKey()) : ($this->model->items = Cache::get($this->model->getCacheKey())); } else { $format == 'sitemapindex' ? Cache::put($this->model->getCacheKey(), $this->model->getSitemaps(), $this->model->getCacheDuration()) : Cache::put($this->model->getCacheKey(), $this->model->getItems(), $this->model->getCacheDuration()); } } switch ($format) { case 'ror-rss': return array('content' => View::make('sitemap::ror-rss', array('items' => $this->model->getItems(), 'channel' => $channel)), 'headers' => array('Content-type' => 'text/rss+xml; charset=utf-8')); case 'ror-rdf': return array('content' => View::make('sitemap::ror-rdf', array('items' => $this->model->getItems(), 'channel' => $channel)), 'headers' => array('Content-type' => 'text/rdf+xml; charset=utf-8')); case 'html': return array('content' => View::make('sitemap::html', array('items' => $this->model->getItems(), 'channel' => $channel)), 'headers' => array('Content-type' => 'text/html')); case 'txt': return array('content' => View::make('sitemap::txt', array('items' => $this->model->getItems())), 'headers' => array('Content-type' => 'text/plain')); case 'sitemapindex': return array('content' => View::make('sitemap::sitemapindex', array('sitemaps' => $this->model->getSitemaps())), 'headers' => array('Content-type' => 'text/xml; charset=utf-8')); default: return array('content' => View::make('sitemap::xml', array('items' => $this->model->getItems())), 'headers' => array('Content-type' => 'text/xml; charset=utf-8')); } }
/** * Generate sitemap and store it to a file * * @param string $format (options: xml, html, txt, ror-rss, ror-rdf, sitemapindex, google-news) * @param string $filename (without file extension, may be a path like 'sitemaps/sitemap1' but must exist) * * @return void */ public function store($format = 'xml', $filename = 'sitemap') { // check if this sitemap have more than 50000 elements if (count($this->model->getItems()) > 50000) { foreach (array_chunk($this->model->getItems(), 50000) as $key => $item) { $this->model->items = $item; $this->store('xml', $filename . '-' . $key); $this->addSitemap(url($filename . '-' . $key . '.xml')); } $data = $this->generate('sitemapindex'); } else { $data = $this->generate($format); } if ($format == 'ror-rss' || $format == 'ror-rdf' || $format == 'sitemapindex' || $format == 'google-news') { $format = 'xml'; } $file = public_path() . DIRECTORY_SEPARATOR . $filename . '.' . $format; // must return something if (File::put($file, $data['content'])) { return "Success! Your sitemap file is created."; } else { return "Error! Your sitemap file is NOT created."; } // clear $format == 'sitemapindex' ? $this->model->sitemaps = [] : ($this->model->items = []); }
/** * Generate sitemap and store it to a file * * @param string $format (options: xml, html, txt, ror-rss, ror-rdf, sitemapindex, google-news) * @param string $filename (without file extension, may be a path like 'sitemaps/sitemap1' but must exist) * * @return void */ public function store($format = 'xml', $filename = 'sitemap') { // turn off caching for this method $this->model->setUseCache(false); // use correct file extension $format == 'txt' || $format == 'html' ? $fe = $format : ($fe = 'xml'); // check if this sitemap have more than 50000 elements (or 1000 if is google-news) if ($format != "google-news" && count($this->model->getItems()) > 50000 || $format == "google-news" && count($this->model->getItems()) > 1000) { $format != "google-news" ? $max = 50000 : ($max = 1000); // check if limiting size of items array is enabled if (!$this->model->getUseLimitSize()) { // use sitemapindex and generate partial sitemaps foreach (array_chunk($this->model->getItems(), $max) as $key => $item) { $this->model->resetItems($item); $this->store($format, $filename . '-' . $key); $this->addSitemap(url($filename . '-' . $key . '.' . $fe)); } $data = $this->generate('sitemapindex'); } else { // reset items and use only most recent $max items $this->model->limitSize($max); $data = $this->generate($format); } } else { $data = $this->generate($format); } $file = public_path() . DIRECTORY_SEPARATOR . $filename . '.' . $fe; // must return something if (File::put($file, $data['content'])) { return "Success! Your sitemap file is created."; } else { return "Error! Your sitemap file is NOT created."; } // clear memory if ($format == 'sitemapindex') { $this->model->resetSitemaps(); $this->model->resetItems(); } else { $this->model->resetItems(); } }
/** * Generate sitemap and store it to a file * * @param string $format (options: xml, html, txt, ror-rss, ror-rdf, sitemapindex, google-news) * @param string $filename (without file extension, may be a path like 'sitemaps/sitemap1' but must exist) * @param string $path (path to store sitemap like '/www/site/public') * @param string $style (path to custom xls style like '/styles/xsl/xml-sitemap.xsl') * * @return void */ public function store($format = 'xml', $filename = 'sitemap', $path = null, $style = null) { // turn off caching for this method $this->model->setUseCache(false); // use correct file extension $format == 'txt' || $format == 'html' ? $fe = $format : ($fe = 'xml'); // use custom size limit for sitemaps if ($this->model->getMaxSize() > 0 && count($this->model->getItems()) > $this->model->getMaxSize()) { if ($this->model->getUseLimitSize()) { // limit size $this->model->limitSize($this->model->getMaxSize()); $data = $this->generate($format, $style); } else { // use sitemapindex and generate partial sitemaps foreach (array_chunk($this->model->getItems(), $this->model->getMaxSize()) as $key => $item) { // reset current items $this->model->resetItems($item); // generate new partial sitemap $this->store($format, $filename . '-' . $key, $path, $style); // add sitemap to sitemapindex if ($path != null) { // if using custom path generate relative urls for sitemaps in the sitemapindex $this->addSitemap($filename . '-' . $key . '.' . $fe); } else { // else generate full urls based on app's domain $this->addSitemap(url($filename . '-' . $key . '.' . $fe)); } } $data = $this->generate('sitemapindex', $style); } } else { if ($format != "google-news" && count($this->model->getItems()) > 50000 || $format == "google-news" && count($this->model->getItems()) > 1000) { $format != "google-news" ? $max = 50000 : ($max = 1000); // check if limiting size of items array is enabled if (!$this->model->getUseLimitSize()) { // use sitemapindex and generate partial sitemaps foreach (array_chunk($this->model->getItems(), $max) as $key => $item) { // reset current items $this->model->resetItems($item); // generate new partial sitemap $this->store($format, $filename . '-' . $key, $path, $style); // add sitemap to sitemapindex if ($path != null) { // if using custom path generate relative urls for sitemaps in the sitemapindex $this->addSitemap($filename . '-' . $key . '.' . $fe); } else { // else generate full urls based on app's domain $this->addSitemap(url($filename . '-' . $key . '.' . $fe)); } } $data = $this->generate('sitemapindex', $style); } else { // reset items and use only most recent $max items $this->model->limitSize($max); $data = $this->generate($format, $style); } } else { $data = $this->generate($format, $style); } } // if custom path if ($path == null) { $file = public_path() . DIRECTORY_SEPARATOR . $filename . '.' . $fe; } else { $file = $path . DIRECTORY_SEPARATOR . $filename . '.' . $fe; } // must return something if (File::put($file, $data['content'])) { return "Success! Your sitemap file is created."; } else { return "Error! Your sitemap file is NOT created."; } // clear memory if ($format == 'sitemapindex') { $this->model->resetSitemaps(); $this->model->resetItems(); } else { $this->model->resetItems(); } }