LoginSignup
0

More than 3 years have passed since last update.

posted at

updated at

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'];
}

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0