LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-02-25

はじめに

推奨されてはいませんが、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'];
}
0
0
0

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
  3. You can use dark theme
What you can do with signing up
0
0