EC-CUBE4で商品一覧を無限スクロールに対応するプラグインを作る方法です。
まずは以下のコマンドでプラグインの雛形を作ります。
プラグインコードはなんでも良いのですが、今回は「InfiniteScroll」にしてください。
bin/console eccube:plugin:generate
無限スクロールの実装
まずは無限スクロールをjavascriptで実装します。
自動生成されたプラグイン一式内にResource/tempalte/default/jsディレクトリを作り、以下のscript.twigファイルを設置して下さい。
{% block javascript %}
<script src="//unpkg.com/infinite-scroll@3/dist/infinite-scroll.pkgd.min.js"></script>
<script>
$(function () {
var nextURL;
function updateNextURL(doc) {
nextURL = $(doc).find('ul.ec-pager a:contains("次へ")').attr('href');
// 2ページ目以降のカートボタンが動作しないので非表示
$(doc).find('li.ec-shelfGrid__item form, li.ec-shelfGrid__item .ec-productRole__btn').hide();
}
updateNextURL(document);
var $container = $('.ec-layoutRole__main').infiniteScroll({
path: function() {
return nextURL;
},
append: '.ec-shelfRole',
history: true,
hideNav: '.ec-pagerRole',
});
$container.on('load.infiniteScroll', function(event, response) {
updateNextURL(response);
});
});
</script>
{% endblock %}
無限スクロール対応すると2ページ目以降の「カートに入れる」ボタンが機能しないのでボタンを非表示にしています。
javascriptを商品一覧ページで出力
上記で作成したjavascriptを商品一覧ページで出力させるようにEvent.phpにイベントを登録します。
<?php
namespace Plugin\InfiniteScroll;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Eccube\Event\TemplateEvent;
class Event implements EventSubscriberInterface
{
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'Product/list.twig' => 'addAsset'
];
}
public function addAsset(TemplateEvent $event)
{
$event->addSnippet('@InfiniteScroll/default/js/script.twig');
}
}
商品一覧ページ用のテンプレートファイル「Product/list.twig」にjavascriptを読み込ませるようイベントで登録しています。
$event->addSnippetでjavascriptのパスを指定するとページの下部にjavascriptが出力されるようになります。
プラグインのインストールと有効化
以上で完成です。
プラグインのインストールと有効化を行うと商品一覧ページにて無限スクロールが実行されます。
このプラグインのファイル一式はこちら。
Infinite Scrollのライセンスについて
Infinite Scrollを商用で使用する場合、有料ライセンスが必要です。
ライセンスについてはこちら。

“infinite-scrollを利用している”という説明が一切無い上、”無限スクロールをjavascriptで実装します”とあったので、てっきり自前で処理しているのかと思ってしまいました。
カートボタンが使えないのは痛いですね。