concrete5でJSのライブラリなどを読み込ませたい場合、アセットを登録して読み込む。
で、ブロックの一部のカスタムテンプレートでjsのちょっとしたライブラリを読み込みたい時(たとえば、PageListブロックにスライダーライブラリを入れたいとか)があるけど、カスタムテンプレートのview.phpで
application/page_list/templates/with_slider/view.php
$this->requireAsset('javascript', 'hogehoge')
みたいにしたら、一応読み込まれる。
一応読み込まれるんだけど、それはブロックキャッシュがオフになってるときだけのことで、ブロックキャッシュがオンになってる状態だと読み込まれない。エラーも出ない。
例えば、ログインしてるときは読み込まれて、ログアウトした途端に読み込まれなくなるみたいなことが起こって悩む。悩んだ。
悩むのはまだいいほうで、最悪、本番環境だけで読み込まれなかったりしてやばい。
本家コミュニティ(英語)に解決法が載っていた。view.phpに書くのはやめて、ブロックのcontroller.phpのほうでカスタムテンプレートを判別して出し分けするしかないらしい。
application/page_liset/controller.php
<?php
namespace Application\Block\PageList;
class Controller extends \Concrete\Block\PageList\Controller
{
public function registerViewAssets($outputContent = '')
{
// カスタムテンプレートごとにassetの呼び出しを行う
if (is_object($this->block) && $this->block->getBlockFilename() == 'with_slider') {
$this->requireAsset('javascript', 'hogehoge');
}
}
}
のようにしたら、動くようになった。