/** * Создаёт карту сайта из объекта $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; }
/** * Обновляет информацию о карте сайта в БД. * Обратите внимание, что этот метод обновляет только информацию в БД, а не физический 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; }