/**
  * Создаёт карту сайта из объекта $sitemap и записывает информацию о созданной карте сайта
  * в массив $this->createdSitemaps
  *
  * @param SitemapInterface $sitemap
  *
  * @return boolean
  */
 protected function createSitemap(SitemapInterface $sitemap)
 {
     if (!($urls = $sitemap->getUrls())) {
         return false;
     }
     self::sortByLastmod($urls);
     $chunkUrls = $this->chunkUrls($urls);
     $multipleSitemapFlag = count($chunkUrls) > 1;
     $i = 1;
     foreach ($chunkUrls as $urlsData) {
         $freshTimestamp = 0;
         $urlset = '<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL;
         $urlset .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . PHP_EOL;
         foreach ($urlsData as $url) {
             $urlset .= '    <url>' . PHP_EOL;
             $urlset .= "        <loc>{$url['url']}</loc>" . PHP_EOL;
             if (!empty($url['lastmodTimestamp'])) {
                 $date = date($this->lastmodFormat, $url['lastmodTimestamp']);
                 $urlset .= "        <lastmod>{$date}</lastmod>" . PHP_EOL;
                 if ($freshTimestamp < $url['lastmodTimestamp']) {
                     $freshTimestamp = $url['lastmodTimestamp'];
                 }
             }
             $urlset .= '    </url>' . PHP_EOL;
         }
         $urlset .= '</urlset>';
         $currentSitemapFilename = $multipleSitemapFlag ? "{$sitemap->getName()}-{$i}.xml" : "{$sitemap->getName()}.xml";
         $this->createdSitemaps[] = ['loc' => $currentSitemapFilename, 'lastmodTimestamp' => $freshTimestamp];
         if (!$this->createSitemapFile($currentSitemapFilename, $urlset)) {
             return false;
         }
         $i++;
     }
     return true;
 }
Example #2
0
 /**
  * Обновляет информацию о карте сайта в БД.
  * Обратите внимание, что этот метод обновляет только информацию в БД, а не физический xml-файл.
  *
  * @param SitemapInterface $sitemap
  *
  * @return bool
  */
 protected function updateSitemapInfo(SitemapInterface $sitemap)
 {
     if (!($urls = $sitemap->getUrls())) {
         return false;
     }
     foreach ($urls as $url) {
         $lastmod = isset($url['lastmod']) ? $url['lastmod'] : null;
         // Если урла нет в базе, то добавляем его...
         if (!$this->model->findUrl($url['loc'])) {
             $this->model->insertUrl($url['loc'], $sitemap->getName(), $lastmod);
         } elseif ($lastmod) {
             // ... иначе, если есть $lastmod, то обновляем его.
             $this->updateUrl($url['loc'], $lastmod);
         }
     }
     $nonActualUrls = array_diff(ArrayHelper::getColumn($this->model->findUrls($sitemap->getName()), 'loc'), ArrayHelper::getColumn($urls, 'loc'));
     foreach ($nonActualUrls as $url) {
         $this->model->deleteUrl($url);
     }
     return true;
 }