概要
会員限定機能を追加できるプラグインを作成しました。
https://www.ec-cube.net/products/detail.php?product_id=2671
こちらに会員限定商品のみをプラグインやコアファイルを弄ることなく一覧で表示する方法のご紹介です。
「mtb_product_list_order_by」テーブルに1項目を追加する
Cusotomizeディレクトリ内にRepositoryディレクトリを設置する
追加したディレクトリにProductWhereAdd.phpを追加する
<?php
namespace Customize\Repository;
use Eccube\Doctrine\Query\QueryCustomizer;
use Eccube\Repository\QueryKey;
use Doctrine\ORM\QueryBuilder;
class ProductWhereAdd implements QueryCustomizer {
public function customize(QueryBuilder $builder, $params, $queryKey)
{
if(!empty($params["orderby"]) && $params["orderby"]->getId() === 4) {
//Whereだとカテゴリー時にエラーになるのでandで指定
$builder->andWhere("p.only_member = 1");
}
}
public function getQueryKey(): string
{
// 適用したいメソッドを指定することで、自動的に有効になる。ドキュメント参照
//https://doc4.ec-cube.net/customize_repository
return QueryKey::PRODUCT_SEARCH;
}
}
参考にしたドキュメントやサイト
プラグインにその機能を含める場合はプラグイン削除の処理等を考えるとちょっと面倒でして、Cusotomizeディレクトリからカスタマイズしたほうがスマートだと思いプラグインには機能を含めませんでした。
含める場合の参考処理
インストール時に、「mtb_product_list_order_by」テーブルに1項目追加する
追加したidを取得してプラグインで定義したオリジナルのテーブルにリレーションを貼る
プラグイン削除時にオリジナルのテーブルからリレーション先の「mtb_product_list_order_by」を辿って、追加した項目だけを削除
「mtb_product_list_order_by」に判定用のカラム追加でもいいですが、なるべくEC CUBEデフォルトのテーブルは触りたくないところなので、このような処理になると思います。