7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-04-28

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

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

mypage favorite.php.png

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)が無いとのエラーが表示される。

mypage favorite.php2.png

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

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

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

favorite.php3.png

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

{% extends 'site_main.twig' %}

{% block main %}

…………

{% endblock %}

なんとなくそれっぽく表示される。
EC CUBE SHOP.png

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

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

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

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

参考

7
7
2

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?