🍖

CKEditorのリンクをちゃんと調節する2

2024/06/27に公開

あれこれやりたい

かたつむりくんさんの記事を参考にCKEditorのリンクボタンに「別タブで開く」を追加した

https://tinybeans.net/blog/2024/04/craft-cms-ckeditor-blank

そして前回の記事でエントリをリンクするオプションを消した

https://zenn.dev/shin_dev/articles/23716366125eaf

そうすると

target=_blankのボタンが消えた...

.ck-list__item:nth-child(1){
    display: none !important;
}

どうやらボタンにも掛かっているようだな...。

仕方ないのでちゃんとモジュール化したものを作ってみる

モジュール作成

ddevでやってます。

ddev ssh
php craft make module

対話していく。

Module ID: (kebab-case) ck-config
Base module class name: (PascalCase) [Module] CkConfig
Module location: module/
What should the root namespace for module/ be? [module]

Should the module be loaded during app initialization? (yes|no) [no]:no

最後noにしちゃったんですが後述の追記に関わってくるのかな?
yesにしときゃよかった。

モジュールをこうする。

module/CkConfig.php
<?php

namespace module;

use Craft;
use yii\base\Module as BaseModule;

use craft\ckeditor\events\DefineLinkOptionsEvent;
use craft\ckeditor\Field as CkEditorField;
use yii\base\Event;

/**
 * CkConfig module
 *
 * @method static CkConfig getInstance()
 */
class CkConfig extends BaseModule
{
    public function init(): void
    {
        Craft::setAlias('@module', __DIR__);

        // Set the controllerNamespace based on whether this is a console or web request
        if (Craft::$app->request->isConsoleRequest) {
            $this->controllerNamespace = 'module\\console\\controllers';
        } else {
            $this->controllerNamespace = 'module\\controllers';
        }

        parent::init();

        $this->attachEventHandlers();

        // Any code that creates an element query or loads Twig should be deferred until
        // after Craft is fully initialized, to avoid conflicts with other plugins/modules
        Craft::$app->onInit(function() {
            
        });
    }

    private function attachEventHandlers(): void
    {
        // Register event handlers here ...
        // (see https://craftcms.com/docs/5.x/extend/events.html to get started)
        Event::on(
            CkEditorField::class,
            CkEditorField::EVENT_DEFINE_LINK_OPTIONS,
            function(DefineLinkOptionsEvent $event) {
                // Remove Craft's injected links
                $event->linkOptions = [];
            }
        );
    }
}

Redactorのときに使うイベントはRegisterLinkOptionsEventだったんだけど
CKでそれに当たるのはDefineLinkOptionsEvent(だと思う)

構成は全く同じでOK。
これで想定の動きになるかと思いきや全く動作していない。
よく見るとapp initializationのタイミングでイベントハンドラがアタッチされてない。
上のアタッチ処理をonInitに入れてあげる。

//$this->attachEventHandlers();

Craft::$app->onInit(function() {
    $this->attachEventHandlers();
});

あとapp.phpでbootstrapの実行時に読み込むようにする。

'bootstrap' => [
    'ck-config'
],

target=_blankが復活した!
けどプルダウンが消えた...けどWYSIWYG的に問題ないか。

おわり。

Discussion