otakoyi/sitemap

Asgardcms CMS Sitemap

dev-master 2018-09-28 14:49 UTC

This package is not auto-updated.

Last update: 2024-09-23 06:50:03 UTC


README

此包可以生成网站地图,无需您手动添加URL。
通常,网站地图不知道已安装的模块和数据库结构。每个模块都应该监听事件并将其数据放入网站地图集合中。

  • 可以通过cron作业或通过artisan命令 php artisan sitemap:generate 手动运行网站地图。
  • 它发送XmlSitemapBuilding事件。此事件具有SitemapCollection实例。
  • 每个模块都应该订阅此事件并添加其数据。

以下是一个示例

运行网站地图

 \Modules\Sitemap\Console\SitemapGenerateCommand::handle
 
 
 public function handle()
 {
     $sitemaps = new SitemapCollection(); // Create collection

     event(new XmlSitemapBuilding($sitemaps)); // assign it into event

    // after modules added its data to collection, generate sitemap.xml

     $this->generate($sitemaps);
 }
 

如何使模块订阅此事件

打开您的服务提供商,并在boot()方法中订阅事件 `\Modules\Sitemap\Events\XmlSitemapBuilding::class`。

 if (class_exists(\Modules\Sitemap\Events\XmlSitemapBuilding::class)) {
     $this->app['events']->listen(
         \Modules\Sitemap\Events\XmlSitemapBuilding::class,
         \Modules\Catalog\Events\Handlers\RegisterSitemap::class
     );
    }

为此事件创建处理程序 `\Modules\Catalog\Events\Handlers\RegisterSitemap::class`。

并将您的实体添加到集合中

<?php 
namespace Modules\Catalog\Events\Handlers;

use Modules\Catalog\Entities\CategoriesSitemap;
use Modules\Catalog\Entities\ProductsSitemap;
use Modules\Sitemap\Events\XmlSitemapBuilding;

class RegisterSitemap
{
    public function handle(XmlSitemapBuilding $collection)
    {
        $collection->add(new CategoriesSitemap()); 
        $collection->add(new ProductsSitemap());
    }
}

CategoriesSitemap应实现 Modules\Sitemap\Contracts\Sitemap 接口


<?php

namespace Modules\Catalog\Entities;

use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
use Modules\Sitemap\Contracts\Sitemap;
use Modules\Sitemap\Entities\XmlTags\Changefreq;
use Modules\Sitemap\Entities\XmlTags\Url;

class CategoriesSitemap implements Sitemap
{
    public function getItems()
    {
        $priority = 0.7;
        $res = [];

        $items = Categories::where('active', 1)->get(['id','created_at', 'updated_at']);


        $prefix = config('catalog.category.url_prefix');

        foreach (LaravelLocalization::getSupportedLocales() as $locale => $language) {
            foreach ($items as $item) {
                $loc = LaravelLocalization::localizeUrl($prefix . $item->slug);
                $lastmod = empty($item->updated_at) ? $item->created_at : $item->updated_at;
                $res[] = new Url($loc, $lastmod->toIso8601String(), Changefreq::DAILY, $priority);
            }

        }

        return $res;
    }
}