Untitled

 avatar
unknown
php
3 years ago
5.3 kB
1
Indexable
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;

use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;

use App\Models\Town;
use App\Models\SeoPreset;
use App\Models\Blog;
use App\Models\Page;
use App\Models\Shop;
use App\Models\Brand;
use App\Models\Catalog;
use App\Models\Product;

class SitemapController extends Controller
{
  protected $xmlWriter;

  public function generate(Request $request)
  {

    $root_url = request()->root().'/';

    file_put_contents('sitemap.xml', '');

    $this->xmlWriter = new XMLWriter();
    $this->xmlWriter->openMemory();
    $this->xmlWriter->startDocument('1.0', 'UTF-8');

    $this->xmlWriter->startElement('urlset');
    $this->xmlWriter->writeAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
    $this->xmlWriter->writeAttribute('xmlns:xhtml', 'http://www.w3.org/1999/xhtml');

      $this->createUrlElement($root_url, date('c'), '0.9');
      $this->createUrlElement($root_url.'ru/', date('c'), '0.9');

      $towns = Town::select('slug')->where('show',1)->get();
      $presets = SeoPreset::select('slug')->where('active',1)->get();
      $catalogs = Catalog::select('slug')->where('inmenu',1)->get(); // TODO insitemap ?

      // Towns main page
      foreach ($towns as $town) {
        $this->createUrlElement($root_url.$town->slug.'/', date('c'), '0.8');
        $this->createUrlElement($root_url.'ru/'.$town->slug.'/', date('c'), '0.8');
      }

      // Blog
      foreach ($blogs = Blog::select('slug','updated_at')->where('show',1)->get() as $blog) {
        $this->createUrlElement($root_url.$blog->slug.'/', $blog->updated_at->format('c'), '0.5');
        $this->createUrlElement($root_url.'ru/'.$blog->slug.'/', $blog->updated_at->format('c'), '0.5');
      }

      // Page
      foreach ($pages = Page::select('slug','updated_at')->where('show',1)->get() as $page) {
        $this->createUrlElement($root_url.$page->slug.'/', $page->updated_at->format('c'), '0.5');
        $this->createUrlElement($root_url.'ru/'.$page->slug.'/', $page->updated_at->format('c'), '0.5');
      }

      // Shop
      foreach ($shops = Shop::select('slug','updated_at')->where('show',1)->get() as $shop) {
        $this->createUrlElement($root_url.'/shop/'.$shop->slug.'/', $shop->updated_at->format('c'), '0.6');
        $this->createUrlElement($root_url.'ru/shop/'.$shop->slug.'/', $shop->updated_at->format('c'), '0.6');
      }

      // Brand
      foreach ($brands = Brand::select('slug','updated_at')->where('show',1)->get() as $brand) {
        $this->createUrlElement($root_url.'/brands/'.$brand->slug.'/', $brand->updated_at->format('c'), '0.6');
        $this->createUrlElement($root_url.'ru/brands/'.$brand->slug.'/', $brand->updated_at->format('c'), '0.6');
      }

      // Towns & Presets
      foreach ($presets as $preset) {
        $prst_url = substr($preset->slug, 1);
        $this->createUrlElement($root_url.$prst_url, date('c'), '0.7');
        $this->createUrlElement($root_url.'ru/'.$prst_url, date('c'), '0.7');
        foreach ($towns as $town) {
          $this->createUrlElement($root_url.$town->slug.'/'.$prst_url, date('c'), '0.7');
          $this->createUrlElement($root_url.'ru/'.$town->slug.'/'.$prst_url, date('c'), '0.7');
        }
      }

      // Towns & Catalogs
      foreach ($catalogs as $catalog) {
        $this->createUrlElement($root_url.$catalog->slug, date('c'), '0.7');
        $this->createUrlElement($root_url.'ru/'.$catalog->slug, date('c'), '0.7');
        foreach ($towns as $town) {
          $this->createUrlElement($root_url.$town->slug.'/'.$catalog->slug, date('c'), '0.7');
          $this->createUrlElement($root_url.'ru/'.$town->slug.'/'.$catalog->slug, date('c'), '0.7');
        }
      }

      // Products
      $parents = Product::select('articul')->whereNull('parent_id')->pluck('articul')->toArray();
      $products = Product::select('slug','updated_at')->whereIn('articul',$parents)->where('parent_id','>',0)->where('show',1)->get();

      foreach ($products as $product) {
        $this->createUrlElement($root_url.$product->slug.'/', $product->updated_at->format('c'), '0.8');
        $this->createUrlElement($root_url.'ru/'.$product->slug.'/', $product->updated_at->format('c'), '0.8');
      }

    $this->xmlWriter->endElement(); // urlset

    // Final flush to make sure we haven't missed anything
    file_put_contents('sitemap.xml', $this->xmlWriter->flush(true), FILE_APPEND);

    return 'OK';
  }

  private function createUrlElement($url, $date, $prority)
  {
    $this->xmlWriter->startElement('url');

      $this->xmlWriter->startElement('loc');
        $this->xmlWriter->text($url);
      $this->xmlWriter->endElement();

      $this->xmlWriter->startElement('lastmod');
        $this->xmlWriter->text($date); // last date
      $this->xmlWriter->endElement();

      $this->xmlWriter->startElement('changefreq');
        $this->xmlWriter->text('daily');
      $this->xmlWriter->endElement();

      $this->xmlWriter->startElement('priority');
        $this->xmlWriter->text($prority);
      $this->xmlWriter->endElement();

    $this->xmlWriter->endElement(); //url

    return true;
  }

}