この記事はEC-CUBE4 作業しながらのメモで、更新している記事です。
役には立たないので注意。
目標:
購入フローでは、カート→情報入力(顧客情報・配送・支払い)→完了としたい。
購入フローを色々と弄るが、一時的にオブジェクトに入れるとか面倒な点が多い
そこでuser_dateで作るのが良いとなる。
基本
.env 修正してデバックモードへ
[変更前] APP_ENV=prod APP_DEBUG=0 [変更後] APP_ENV=dev APP_DEBUG=1
- アノテーション コントローラー内の@ ~というコメントアウト内ような場所
- エンティティ Entity データを保持するためのクラス
問題と解決
-
-
-
- ページ作成でtwig追加で、動的なものはコントローラーを追加し、DBのdtb_page追加は分かったが、コントローラの記述の方法が不明
- 直接DBに入れた場合にどこのテーブルを弄るのか?
- twig にURLを入れたが、このデータはファイルを消せばきえるのか?
消える。最初にapp/template/default/内にtwigテンプレートがあれば読みにいく。なければ標準ディレクトリーを読みに行く。ここはページ管理でも自動で読みに行く。テンプレートを読みに行く順番 1. カスタマイズ :/app/template/[template_code] 2. 標準のディレクトリ:/src/Eccube/Resource/template/[template_code] 3. プラグイン :/app/Plugin 参考:https://doc4.ec-cube.net/design_template
- コントローラの標準ディレクトリーはどこにある?
/src/Eccube/Controller/src/Eccube/Controller
単純に/app/Controller/ に同じコントローラー複製して入れるとエラーになる。
FatalErrorException Compile Error: Cannot declare class Eccube\Controller\EntryController, because the name is already in use
ネームスペースをnamespace Customize\Controller; としてエラー、どうやってコントローラを作るのか?クラス名か?
複製して、ルートを変えてもエラーに。SamplePageController.phpは追加できるのに、
同じディレクトリーにコントローが追加できない。コントローラーのファイル名は?Symfonyを見る - 独自にコントローラーをアップしてみる。
EntrytestPageController クラス名と同じファイルをアップ<?php namespace Customize\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Component\HttpFoundation\Response; class EntrytestPageController { /** * @Method("GET") * @Route("/entrytest") */ public function testMethod() { return new Response('会員登録テストページです !'); } }
Ok、問題ない。
- テンプレートを追加して部品を追加できるか?
【公式】Controllerのカスタマイズ
https://doc4.ec-cube.net/customize_controller
テンプレートを指定
* @Template(“/entrytest.twig”)エラー、再度EC-CUBE4 削除後、インストール。23:25 - しいページを用意して、そこにログイン画面などを表示させてみる。app/Customize/Controller/NewEntryController.php 追加
app/template/default/NewEntry/index.twig 追加NewEntryController.php内に、
* @Template(“/NewEntry/index.twig”) を追加
ここでエラーになる。index.twig内に、
{% block main %}
{% endblock %} 記載データベースにこのtwigを追加INSERT INTO `dtb_page` (`master_page_id`, `page_name`, `url`, `file_name`, `edit_type`, `author`, `description`, `keyword`, `create_date`, `update_date`, `meta_robots`, `meta_tags`, `discriminator_type`) VALUES ( NULL, '新流れ規会員登録ページ', /* ページ名 */ 'newentry', /* url */ 'NewEntry/index', /* テンプレートファイル */ 2, NULL, NULL, NULL, NOW(), NOW(), NULL, NULL, 'page' );
まだエラーになるな。
NewEntryController.phpのテンプレート箇所を削除して管理画面確認
コントローラーになにか不足してる模様。■躓き
● use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; が足りなかった模様
● 管理画面、コンテンツ管理から編集できない ->> * @Route(“/newentry”, name=”newentry“)
迷走 src内のtemplateに入れたがやはりエラー内容はFatalThrowableError $url = $router->getRouteCollection()->get($PrevPage->getUrl())->getPath();
管理画面から紐つけるdtb_pageのurlとfilenameが違うのか?
一度、sampleのでやってみる いけた。
<?php namespace Customize\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; use Symfony\Component\HttpFoundation\Response; class NewentryPageController { /** * @Method("GET") * @Route("/newentry", name="newentry") * @Template("Newentry/index.twig") */ public function testMethod() { // とりあえずnameにEC-CUBEという文字列を入れておく return ['name' => 'EC-CUBE']; } }
ここのRoute(“/newentry”, name=”newentry”)が、あってないと
Call to a member function getPath() on null
Symfony\Component\Debug\Exception\ FatalThrowableError
URLエラーなのか。レイアウトにも追加は管理画面に行う。
- フォームや部品を出す。
会員登録(入力ページ)のコントローラーをコピーして貼り付けたら動作するのか?
もちろんrouteは変更するが、その前にuseをまるまるコピーではエラー
./app/Customize/Form/Extension/
にAbstractTypeExtension
を継承したクラスファイルを作成することで、自動的にFormExtensionとして認識されます。
@https://doc4.ec-cube.net/customize_formtypeなんだそりゃ?05:08Controller内でサービスを利用する
https://doc4.ec-cube.net/customize_controller最初にuseで指定して、コントローラー内に記載
その後にフォームを記載しているビューとその付属のコントローラーも呼び出す。 - 既存のentryのフォームの出し方を確認
/src/Controller/EntryController.php では、
名前空間を指定 namespaceを指定。
use キーワードで名前空間の記述を短くし別名または同名を作る
参照:https://qiita.com/7968/items/1e5c61128fa495358c1fpublic function index(Request $request)
public function complete()
public function activate(Request $request, $secret_key)3つのアクションを用意して、
$form = $builder->getForm();
$Customer = $this->customerRepository->newCustomer();
$builder = $this->formFactory->createBuilder(EntryType::class, $Customer);
$form = $builder->getForm();
return $this->render( ‘Entry/index.twig’, [ ‘form’ => $form->createView(), ] );フォーム自体は、/src/Resource/template/default/Entry/index.twig のフォームを読み込んでいる。 - 全体のフォーム自作後、DBに入れるコードと整合性が取れるか?
まずはフォームの項目を確認 EC-CUBEデフォだと、
お名前、お名前(カナ)、会社名、住所、電話番号、メールアドレス、生年月日、性別、職業
会社名と職業を消す。
会社名
/src/Resource/template/default/Entry/index.twig 以下を消す<dl> <dt> {{ form_label(form.company_name, 'common.company_name', { 'label_attr': { 'class': 'ec-label' }}) }} </dt> <dd> <div class="ec-halfInput{{ has_errors(form.company_name) ? ' error' }}"> {{ form_widget(form.company_name) }} {{ form_errors(form.company_name) }} </div> </dd> </dl>
職業
/src/Resource/template/default/Entry/index.twig 以下を消す<dl> <dt> {{ form_label(form.job, 'common.job', { 'label_attr': {'class': 'ec-label' }}) }} </dt> <dd> <div class="ec-select{{ has_errors(form.job) ? ' error' }}"> {{ form_widget(form.job) }} {{ form_errors(form.job) }} </div> </dd> </dl>
- 確認画面画面を出す
ボタンの文字はどこで決めているのか?’front.entry.agreeや同意で探したがキャッシュしかない。
面倒なので、以下、変更
<button class=”ec-blockBtn–action” type=”submit” name=”mode” value=”confirm”>{{ ‘同意して次へ’|trans }}</button>として変更 - 確認画面を出す。
コントローラーで、
<form method=”post” action=”{{ url(‘entry’) }}” novalidate class=”h-adr”>に対応したものを作る。 - 流れを確認
通常は会員登録画面->新規会員登録(仮登録完了)
アドレス /entry/complete になる。
DBには、dtb_customerに入る。
仮登録はいらないので、管理画面-設定-基本設定で、仮会員機能は無効にしておく。既に仮会員は本会員にしてDBのステータスを確認
customer_status_id は1から2に。2が本会員。
カートのデータはどこに入ってるのか?
カートはcart_keyがトークンなのか?アドレス/entry で確認画面に。
functionは、if ($form->isSubmitted() && $form->isValid()) {
これもテストしてみる。 - 確認は、http://アドレス/shopping
確定は、http://dlabo06.xsrv.jp/shopping/confirm
完了は、http://dlabo06.xsrv.jp/shopping/complete - バランサ配下で、要は$_SERVER[‘HTTPS’]の代わりに$_SERVER[“HTTP_X_FORWARDED_PROTO”]という変数がPHPアプリケーションに届くので変更if (@$_SERVER[“HTTP_X_FORWARDED_PROTO”] === ‘https’) {
$_SERVER[‘HTTPS’] = ‘on’;
}https://umebius.com/eccube/elb-alb-https-restrict-err_too_many_redirects/ - ここまで作業して、
フォーム登録ができるようになったが、
送付と支払いは結構複雑。逆にゲスト購入のデータを見て、そこに個人情報登録ができれば良いのでは?と思うので、
1.ゲスト購入の個人情報はどうDBに入っているか?
2.購入・受注データがどうDBに入ってユーザと紐付けされているか確認
ゲストはdtb_customerには入っていない。
受注データはdtb_orderに入っている。
dtb_orderには、
customer_id があり、ここがメンバーのidらしいので、
仮に既にあるcustomer_idを付け替えてみる、そのまま行ける。
続けて注文も同じ様に入れてみる。いや、面倒だからやめる。
つまりゲスト購入でフォーム項目を増やせばいいことになるな。そうなると、
1.ゲスト購入の支払い・配送のビュー・コントローラーを複製し、
2.会員情報入力フォームを付けて、確認画面を出す。問題は、支払い・配送は別のフォーム・コントローラーなので、
ゲスト購入時点でそこまでデータも持っているのか確認。
TODO:ゲスト購入のフォーム複製時にお客様情報をどうやって引き継いでいるか確認。その前に、このゲスト購入したお客をDBを単純にいじって会員とできるか検証。
直接会員を入れてみる。
dtb_customer が会員情報だが、ここのカラム
password、secret_keyの生成方法を確認する。
注文と紐づいてないか確認
secret_key Ag04ZypU2krXR1UAl6NVFpySwwryfzmY
password 値。
secret_keyは仮登録の時に利用らしく不明らしい。
ではpasswordの生成は?sha1とsaltか?
パスワード生成はの部分を確認する。
src/Eccube/Security/Core/Encoder/PasswordEncoder.php$res = hash_hmac($this->password_hash_algos, $raw.':'.$this->auth_magic, $salt);
ここか、auth_magicはどこにあるのだ?
app/config/eccube/packages/eccube.yaml の26行目に
eccube_auth_magic: ‘%env(ECCUBE_AUTH_MAGIC)%’
.envの44行目にECCUBE_AUTH_MAGIC= 値 とあった。
実際にこれでテストしてみる。
アルゴリズムはapp/config/eccube/packages/eccube.yaml 28行目に eccube_password_hash_algos: SHA256 とある。echo hash_hmac('sha256', $password . ':' .$auth_magic, $salt);
これで行けた。
休憩(´・ω・)ス 只今 03:12分
Q.配送先が同じ画面に、追加できるか?
メモ:ゲスト購入アドレスは、https://ドメイン/shopping/nonmember04:41 作業開始、
ゲスト時のデータはどこまで持っていくのか確認
1.ゲスト購入の支払い・配送のビュー・コントローラーを複製。
2.会員情報入力フォームを付けて、確認画面を出す。問題は、支払い・配送は別のフォーム・コントローラーなので、
ゲスト購入時点でそこまでデータも持っているのか確認。
ゲスト購入のお客様入力画面は、/shopping/nonmemberここ違う名前で
ご注文手続き /shopping :この画面を使おう。ここにデータがあるか、
いや、ここで入力ができるか確認
確認する画面へ
/shopping/confirm
で、注文長くなったので、違う記事に。
-
-
-
-
- バージョン確認:\vendor\symfony\http-kernel\Kernel.php
const VERSION = '3.4.26'; const VERSION_ID = 30426; const MAJOR_VERSION = 3; const MINOR_VERSION = 4; const RELEASE_VERSION = 26; const EXTRA_VERSION = '';
テンプレートの使い方
http://symdoc.kwalk.jp/doc/book/templating - A:app/template/default/Cart/index.twig
- バージョン確認:\vendor\symfony\http-kernel\Kernel.php
-
-
次にこれをテンプレートに出してみる。
SSL化後の””http://アドレス.info/block/cart”, が読み込まれない。
- 確認画面画面を出す
ボタンの文字はどこで決めているのか?’front.entry.agreeや同意で探したがキャッシュしかない。
面倒なので、以下、変更
<button class=”ec-blockBtn–action” type=”submit” name=”mode” value=”confirm”>{{ ‘同意して次へ’|trans }}</button>として変更
https://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=21832&forum=10
確認作業
cartを表示するtwigを作る。
ページ作成で、メモのメモ
ログアウト直後の遷移については、 /app/config/eccube/packages/security.yaml参考URL
- 【公式】フォーラム
https://xoops.ec-cube.net/ - 【公式】カートのカスタマイズ
https://doc4.ec-cube.net/customize_service - フォーラム:独自ページの概要、質問
https://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_ id=21775&forum=10&post_id= 91450 - 【公式】受注対応状況の流れ
https://doc4.ec-cube.net/spec_order - Controllerのカスタマイズ
https://doc4.ec-cube.net/customize_controller - ec-cube本体に手を加える場合に修正するファイル
https://qiita.com/mako24/items/f194778b1f14d025e1a7 - user_data/sample で独自処理をおこないたかったけど
https://qiita.com/ma33588/items/c946bc5da031ab90a46a - 2019/2/7 EC-CUBE東京UG勉強会- PurchaseFlow
https://www.slideshare.net/chihiroadachi3/201927-eccubeugpur chaseflow-130874190 - [EC-CUBE 4]コントローラを利用するページを追加してみる
https://www.creatorlab.jp/2019/07/eccube4%E3%82%B3%E3%83%B3% E3%83%88%E3%83%AD%E3%83%BC%E3% 83%A9%E3%82%92%E5%88%A9%E7%94% A8%E3%81%99%E3%82%8B%E3%83%9A% E3%83%BC%E3%82%B8%E3%82%92%E8% BF%BD%E5%8A%A0%E3%81%97%E3%81% A6%E3%81%BF%E3%82%8B/ - 【公式】FormTypeのカスタマイズ
https://doc4.ec-cube.net/customize_formtype
-