From d7b5f97ce255308a199a95816593818481ecd15b Mon Sep 17 00:00:00 2001 From: jacobdekeizer Date: Tue, 1 Nov 2022 12:23:13 +0100 Subject: [PATCH 1/7] Add multisite and images support --- CHANGELOG.md | 9 ++- README.md | 58 ++++++++++++++---- ServiceProvider.php | 11 ++++ classes/SitemapGenerator.php | 69 +++++++++++----------- classes/contracts/ConfigResolver.php | 12 ++++ classes/dto/Definition.php | 30 ++++++++++ classes/dto/ImageDefinition.php | 45 ++++++++++++++ classes/dto/SitemapConfig.php | 42 +++++++++++++ classes/resolvers/StaticConfigResolver.php | 27 +++++++++ composer.json | 2 +- config.php | 12 ++++ updates/version.yaml | 1 + 12 files changed, 270 insertions(+), 48 deletions(-) create mode 100644 classes/contracts/ConfigResolver.php create mode 100644 classes/dto/ImageDefinition.php create mode 100644 classes/dto/SitemapConfig.php create mode 100644 classes/resolvers/StaticConfigResolver.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 5223a6e..07fbb08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.2.0] + +* Add support for images. +* Add sitemap config resolver to configure the sitemap config on runtime. This can be useful for multisite projects. +* Fixed bug where sitemap would never regenerate when sitemap file exists. +* Add support for oc 1 + ## [2.0.0] - 2021-07-13 -* Add support for PHP 7.4 or higher. Please review plugin configuration, check README.md +* Add support for PHP 7.4 or higher. Please review plugin configuration, check README.md ## [1.1.0] - 2021-05-28 diff --git a/README.md b/README.md index c783e57..c63a113 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ To generate sitemap items you can create your own sitemap definition generator. Example: -``` +```php final class DefinitionGenerator implements Contracts\DefinitionGenerator { public function getDefinitions(): Definitions @@ -52,7 +52,7 @@ final class DefinitionGenerator implements Contracts\DefinitionGenerator Register your generator in the `boot` method of your plugin class: -``` +```php Event::listen(Contracts\SitemapGenerator::GENERATE_EVENT, static function(): DefinitionGenerator { return new DefinitionGenerator(); }); @@ -60,10 +60,10 @@ Event::listen(Contracts\SitemapGenerator::GENERATE_EVENT, static function(): Def You can also register multiple generators: -``` +```php Event::listen(Contracts\SitemapGenerator::GENERATE_EVENT, static function(): array { return [ - new DefinitionGeneratorOne(), + new DefinitionGeneratorOne(), new DefinitionGeneratorTwo(), // .. ]; @@ -74,13 +74,13 @@ Event::listen(Contracts\SitemapGenerator::GENERATE_EVENT, static function(): arr You can fire an event to invalidate the sitemap cache -``` +```php Event::fire(Contracts\SitemapGenerator::INVALIDATE_CACHE_EVENT); ``` Or resolve the generator instance and use the invalidate cache method -``` +```php /** @var SitemapGenerator $sitemapGenerator */ $sitemapGenerator = resolve(Contracts\SitemapGenerator::class); $sitemapGenerator->invalidateCache(); @@ -90,14 +90,14 @@ $sitemapGenerator->invalidateCache(); First resolve the sitemap generator -``` +```php /** @var SitemapGenerator $sitemapGenerator */ $sitemapGenerator = resolve(Contracts\SitemapGenerator::class); ``` ### Add definitions -``` +```php $sitemapGenerator->addDefinition( (new Definition()) ->setUrl('example.com/new-url') @@ -111,7 +111,7 @@ $sitemapGenerator->addDefinition( > Note, definitions are updated by their URL. -``` +```php $sitemapGenerator->updateDefinition( (new Definition()) ->setUrl('example.com/page/1') @@ -124,7 +124,7 @@ $sitemapGenerator->updateDefinition( ### Update or add definitions -``` +```php $sitemapGenerator->updateOrAddDefinition( (new Definition()) ->setUrl('example.com/create-or-add') @@ -137,13 +137,13 @@ $sitemapGenerator->updateOrAddDefinition( ### Delete definitions -``` +```php $sitemapGenerator->deleteDefinition('example.com/new-url'); ``` ## Exclude URLs from sitemap -``` +```php Event::listen(SitemapGenerator::EXCLUDE_URLS_EVENT, static function (): array { return [ 'example.com/page/1', @@ -162,11 +162,43 @@ php artisan vendor:publish --provider="Vdlp\Sitemap\ServiceProvider" --tag="conf You can change the amount of seconds the sitemap is cached in your `.env` file. You can also cache the sitemap forever. - ``` + ```dotenv VDLP_SITEMAP_CACHE_TIME = 3600 VDLP_SITEMAP_CACHE_FOREVER = false ``` +### ConfigResolver + +Optionally you can override how the sitemap config should be resolved by giving your own ConfigResolver implementation in the config file. +This can be useful for multisite projects, where the sitemap should be cached per domain. + +```php +use Illuminate\Contracts\Config\Repository; +use Illuminate\Http\Request; +use Vdlp\Sitemap\Classes\Contracts\ConfigResolver; +use Vdlp\Sitemap\Classes\Dto\SitemapConfig; + +final class MultisiteConfigResolver implements ConfigResolver +{ + public function __construct(private Repository $config, private Request $request) + { + } + + public function getConfig(): SitemapConfig + { + $domain = $this->request->getHost(); + + return new SitemapConfig( + 'vdlp_sitemap_cache_' . $domain, + 'vdlp_sitemap_definitions_' . $domain, + sprintf('vdlp/sitemap/sitemap_%s.xml', $domain), + (int) $this->config->get('sitemap.cache_time', 3600), + (bool) $this->config->get('sitemap.cache_forever', false) + ); + } +} +``` + ## Issues If you have issues using this plugin. Please create an issue on GitHub or contact us at [octobercms@vdlp.nl](). diff --git a/ServiceProvider.php b/ServiceProvider.php index 275039d..623fd87 100644 --- a/ServiceProvider.php +++ b/ServiceProvider.php @@ -4,6 +4,8 @@ namespace Vdlp\Sitemap; +use Illuminate\Contracts\Config\Repository; +use Illuminate\Contracts\Foundation\Application; use Illuminate\Support\ServiceProvider as ServiceProviderBase; use Vdlp\Sitemap\Classes\Contracts; use Vdlp\Sitemap\Classes\SitemapGenerator; @@ -19,6 +21,15 @@ public function boot(): void public function register(): void { + $this->mergeConfigFrom(__DIR__ . '/config.php', 'sitemap'); + $this->app->alias(SitemapGenerator::class, Contracts\SitemapGenerator::class); + + $this->app->bind(Contracts\ConfigResolver::class, static function (Application $app): Contracts\ConfigResolver { + /** @var Repository $config */ + $config = $app->make(Repository::class); + + return $app->make($config->get('sitemap.config_resolver')); + }); } } diff --git a/classes/SitemapGenerator.php b/classes/SitemapGenerator.php index 9cc11be..c4017e1 100644 --- a/classes/SitemapGenerator.php +++ b/classes/SitemapGenerator.php @@ -9,30 +9,28 @@ use Illuminate\Contracts\Events\Dispatcher; use Psr\SimpleCache\InvalidArgumentException; use RuntimeException; +use Vdlp\Sitemap\Classes\Contracts\ConfigResolver; use Vdlp\Sitemap\Classes\Contracts\DefinitionGenerator; use Vdlp\Sitemap\Classes\Contracts\SitemapGenerator as SitemapGeneratorInterface; use Vdlp\Sitemap\Classes\Dto\Definition; use Vdlp\Sitemap\Classes\Dto\Definitions; +use Vdlp\Sitemap\Classes\Dto\SitemapConfig; use Vdlp\Sitemap\Classes\Exceptions\DtoNotFound; use Vdlp\Sitemap\Classes\Exceptions\InvalidGenerator; final class SitemapGenerator implements SitemapGeneratorInterface { - private const CACHE_KEY_SITEMAP = 'vdlp_sitemap_cache'; - private const CACHE_DEFINITIONS = 'vdlp_sitemap_definitions'; - private const VDLP_SITEMAP_PATH = 'vdlp/sitemap/sitemap.xml'; - private Repository $cache; + private Dispatcher $event; - private int $cacheTime; - private bool $cacheForever; - public function __construct(Repository $cache, Dispatcher $event) + private SitemapConfig $sitemapConfig; + + public function __construct(Repository $cache, Dispatcher $event, ConfigResolver $configResolver) { $this->cache = $cache; $this->event = $event; - $this->cacheTime = (int) config('sitemap.cache_time', 3600); - $this->cacheForever = (bool) config('sitemap.cache_forever', false); + $this->sitemapConfig = $configResolver->getConfig(); } public function invalidateCache(): bool @@ -46,12 +44,12 @@ public function invalidateCache(): bool public function generate(): void { try { - $fromCache = $this->cache->has(self::CACHE_KEY_SITEMAP); + $fromCache = $this->cache->has($this->sitemapConfig->getCacheKeySitemap()); } catch (InvalidArgumentException $e) { $fromCache = false; } - $path = storage_path(self::VDLP_SITEMAP_PATH); + $path = storage_path($this->sitemapConfig->getCacheFilePath()); $fileExists = file_exists($path); @@ -60,19 +58,19 @@ public function generate(): void $fromCache = false; } - if ($fromCache || file_exists($path)) { + if ($fromCache && file_exists($path)) { return; } $this->createXmlFile($this->rememberDefinitionsFromCache(), $path); - $this->updateCache(self::CACHE_KEY_SITEMAP, true); + $this->updateCache($this->sitemapConfig->getCacheKeySitemap(), true); } public function output(): void { header('Content-Type: application/xml'); - $handle = fopen(storage_path(self::VDLP_SITEMAP_PATH), 'rb'); + $handle = fopen(storage_path($this->sitemapConfig->getCacheFilePath()), 'rb'); if ($handle === false) { exit(1); @@ -110,7 +108,7 @@ public function updateDefinition(Definition $definition, ?string $oldUrl = null) throw new DtoNotFound(); } - $this->updateCache(self::CACHE_DEFINITIONS, $definitions); + $this->updateCache($this->sitemapConfig->getCacheKeyDefinitions(), $definitions); $this->invalidateSitemapCache(); } @@ -122,7 +120,7 @@ public function addDefinition(Definition $definition): void $definitions = $this->rememberDefinitionsFromCache(); $definitions->addItem($definition); - $this->updateCache(self::CACHE_DEFINITIONS, $definitions); + $this->updateCache($this->sitemapConfig->getCacheKeyDefinitions(), $definitions); $this->invalidateSitemapCache(); } @@ -139,7 +137,7 @@ public function deleteDefinition(string $url): void { $definitions = $this->rememberDefinitionsFromCache(); $definitions->removeDefinitionByUrl($url); - $this->updateCache(self::CACHE_DEFINITIONS, $definitions); + $this->updateCache($this->sitemapConfig->getCacheKeyDefinitions(), $definitions); $this->invalidateSitemapCache(); } @@ -192,7 +190,7 @@ private function createXmlFile(Definitions $definitions, string $path): void } fwrite($file, ''); - fwrite($file, ''); + fwrite($file, ''); /** @var Dto\Definition $definition */ foreach ($definitions->getItems() as $definition) { @@ -214,6 +212,17 @@ private function createXmlFile(Definitions $definitions, string $path): void $xml .= '' . $definition->getChangeFrequency() . ''; } + foreach ($definition->getImages() as $image) { + $xml .= ''; + $xml .= '' . $image->getUrl() . ''; + + if ($image->getTitle() !== null) { + $xml .= '' . $image->getTitle() . ''; + } + + $xml .= ''; + } + $xml .= ''; fwrite($file, $xml); @@ -284,47 +293,41 @@ private function flattenArray(array $array): array return $flatArray; } - /** - * @param mixed $value - */ - private function updateCache(string $key, $value): void + private function updateCache(string $key, mixed $value): void { - if ($this->cacheForever) { + if ($this->sitemapConfig->isCacheForever()) { $this->cache->forever($key, $value); } - $this->cache->put($key, $value, $this->cacheTime); + $this->cache->put($key, $value, $this->sitemapConfig->getCacheTime()); } private function rememberDefinitionsFromCache(): Definitions { /** @var Definitions $definitions */ - $definitions = $this->rememberFromCache(self::CACHE_DEFINITIONS, function (): Definitions { + $definitions = $this->rememberFromCache($this->sitemapConfig->getCacheKeyDefinitions(), function (): Definitions { return $this->getDefinitions(); }); return $definitions; } - /** - * @return mixed - */ - private function rememberFromCache(string $key, Closure $closure) + private function rememberFromCache(string $key, Closure $closure): mixed { - if ($this->cacheForever) { + if ($this->sitemapConfig->isCacheForever()) { return $this->cache->rememberForever($key, $closure); } - return $this->cache->remember($key, $this->cacheTime, $closure); + return $this->cache->remember($key, $this->sitemapConfig->getCacheTime(), $closure); } private function invalidateSitemapCache(): bool { - return $this->cache->forget(self::CACHE_KEY_SITEMAP); + return $this->cache->forget($this->sitemapConfig->getCacheKeySitemap()); } private function invalidateDefinitionsCache(): bool { - return $this->cache->forget(self::CACHE_DEFINITIONS); + return $this->cache->forget($this->sitemapConfig->getCacheKeyDefinitions()); } } diff --git a/classes/contracts/ConfigResolver.php b/classes/contracts/ConfigResolver.php new file mode 100644 index 0000000..f2a2bdd --- /dev/null +++ b/classes/contracts/ConfigResolver.php @@ -0,0 +1,12 @@ +modifiedAt; } + + /** + * @return ImageDefinition[] + */ + public function getImages(): array + { + return $this->images; + } + + /** + * @param ImageDefinition[] $images + */ + public function setImages(array $images): Definition + { + $this->images = $images; + + return $this; + } + + public function addImage(ImageDefinition $image): Definition + { + $this->images[] = $image; + + return $this; + } } diff --git a/classes/dto/ImageDefinition.php b/classes/dto/ImageDefinition.php new file mode 100644 index 0000000..4c9eb8f --- /dev/null +++ b/classes/dto/ImageDefinition.php @@ -0,0 +1,45 @@ +url; + } + + public function setUrl(string $url): ImageDefinition + { + $this->url = $url; + + return $this; + } + + public function getTitle(): ?string + { + return $this->title; + } + + public function setTitle(?string $title): ImageDefinition + { + $this->title = $title; + + return $this; + } +} diff --git a/classes/dto/SitemapConfig.php b/classes/dto/SitemapConfig.php new file mode 100644 index 0000000..37e5da9 --- /dev/null +++ b/classes/dto/SitemapConfig.php @@ -0,0 +1,42 @@ +cacheKeySitemap; + } + + public function getCacheKeyDefinitions(): string + { + return $this->cacheKeyDefinitions; + } + + public function getCacheFilePath(): string + { + return $this->cacheFilePath; + } + + public function getCacheTime(): int + { + return $this->cacheTime; + } + + public function isCacheForever(): bool + { + return $this->cacheForever; + } +} diff --git a/classes/resolvers/StaticConfigResolver.php b/classes/resolvers/StaticConfigResolver.php new file mode 100644 index 0000000..dd95813 --- /dev/null +++ b/classes/resolvers/StaticConfigResolver.php @@ -0,0 +1,27 @@ +repository->get('sitemap.cache_time', 3600), + (bool) $this->repository->get('sitemap.cache_forever', false) + ); + } +} diff --git a/composer.json b/composer.json index 6ab63f0..5fc0635 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "require": { "php": "^8.0.2", "composer/installers": "^1.0 || ^2.0", - "october/system": "^2.2" + "october/system": "^1.1 || ^2.2" }, "suggest": { "vdlp/oc-sitemapgenerators-plugin": "Adds pre-built sitemap generators for your October CMS website." diff --git a/config.php b/config.php index c3c6230..fc8c528 100644 --- a/config.php +++ b/config.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Vdlp\Sitemap\Classes\Resolvers\StaticConfigResolver; + return [ /* @@ -28,4 +30,14 @@ 'cache_forever' => env('VDLP_SITEMAP_CACHE_FOREVER', false), + /* + |-------------------------------------------------------------------------- + | Config resolver + |-------------------------------------------------------------------------- + | + | Configure how the sitemap config should be resolved. + | + */ + 'config_resolver' => StaticConfigResolver::class, + ]; diff --git a/updates/version.yaml b/updates/version.yaml index 95fa0a7..ad41ad4 100644 --- a/updates/version.yaml +++ b/updates/version.yaml @@ -5,3 +5,4 @@ v1.0.3: Code cleanup v1.1.0: Update plugin dependencies v2.0.0: "Add support for PHP 7.4 or higher. Please review plugin configuration, check README.md" v2.1.0: "Maintenance update. Check CHANGELOG.md for details." +v2.2.0: "Add sitemap config resolver and images. Fixed bug where sitemap would never regenerate when sitemap file exists." From 0fdbf0e6d63932076380a63f667836e7946eba7b Mon Sep 17 00:00:00 2001 From: jacobdekeizer Date: Wed, 2 Nov 2022 09:22:57 +0100 Subject: [PATCH 2/7] Escape illegal xml characters in sitemap --- CHANGELOG.md | 3 ++- classes/SitemapGenerator.php | 10 +++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07fbb08..9dfb842 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,8 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Add support for images. * Add sitemap config resolver to configure the sitemap config on runtime. This can be useful for multisite projects. +* Add support for oc 1. * Fixed bug where sitemap would never regenerate when sitemap file exists. -* Add support for oc 1 +* Escape illegal xml characters in loc and title elements. ## [2.0.0] - 2021-07-13 diff --git a/classes/SitemapGenerator.php b/classes/SitemapGenerator.php index c4017e1..95799a5 100644 --- a/classes/SitemapGenerator.php +++ b/classes/SitemapGenerator.php @@ -197,7 +197,7 @@ private function createXmlFile(Definitions $definitions, string $path): void $xml = ''; if ($definition->getUrl() !== null) { - $xml .= '' . $definition->getUrl() . ''; + $xml .= '' . htmlspecialchars($definition->getUrl(), ENT_XML1, 'UTF-8') . ''; } if ($definition->getModifiedAt() !== null) { @@ -214,10 +214,14 @@ private function createXmlFile(Definitions $definitions, string $path): void foreach ($definition->getImages() as $image) { $xml .= ''; - $xml .= '' . $image->getUrl() . ''; + $xml .= '' + . htmlspecialchars($image->getUrl(), ENT_XML1, 'UTF-8') + . ''; if ($image->getTitle() !== null) { - $xml .= '' . $image->getTitle() . ''; + $xml .= '' + . htmlspecialchars($image->getTitle(), ENT_XML1, 'UTF-8') + . ''; } $xml .= ''; From 5604d89b1d52a1f0d5639208b6ec5446029f49f6 Mon Sep 17 00:00:00 2001 From: jacobdekeizer Date: Wed, 2 Nov 2022 15:44:00 +0100 Subject: [PATCH 3/7] Improve exception logging and show 500 error when an error occurs --- CHANGELOG.md | 1 + routes.php | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9dfb842..b4c3253 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Add support for oc 1. * Fixed bug where sitemap would never regenerate when sitemap file exists. * Escape illegal xml characters in loc and title elements. +* Log exception with stack trace and show 500 error when an error occurs. ## [2.0.0] - 2021-07-13 diff --git a/routes.php b/routes.php index 7f4a9bb..76fab2a 100644 --- a/routes.php +++ b/routes.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Routing; use Psr\Log\LoggerInterface; use Vdlp\Sitemap\Classes\Contracts\SitemapGenerator; @@ -9,15 +10,19 @@ /** @var Routing\Router $router */ $router = resolve(Routing\Router::class); -$router->get('sitemap.xml', static function (): void { +$router->get('sitemap.xml', static function (ResponseFactory $responseFactory): mixed { try { /** @var SitemapGenerator $generator */ $generator = resolve(SitemapGenerator::class); $generator->generate(); $generator->output(); - } catch (Throwable $e) { + } catch (Throwable $throwable) { /** @var LoggerInterface $log */ $log = resolve(LoggerInterface::class); - $log->error('Vdlp.Sitemap: Unable to serve sitemap.xml: ' . $e->getMessage()); + $log->error('Vdlp.Sitemap: Unable to serve sitemap.xml: ' . $throwable->getMessage(), [ + 'exception' => $throwable, + ]); + + return $responseFactory->make('', 500); } }); From fb963dadea512d1221def97b3aecf70104da1f1a Mon Sep 17 00:00:00 2001 From: jacobdekeizer Date: Thu, 3 Nov 2022 08:48:31 +0100 Subject: [PATCH 4/7] Add support priority of zero --- CHANGELOG.md | 1 + classes/SitemapGenerator.php | 2 +- classes/dto/Definition.php | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4c3253..712abf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Add support for images. * Add sitemap config resolver to configure the sitemap config on runtime. This can be useful for multisite projects. * Add support for oc 1. +* Add support for priority zero. * Fixed bug where sitemap would never regenerate when sitemap file exists. * Escape illegal xml characters in loc and title elements. * Log exception with stack trace and show 500 error when an error occurs. diff --git a/classes/SitemapGenerator.php b/classes/SitemapGenerator.php index 95799a5..57a5e03 100644 --- a/classes/SitemapGenerator.php +++ b/classes/SitemapGenerator.php @@ -205,7 +205,7 @@ private function createXmlFile(Definitions $definitions, string $path): void } if ($definition->getPriorityFloat() !== null) { - $xml .= '' . $definition->getPriorityFloat() . ''; + $xml .= '' . number_format($definition->getPriorityFloat(), 1) . ''; } if ($definition->getChangeFrequency() !== null) { diff --git a/classes/dto/Definition.php b/classes/dto/Definition.php index 936911a..cb82fac 100644 --- a/classes/dto/Definition.php +++ b/classes/dto/Definition.php @@ -56,7 +56,7 @@ public function getUrl(): ?string */ public function setPriority(?int $priority): Definition { - if ($priority >= 1 && $priority <= 10) { + if ($priority >= 0 && $priority <= 10) { $this->priority = $priority; return $this; From e5917e99e00cadff1f540d8b80efe0904ebb7fd2 Mon Sep 17 00:00:00 2001 From: Alwin Drenth Date: Tue, 15 Nov 2022 10:44:06 +0100 Subject: [PATCH 5/7] Add support for OC 1.1 and onwards --- README.md | 4 ++-- composer.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c63a113..1e9dd66 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,8 @@ ## Requirements -- PHP 8.0.2 or higher -- October CMS 2.x or 3.x +- PHP 8.0 or higher +- October CMS 1.1 or higher ## Usage diff --git a/composer.json b/composer.json index 5fc0635..c2eea2b 100644 --- a/composer.json +++ b/composer.json @@ -10,9 +10,9 @@ } ], "require": { - "php": "^8.0.2", + "php": "^8.0", "composer/installers": "^1.0 || ^2.0", - "october/system": "^1.1 || ^2.2" + "october/system": ">=1.1" }, "suggest": { "vdlp/oc-sitemapgenerators-plugin": "Adds pre-built sitemap generators for your October CMS website." From bd09e748060f48a36b1298913a4c31f02701a89e Mon Sep 17 00:00:00 2001 From: Alwin Drenth Date: Tue, 15 Nov 2022 10:49:03 +0100 Subject: [PATCH 6/7] Update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 712abf7..f18e624 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [2.2.0] +## [2.2.0] - 2022-11-15 * Add support for images. * Add sitemap config resolver to configure the sitemap config on runtime. This can be useful for multisite projects. From 4cc794dd6d86f655fb4e55b675e2da0355ab55ab Mon Sep 17 00:00:00 2001 From: Alwin Drenth Date: Tue, 15 Nov 2022 10:51:07 +0100 Subject: [PATCH 7/7] Add allow-plugins configuration to composer.json --- composer.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/composer.json b/composer.json index c2eea2b..4609a92 100644 --- a/composer.json +++ b/composer.json @@ -30,5 +30,10 @@ ".github", ".gitignore" ] + }, + "config": { + "allow-plugins": { + "composer/installers": true + } } }