Help us understand the problem. What is going on with this article?

ec-cube本体に手を加える場合に修正するファイル

はじめに

推奨されてはいませんが、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'];
}
mako24
主にインフラエンジニア。 Oracleを中心にデータベースのお守りもします。 サーバサイドのWebアプリケーションエンジニアでもあった。 最近はご無沙汰してます。 フットボールと動物を愛でるおじさん。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away