Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Sitemap/Renderer.php
<?php

namespace XF\Sitemap;

use function
intval;

class
Renderer
{
   
/**
     * @var \XF\App
     */
   
protected $app;

   
/**
     * @var \XF\Entity\SitemapLog|null
     */
   
protected $sitemap;

    public function
__construct(\XF\App $app, \XF\Entity\SitemapLog $sitemap = null)
    {
       
$this->app = $app;
       
$this->sitemap = $sitemap;
    }

    public function
outputSitemap(\XF\Http\Response $response, $counter = 0)
    {
       
$counter = intval($counter);

       
$sitemap = $this->sitemap;

       
$response->header('X-Robots-Tag', 'noindex');

        if (!
$sitemap)
        {
           
$response->httpCode(404);
           
$response->contentType('text/plain');
           
$response->body('no sitemap');
            return
$response;
        }

        if (
$counter <= 0)
        {
            if (
$sitemap->file_count > 1)
            {
               
$response->contentType('application/xml');
               
$response->setDownloadFileName('sitemap-index.xml', true);
               
$response->body($this->buildIndex($sitemap));
                return
$response;
            }

           
$counter = 1;
        }

       
$fileName = $sitemap->getAbstractedSitemapFileName($counter);
       
$fs = \XF::fs();
        if (
$fs->has($fileName))
        {
           
$response->contentType('application/xml');

            if (
$sitemap->is_compressed)
            {
               
$response->header('content-encoding', 'gzip');
            }

           
$response->setDownloadFileName(
               
$sitemap->file_count > 1 ? 'sitemap-' . $counter . '.xml' : 'sitemap.xml',
               
true
           
);

           
$stream = $fs->readStream($fileName);
           
$response->body($response->responseStream($stream));
        }
        else
        {
           
$response->httpCode(404);
           
$response->contentType('text/plain');
           
$response->body('invalid sitemap file');
        }

        return
$response;
    }

    public function
buildIndex(\XF\Entity\SitemapLog $sitemap)
    {
       
$output = '<?xml version="1.0" encoding="UTF-8"?>' . "\n"
           
. '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";

       
$options = $this->app->options();
       
$boardUrl = $options->boardUrl;

       
// Old format: /sitemap.php?c=%d -- Google doesn't like this, so force the rewrite-based format in all cases.
        // If the necessary rewrite configuration isn't available, this may fail, but equally, the ?c= format was
        // failing anyway.
       
$sitemapBase = $boardUrl . '/sitemap-%d.xml';

        for (
$i = 1; $i <= $sitemap->file_count; $i++)
        {
           
$url = sprintf($sitemapBase, $i);
           
$output .= "\t"
               
. '<sitemap>'
               
. '<loc>' . htmlspecialchars($url) . '</loc>'
               
. '<lastmod>' . gmdate(\DateTime::W3C, $sitemap->complete_date) . '</lastmod>'
               
. '</sitemap>' . "\n";
        }

       
$output .= '</sitemapindex>';

        return
$output;
    }
}