GitHub の準備
ローカル環境に branch の作成
$ git checkout -b myapge_favorite upstream/eccube-3.0.0-beta
自分のリポジトリに branch を反映
$ git push origin myapge_favorite
実装すべきファイル
- src/Eccube/Controller/MypageController.php
- src/Eccube/ControllerProvider/FrontControllerProvider.php
- src/Eccube/Form/Type/MypageFavorite.php
- src/Eccube/View/Mypage/favorite.twig
- src/Eccube/ServiceProvider/EccubeServiceProvider.php
- src/Eccube/Resource/doctrine/CustomerFavoriteProducts.orm.yml
- src/Eccube/Entity/CustomerFavoriteProducts.php
Controller の設定
会員登録後
/mypage/favorite.php
にアクセスすると、現状の「お気に入り」が表示される。
表示されているページは、2.13系のソース
src/Eccube/Page/Mypage/Favorite.php
が表示されている
src/Eccube/ControllerProvider/FrontControllerProvider.php
より、新しいソースへの指定に変更
- $controllers->match('/mypage/favorite.php', '\\Eccube\\Page\\Mypage\\Favorite')->bind('mypage_favorite');
+ $controllers->match('/mypage/favorite.php', '\\Eccube\\Controller\\MypageController::favorite')->bind('mypage_favorite');
以下のエラーが表示される。
src/Eccube/Controller/MypageController.php
内の favorite() が処理として呼ばれるので、favorite() を記載。
public function favorite(Application $app)
}
先ほどのエラーは解消されて、空白ページが表示される。
テンプレートの指定
テンプレートの指定も同じく
src/Eccube/Controller/MypageController.php
に記載する。
public function favorite(Application $app)
{
return $app['twig']->render('Mypage/favorite.twig', array(
'title' => $this->title,
'subtitle' => 'お気に入り',
'mypageno' => 'favorite',
));
}
アクセスすると、以下のようにテンプレート(favorite.twig)が無いとのエラーが表示される。
とりあえず、2.13系のSmartyテンプレートを.twigとしてコピーして設置する。
$ cp app/template/default/mypage/favorite.tpl src/Eccube/View/Mypage/favorite.twig
テンプレートは読み込んでくれる。
他のテンプレートを参考にヘッダーとフッター部分を追記
{% extends 'site_main.twig' %}
{% block main %}
…………
{% endblock %}
他のソースを参考に以下を変更すると、さらにそれっぽく表示される。
--- app/template/default/mypage/favorite.tpl 2015-03-31 16:32:33.056669597 +0900
+++ src/Eccube/View/Mypage/favorite.twig 2015-04-27 15:46:50.846695260 +0900
@@ -1,46 +1,26 @@
-<!--{*
-/*
- * This file is part of EC-CUBE
- *
- * Copyright(c) 2000-2014 LOCKON CO.,LTD. All Rights Reserved.
- *
- * http://www.lockon.co.jp/
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-*}-->
+{% extends 'site_main.twig' %}
+{% block main %}
<div id="mypagecolumn">
- <h2 class="title"><!--{$tpl_title|h}--></h2>
- <!--{if $tpl_navi != ""}-->
- <!--{include file=$tpl_navi}-->
- <!--{else}-->
- <!--{include file=`$smarty.const.TEMPLATE_REALDIR`mypage/navi.tpl}-->
- <!--{/if}-->
+ <h2 class="title">{{ title }}</h2>
+ {% if tpl_navi is defined and tpl_navi %}
+ {% include tpl_navi %}
+ {% else %}
+ {% include 'Mypage/navi.twig' %}
+ {% endif %}
<div id="mycontents_area">
<form name="form1" id="form1" method="post" action="?">
<input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" />
<input type="hidden" name="order_id" value="" />
- <input type="hidden" name="pageno" value="<!--{$tpl_pageno}-->" />
+ <input type="hidden" name="pageno" value="<!--{$objNavi->nowpage}-->" />
<input type="hidden" name="mode" value="" />
<input type="hidden" name="product_id" value="" />
- <h3><!--{$tpl_subtitle|h}--></h3>
- <!--{if $tpl_linemax > 0}-->
+ <h3>{{ subtitle }}</h3>
- <p><span class="attention"><!--{$tpl_linemax}-->件</span>のお気に入りがあります。</p>
+ <!--{if $objNavi->all_row > 0}-->
+
+ <p><span class="attention"><!--{$objNavi->all_row}-->件</span>のお気に入りがあります。</p>
<div class="paging">
<!--▼ページナビ-->
<!--{$tpl_strnavi}-->
@@ -92,3 +72,4 @@
</form>
</div>
</div>
+{% endblock %}
とりあえずは、ここまで。
orm、Entity の生成
src/Eccube/Resource/doctrine/CustomerFavoriteProducts.orm.yml
EC-CUBE ソースの直下に移動に移動して、以下を実行。
$ ./vendor/bin/doctrine orm:convert:mapping --from-database yml --filter=CustomerFavoriteProducts src/Eccube/Resource/doctrine/
Processing entity "Eccube\Entity\DtbCustomerFavoriteProducts"
Exporting "yml" mapping information to "/◯◯◯/◯◯◯/◯◯◯/◯◯◯/eccube3/src/Eccube/Resource/doctrine"
--from-database yml 形式を指定
--filter 前方一致で一致するテーブルのみを対象
※ dtb_customer_favorite_products の場合、接頭の「dtb_」、「_」は削除して、大文字初めで指定
src/Eccube/Resource/doctrine/DtbCustomerFavoriteProducts.dcm.yml
が生成される
他のファイルとファイル名の形式を合わせておく
$ mv DtbCustomerFavoriteProducts.dcm.yml CustomerFavoriteProducts.orm.yml
とりあえず変更した箇所は以下。
--- DtbCustomerFavoriteProducts.dcm.yml 2015-04-27 16:02:13.209447336 +0900
+++ CustomerFavoriteProducts.orm.yml 2015-04-27 16:07:34.505205018 +0900
@@ -1,6 +1,7 @@
-DtbCustomerFavoriteProducts:
+Eccube\Entity\CustomerFavoriteProducts:
type: entity
table: dtb_customer_favorite_products
+ repositoryClass: Eccube\Repository\CustomerFavoriteProductsRepository
id:
customerId:
type: integer
@@ -24,4 +25,13 @@
type: datetime
nullable: false
column: update_date
- lifecycleCallbacks: { }
+ manyToOne:
+ Product:
+ targetEntity: Eccube\Entity\Product
+ inversedBy: CustomerFavoriteProducts
+ joinColumn:
+ name: product_id
+ referencedColumnName: product_id
+ lifecycleCallbacks:
+ prePersist: [ setCreateDateAuto ]
+ preUpdate: [ setUpdateDateAuto ]
src/Eccube/Entity/CustomerFavoriteProducts.php
EC-CUBE ソースの直下に移動に移動して、以下を実行。
$ ./vendor/bin/doctrine orm:generate:entities --extend="Eccube\\Entity\\AbstractEntity" --filter=CustomerFavoriteProducts src
Processing entity "Eccube\Entity\CustomerFavoriteProducts"
Entity classes generated to "/var/www/sites/yamasaki/eccube3/src"
--extend:おまじないのように指定
--filter 前方一致で一致するテーブルのみを対象
※ dtb_customer_favorite_products の場合、接頭の「dtb_」、「_」は削除して、大文字初めで指定
src/Eccube/Entity/CustomerFavoriteProducts.php
が生成される
リポジトリの作成
EC-CUBE ソースの直下に移動に移動して、以下を実行。
./vendor/bin/doctrine orm:generate:repositories --filter=CustomerF src
--filter 前方一致で一致するテーブルのみを対象
※ dtb_customer_favorite_products の場合、接頭の「dtb_」、「_」は削除して、大文字初めで指定
src/Eccube/Repository/CustomerFavoriteProductsRepository.php
が生成される。
サービスプロバイダに登録
src/Eccube/ServiceProvider/EccubeServiceProvider.php
以下を記載。
$app['eccube.repository.customer_favorite'] = function() use ($app) {
return $app['orm.em']->getRepository('\\Eccube\\Entity\\CustomerFavoriteProducts');
};
ここまでで、おおまかな準備はOKなはず。
実際の処理を移植
と、書きかけましたが、git pull すると色々と変わっていたので、
あまり参考にならない内容になりました…
プルリクにはまだ厳しいですが、取り敢えずある程度の表示までは、完成
https://github.com/Yammy/ec-cube/tree/myapge_favorite?files=1