EC-CUBE3 マイページのお気に入り機能実装

# 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
より、新しいソースへの指定に変更

```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');
```

以下のエラーが表示される。

![mypage favorite.php.png](https://qiita-image-store.s3.amazonaws.com/0/73773/adb120b7-2cfa-3a8e-cd45-d683bf75298f.png)

src/Eccube/Controller/MypageController.php
内の favorite() が処理として呼ばれるので、favorite() を記載。

```php
    public function favorite(Application $app)
    }
```

先ほどのエラーは解消されて、空白ページが表示される。


## テンプレートの指定

テンプレートの指定も同じく
src/Eccube/Controller/MypageController.php
に記載する。

```php

    public function favorite(Application $app)
    {
        return $app['twig']->render('Mypage/favorite.twig', array(
            'title' => $this->title,
            'subtitle' => 'お気に入り',
            'mypageno' => 'favorite',
        ));
    }
```

アクセスすると、以下のようにテンプレート（favorite.twig）が無いとのエラーが表示される。

![mypage favorite.php2.png](https://qiita-image-store.s3.amazonaws.com/0/73773/9dd1eb6e-9682-29cd-4dfa-2369a44f90b6.png)

とりあえず、2.13系のSmartyテンプレートを.twigとしてコピーして設置する。

```lang:
$ cp app/template/default/mypage/favorite.tpl src/Eccube/View/Mypage/favorite.twig
```

テンプレートは読み込んでくれる。

![favorite.php3.png](https://qiita-image-store.s3.amazonaws.com/0/73773/5b6bffc4-741d-e276-2774-7bf3a3decf16.png)

他のテンプレートを参考にヘッダーとフッター部分を追記

```lang:
{% extends 'site_main.twig' %}

{% block main %}

…………

{% endblock %}
```

なんとなくそれっぽく表示される。
![EC CUBE SHOP.png](https://qiita-image-store.s3.amazonaws.com/0/73773/884a6eb1-14a6-7e45-7c65-417e3eef5d7f.png)

他のソースを参考に以下を変更すると、さらにそれっぽく表示される。

```html
--- 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 %}
```

![EC CUBE SHOP2.png](https://qiita-image-store.s3.amazonaws.com/0/73773/acb402ed-c83a-6607-69f7-11d7b53052b7.png)

とりあえずは、ここまで。




## orm、Entity の生成
### src/Eccube/Resource/doctrine/CustomerFavoriteProducts.orm.yml

EC-CUBE ソースの直下に移動に移動して、以下を実行。

```lang:
$ ./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
が生成される

他のファイルとファイル名の形式を合わせておく

```lang:
$ mv DtbCustomerFavoriteProducts.dcm.yml CustomerFavoriteProducts.orm.yml
```

とりあえず変更した箇所は以下。

```lang:
--- 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 ソースの直下に移動に移動して、以下を実行。

```lang:
$ ./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 ソースの直下に移動に移動して、以下を実行。

```lang:
./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
以下を記載。

```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



# 参考

* [EC-CUBE3のメモ - 画面を作ってみる -](http://qiita.com/chihiro-adachi/items/28af6e0b3837983515fe)
* [データベースからエンティティを生成する](http://qiita.com/chihiro-adachi/items/0c781e68d1bcbab3c620)
* [Doctrine QueryBuilder使い方メモ](http://qiita.com/chihiro-adachi/items/3901c8865f926d913e67)
* [EC-CUBE3のメモ - GitHub/Git使い方 -](http://qiita.com/chihiro-adachi/items/f31c9d90b1bcc3553c20)