はじめに
推奨されてはいませんが、ec-cube本体の機能を修正する必要がある場合、どの辺のファイルに手を加えるのかまとめました。
新規ページの追加
URLを定義しているファイル
管理画面側、フロント側で下記のファイルにURLと実行されるクラス(メソッド)が定義されています。
- ECCUBEROOT\src\Eccube\ControllerProvider\AdminControllerProvider.php
- ECCUBEROOT\src\Eccube\ControllerProvider\FrontControllerProvider.php
テンプレート(コントローラーを実行した結果表示するHTML)
ECCUBEROOT\app\template\<Template Name>
に格納されているテンプレートを修正します。
新規ページを追加した場合、dtb_page_layoutテーブルへのデータ登録が必要になります。
INSERT INTO dtb_page_layout(
device_type_id,
page_name,
url,
edit_flg,
create_date,
update_date
) VALUES (
10,
'サンプルページ',
'customize_sample',
2,
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP
);
クエリの変更
既存のクエリの変更
データベースへの問い合わせ(SQL)を修正する場合、ECCUBEROOT\src\Eccube\Repository\XXXRepository.php
ファイルを修正します。
例えば商品検索関連のクエリを変更する場合、下記のファイルを修正します。
ECCUBEROOT\src\Eccube\Repository\ProductRepository.php
class ProductRepository extends EntityRepository
{
// 中略
/**
* get Product.
*
* @param integer $productId
* @return \Eccube\Entity\Product
*
* @throws NotFoundHttpException
*/
public function get($productId)
{
// Product
try {
$qb = $this->createQueryBuilder('p');
$qb->addSelect(array('pc', 'cc1', 'cc2', 'pi', 'ps'))
->innerJoin('p.ProductClasses', 'pc')
->leftJoin('pc.ClassCategory1', 'cc1')
->leftJoin('pc.ClassCategory2', 'cc2')
->leftJoin('p.ProductImage', 'pi')
->innerJoin('pc.ProductStock', 'ps')
->where('p.id = :id')
->orderBy('cc1.rank', 'DESC')
->addOrderBy('cc2.rank', 'DESC');
$product = $qb
->getQuery()
->setParameters(array(
'id' => $productId,
))
->getSingleResult();
} catch (NoResultException $e) {
throw new NotFoundHttpException();
}
return $product;
}
// 以下、略
自分でSQLを組み立てて実行したい場合
Doctrine ORMで組み立てられるSQLが気に入らない、自分でSQLを組み立てたい場合があります。
参考になるのは ECCUBEROOT\src\Eccube\Controller\Admin\AdminController.php
辺りのコードになります。
下記、サンプルコードです。詳細はDoctrineの公式サイトも見たほうがいいかも。
$sql = 'select
p.product_id,
p.name
from dtb_product p
inner join dtb_product_category pc on p.product_id = pc.product_id
inner join dtb_product_tag pt on p.product_id = pt.product_id
where p.status = 1
and pt.tag = :Tag';
$rsm = new ResultSetMapping();;
$rsm->addScalarResult('product_id', 'product_id');
$rsm->addScalarResult('name', 'name');
$query = $app['orm.em']->createNativeQuery($sql, $rsm);
$query->setParameter(':Tag', 'tag');
$result = $query->getResult();
foreach ($result as $row) {
//$row['product_id']
//$row['name'];
}