マニュアル目次 > 制作者向け

独自プラグインとの連携

独自プラグインのページを静的化の対象に入れる方法です。

3つの連携方法

方法使う場面
再生成を依頼するデータを保存したときに、特定のURLを作り直してほしい
URL一覧を提供する全ページ再生成のときに、自分のページを対象に入れてほしい
ページ数を算出する一覧のページ送りまで静的化してほしい
コードを書かずに済む方法もあります。 URLの形が決まっているなら 差分生成する内容 に登録するだけで足ります。CMS側に sitemap.xml を出力しているなら、URL収集 の「sitemap.xmlから収集」を有効にするだけでも対象に入ります。

1. 再生成を依頼する

独自プラグインからURLを指定して、生成のキューに積みます。

use BaserCore\Utility\BcContainer;
use HatStaticEngine\Service\StaticPublisherServiceInterface;

if (interface_exists(StaticPublisherServiceInterface::class)) {
    BcContainer::get()->get(StaticPublisherServiceInterface::class)->queue('/real_estates/');

    BcContainer::get()->get(StaticPublisherServiceInterface::class)->queue([
        '/real_estates/',
        '/real_estates/' . $entity->id . '/',
    ]);
}

interface_exists() で囲んでいるので、このプラグインが入っていない環境でも呼び出し側は壊れません。

2. URL一覧を提供する

全ページ再生成のときに、自分のプラグインが持つURLの一覧を渡します。

RealEstate/config/setting.php

return [
    'HatStaticEngine' => [
        'publicationProviders' => [
            'RealEstate' => \RealEstate\Service\RealEstatePublicationProvider::class,
        ],
    ],
];
namespace RealEstate\Service;

use HatStaticEngine\Service\StaticPublicationProviderInterface;

class RealEstatePublicationProvider implements StaticPublicationProviderInterface
{
    public function getUrls(): array
    {
        // 例: ['/real_estates/', '/real_estates/1/', '/real_estates/2/']
    }
}

1つのProviderが例外を投げても全生成は止まりません(ログに記録して次へ進みます)。

3. ページ数を算出する

上のProviderは「URLの一覧」を返す仕組みなので、総件数から作るページ数が決まるもの(ページ送り・カテゴリ別一覧など)には向きません。その場合は列挙クラスを登録します。

件数の取得元はDBでもAPIでも構いません。このインターフェースが求めるのは件数だけです。

RealEstate/config/setting.php

return [
    'HatStaticEngine' => [
        'publicationEnumerators' => [
            'RealEstate' => \RealEstate\Service\RealEstateEnumerator::class,
        ],
    ],
];
namespace RealEstate\Service;

use Cake\Datasource\EntityInterface;
use HatStaticEngine\Service\Expander\PublicationEnumeratorInterface;

class RealEstateEnumerator implements PublicationEnumeratorInterface
{
    public function supports(string $sourceType, string $publicationType): bool
    {
        return $sourceType === 'RealEstate.RealEstates'
            && $publicationType === 'Pagination';
    }

    public function enumerate(EntityInterface $mapping, array $fixedVars, bool $needsCount): array
    {
        return [[
            'vars' => [],
            'total' => $needsCount ? $this->countPublished() : 0,
            'list_count' => 20,
            'pager_paths' => ['/real_estates/index', '/real_estates/'],
        ]];
    }
}
返す値意味
varsURLパターンの変数に入れる値。カテゴリ別なら ['category' => 'used'] のように、対象の数だけ配列の要素を返します。
total総件数。$needsCount が false のときは 0 で構いません(不要なCOUNTクエリを避けるためのフラグです)。
list_count1ページあたりの件数。total ÷ list_count でページ数が決まります。
pager_pathsそのプラグインのページャが出力し得るCMS側のパス。ページャリンクを静的サイト用に書き換えるために使います。

差分生成の条件に指定する

独自プラグインのモデルを 差分生成する条件 の対象にするには、そのモデルが baserCMS のイベント機構に対応している(保存・削除の通知を発行する)必要があります。対応していないモデル名を入力した場合は、保存時にエラーで弾かれます。その場合は上の「再生成を依頼する」方法を使ってください。