熊本のウェブ制作会社のエンジニアのググる生活

地方のウェブ制作会社(元:佐賀・今:熊本)で働く、エンジニア。
HTML、CSS、JavaScript、PHP、Smary、Twig、EC-CUBE、WordPress、Movable Type 等でお仕事してます。
ググって解決した話や、自分で考えて分かったことなどを、自分用にメモとして残すブログです。

※URLがあったら元記事を参照推奨です!
※ほとんどの事は検証はしていますが、あくまでも参考程度にお願い致します!
※記載が不正確であったことにより生じたいかなる損害に関しても、当ブログは責任を負いかねます。自己責任でよろしくおねがいいたします。

カテゴリ: EC-CUBE

様々な事情があって、2.17 系で
e-SCOTT Smart light for EC-CUBE(2.13系)
https://www.ec-cube.net/products/detail.php?product_id=674

を導入することになりました。(現在は2系の新規利用はできません)

オーナーズストアからモジュールを購入済みでも、
モジュールが 2.17 に対応していると明記していないと、ダウンロードすることができないので、
data/class/SC_Initial.php ECCUBE_VERSION のバージョン情報を 2.13.5 などにさくっと書き換えて対応します。
検証したわけではありませんが 2.13 系に対応しているならおおよそ動くようです。
2.13.5 だと本来の 2.13.5 と区別が付かないので 2.13.7 がいいかなぁとは思います。

上記で無事にインストールできましたが、今度は設定画面で表題の件のエラーが出て、ハマりました。

Fatal error(E_ERROR): Uncaught  --> Smarty Compiler: Syntax error in template "file:\data\downloads\module\mdl_sln\templates\admin\sln_config.tpl"  on line 207 ~中略~ Unexpected ";", expected one of: "

どうやら style 属性の値の開始のクォーテーションが書いてないので smarty のコンパイルでエラーが出ているようでした。
下記のように書き足し訂正をしたところ、上手くいきました。(似たようなコードがファイル内に数カ所あります)
option 属性もクォーテーションが書いてないが、こちらは不要です。
むしろ書き足すと配列の展開が出来なくなって Array という文字列が出てしまうので注意!
それにハマって浪費しました…汗。

<!--{html_checkboxes_ex name="$key" options=$arrPayKbnKaisu selected=$arrForm[$key].value style=$arrErr[$key]|sfGetErrorColor;"}-->

↓↓↓

<!--{html_checkboxes_ex name="$key" options=$arrPayKbnKaisu selected=$arrForm[$key].value style="$arrErr[$key]|sfGetErrorColor;"}-->

新規の提供が終了しているとはいえ、凡ミスだと思われるので、できれば訂正してほしいところでした。

4.0.3系での出来事。

オーナーズストアで購入済みのプラグインを、
プラグイン一覧からインストールした際に、

vendor/doctrine/common/lib/Doctrine/Common/Proxy/Autoloader.php on line 74

というエラーが・・・;


他は普通に動いているので、自分には荷が重すぎるエラーだなーって
ログを眺めてましたが、やっぱりプログラムを辿って原因を探って解決できる修正を施すのは難しそう。

まあとりあえずプラグイン一覧に再度アクセスすると、
ページ自体は閲覧可能で、なぜかインストールは出来ている模様・・・汗。

大丈夫なのかなぁーと思いつつ、物は試しと、有効化をクリックすると、
また同じエラーがでました。

なので、また改めてプラグイン一覧にアクセスすると、
有効化になっているので、とりあえずは良いみたい。不安すぎる。

ただ、プラグイン設定があるはずのプラグインなのに、
設定画面へ行ける歯車アイコンが出ていない状態に・・・。

やっぱり失敗しているのかと思って、一度無効化をし、再度有効化へ
すると歯車アイコンが表示されました・・・!

その後は設定画面や表の画面でのエラーは発生しなかったので、
大丈夫なんだと思います。

メモ書きです。
気が付いたら / 分かったことが増えたら、随時更新。

全般
  • config.php などはなくなったので .env or .htaccess にて環境設定値を書く。
  • APP_DEBUG=1 にして デバックバーを活用する
  • 編集したいページが出てきたら @Route("/url", name="url") を探す
  • とりあえずキャッシュをクリアする
  • <meta name="eccube-csrf-token" content="{{ csrf_token(constant('Eccube\\Common\\Constant::TOKEN_NAME')) }}"> は消さない
コマンドライン
  • キャッシュクリア
    php bin/console cache:clear --no-warmup
  • Proxy クラスを生成
    php bin/console eccube:generate:proxies
  • SQLのアップデート 確認(実行の前にまずはこれで確認を)
    php bin/console doctrine:schema:update --dump-sql
  • SQLのアップデート 実行
    php bin/console doctrine:schema:update --dump-sql --force
リンク href の貼り方
  • {{ url('homepage') }}
  • {{ url('product_list') }}?category_id=1
  • {{ url('product_detail', {'id': 1}) }}
  • {{ url(eccube_config.eccube_user_data_route, {'route': 'hoge'}) }}
画像の呼び出し
  • {{ asset('assets/img/hoge.jpg') }}
使ってみたいプラグイン
  • 【簡単ページ追加】taba app CMSプラグイン for EC-CUBE 4
    WordPress を入れることなく、カスタムフィールド感覚なことができちゃう凄そうなプラグイン。使い勝手がよさそうで、めっちゃ使ってみたい。予算が下りず試せてませんが、販売価格以上の価値があると思います!
Twig 上で完結できるお手軽カスタマイズ
Twig 小技
  • トップページだけタイトルを変える
    {% if title == "TOPページ" %}{{ BaseInfo.shop_name }}|トップページのタイトルにありがちな決まり文句などを書く{% else %}{% if subtitle is defined and subtitle is not empty %}{{ subtitle }} - {% elseif title is defined and title is not empty %}{{ title }} - {% endif %}{{ BaseInfo.shop_name }}{% endif %}
  • HTML を出力したい
    |raw を付ける
  • |trans とは
    定義済みの言葉を翻訳してくれる。
    日本向けだと活躍する機会はない。
  • if 分で定義済みかどうか
    {% if hoge is defined %}
  • 変数に値をセットする
    {% set hoge = '' %}
  • 置換をする
    {{ 'ほげほげ'|replace({'げ': ''}) }}
    {{ 'ほげほげ'|replace({'げ': '', 'ほ': 'お'}) }}
  • Twig 関数の間に文字列を出力する
    {{ asset('assets/img/hoge-' ~ id ~ '.jpg') }}
  • ログイン状態を判定する
    {% if is_granted('ROLE_USER') %}

SQL
  • 一括で何かする際、外部キー制約で実行できないことが多いので、
    先頭に
    SET FOREIGN_KEY_CHECKS = 0;
    後ろに
    SET FOREIGN_KEY_CHECKS = 1;
    を付けるとよい


試したバージョン 4.0.3 です。
多分コマンドラインで出来るんだと思いますが、ちょっとわからないので; SQL でのやり方です。

EC-CUBE3 の 商品・カテゴリー・規格を初期化の SQL に、
4系では dtb_tag が増えたようです。
ついでにお知らせも初期のは不要なので、追加してみました。
さらに販売種別も初期のAとBは用途不明なので、一度初期化して、通常商品という名前で一つだけ登録するようにしました。
さらのさらに支払方法を代引きだけに、配送方法も通常配送だけに、税率を10%にしました。

下記の SQL を phpMyAdmin の SQL ウィンドウから実行すると、
商品・カテゴリー・規格・ニュースの初期入力が削除出来て、
ID1 から気持ちよく始めることができます。

うまくいかない場合は、「外部キーのチェックを有効にする」のチェックを外す必要があります。

SET FOREIGN_KEY_CHECKS=0;

TRUNCATE TABLE `dtb_category`;
ALTER TABLE `dtb_category` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_class_category`;
ALTER TABLE `dtb_class_category` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_class_name`;
ALTER TABLE `dtb_class_name` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_news`;
ALTER TABLE `dtb_news` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product_category`;
ALTER TABLE `dtb_product_category` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product_class`;
ALTER TABLE `dtb_product_class` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product_image`;
ALTER TABLE `dtb_product_image` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product_stock`;
ALTER TABLE `dtb_product_stock` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product_tag`;
ALTER TABLE `dtb_product_tag` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product`;
ALTER TABLE `dtb_product` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_tag`;
ALTER TABLE `dtb_tag` AUTO_INCREMENT = 1;

TRUNCATE TABLE `mtb_sale_type`;
ALTER TABLE `mtb_sale_type` AUTO_INCREMENT = 1;
INSERT INTO `mtb_sale_type` (`id`, `name`, `sort_no`, `discriminator_type`) VALUES ('1', '通常商品', '0', 'saletype');

TRUNCATE TABLE `dtb_delivery`;
ALTER TABLE `dtb_delivery` AUTO_INCREMENT = 1;
INSERT INTO `dtb_delivery` (`id`, `creator_id`, `sale_type_id`, `name`, `service_name`, `description`, `confirm_url`, `sort_no`, `visible`, `create_date`, `update_date`, `discriminator_type`) VALUES (NULL, NULL, '1', '通常配送', '通常配送', NULL, NULL, '1', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'delivery');

TRUNCATE TABLE `dtb_delivery_fee`;
ALTER TABLE `dtb_delivery_fee` AUTO_INCREMENT = 1;
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '1', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '2', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '3', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '4', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '5', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '6', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '7', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '8', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '9', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '10', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '11', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '12', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '13', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '14', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '15', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '16', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '17', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '18', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '19', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '20', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '21', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '22', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '23', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '24', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '25', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '26', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '27', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '28', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '29', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '30', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '31', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '32', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '33', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '34', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '35', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '36', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '37', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '38', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '39', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '40', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '41', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '42', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '43', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '44', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '45', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '46', '1000', 'deliveryfee');
INSERT INTO `dtb_delivery_fee` (`id`, `delivery_id`, `pref_id`, `fee`, `discriminator_type`) VALUES (NULL, '1', '47', '1000', 'deliveryfee');

TRUNCATE TABLE `dtb_payment`;
ALTER TABLE `dtb_payment` AUTO_INCREMENT = 1;
INSERT INTO `dtb_payment` (`id`, `creator_id`, `payment_method`, `charge`, `rule_max`, `sort_no`, `fixed`, `payment_image`, `rule_min`, `method_class`, `visible`, `create_date`, `update_date`, `discriminator_type`) VALUES (NULL, NULL, '代金引換', '0.00', NULL, '1', '1', NULL, '0', 'Eccube\\Service\\Payment\\Method\\Cash', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'payment');

TRUNCATE TABLE `dtb_payment_option`;
ALTER TABLE `dtb_payment_option` AUTO_INCREMENT = 1;
INSERT INTO `dtb_payment_option` (`delivery_id`, `payment_id`, `discriminator_type`) VALUES ('1', '1', 'paymentoption');

UPDATE `dtb_tax_rule` SET `tax_rate` = '10' WHERE `dtb_tax_rule`.`id` = 1;

SET FOREIGN_KEY_CHECKS=1;

SQL が問題なく処理された後、管理画面にて商品などが消えていることが確認できます。
ただし、商品管理>カテゴリ管理についてはキャッシュが残っているので、一覧が表示されてしまいます。
これは、コンテンツ管理>キャッシュ管理からキャッシュ削除を実行すると、消すことができます。


※実行の前にバックアップをとってください。
※ご利用については自己責任でお願いいたします。

4系で開発中にキャッシュ削除を試みると、
PHP の Fatal error が出てしまうことが頻発しました。

結論から言うと、
composer.lock を削除していたのが原因でした。

EC-CUBE の圧縮フォルダを解凍したときに、
無駄だと思うファイルは消すようにしているのですが、
それが仇となりました。

Xampp などのローカル環境やエックスサーバーなどのレンタルサーバーでは、
app/
bin/
html/
src/
var/
vendor/
.htaccess
composer.json
composer.lock
index.php
maintenance.php
robots.txt
以外は削除しても今のところ動いています。
(これで大丈夫なのかは検証中...)

ルートにファイルがたくさんあるとわからなくなるので、
なるべくすっきりさせたいところです。

ちなみに composer.json を削除すると、
キャッシュ削除しなくても Fatal error で閲覧することができなくなります。

ここ1~2年くらいは3系を使ってましたが、
4系もリリースされて1年が経過しました。
その間に様々なプラグインも出てきて、動作も安定しているということから、
ついに4系を使ったお仕事も始めました。
管理画面が格段に見やすくなっていて、とてもいいと思います!!
さらに URL から html が標準でなくなっており、素晴らしく進化しているのでうれしい限りです!

不満点をあげるなら、
・情報がまだ少ない(エラー解消に時間がかかる)
・私の環境(Windows10 × Xampp)ではキャッシュ削除後からの最初のページ表示が非常に遅いこと(30秒くらいかかる...)
などなどと言ったところでしょうか。

そして記事タイトルの twig 関数なども結構探す羽目になりました...。

3系はこうでしたが
{{ url(app.config.user_data_route, {'route': 'hoge'}) }}
↓↓↓

4系はこう!
{{ url(eccube_config.eccube_user_data_route, {'route': 'hoge'}) }}
地味に記述が長くなりましたが、
これで無事に新規追加ページ(user_data)にも twig 関数を使ってリンクを貼ることができました!

4系の公式ドキュメントにも書いていないので、ちょっと辛いですね。
下記のフォーラムの投稿に救われました!

本記事は EC-CUBE 3.0.17 でお送りいたします。

まずは株式会社U-Mebiusさんのこちらの記事を真似してみると、カスタマイズの仕組みがわかりやすかったです!
EC-CUBE3カスタマイズ - 管理画面に新規ページとメニューを追加する方法
https://umebius.com/eccube/insert_new_page_and_menu_in_admin_panel/

以下は追加・編集したファイルのただのメモ書きです。

設定>基本情報設定>ショップマスターを模倣して、
設定>基本情報設定>〇〇設定を作ります。

〇〇設定の英字は hoge で想定します。

■新規で追加したファイル
/app/template/admin/Setting/Shop/hoge.twig
/src/Eccube/Controller/Admin/Setting/Shop/HogeController.php
/src/Eccube/Entity/Hoge.php
/src/Eccube/Form/Type/Admin/HogeType.php
/src/Eccube/Repository/HogeRepository.php
/src/Eccube/Resource/doctrine/Eccube.Entity.Hoge.dcm.yml

■既存で編集したファイル
/src/Eccube/ControllerProvider/AdminControllerProvider.php
/src/Eccube/Event/EccubeEvents.php
/src/Eccube/Resource/config/nav.yml.dist
/src/Eccube/Resource/locale/message.ja.yml
/src/Eccube/ServiceProvider/EccubeServiceProvider.php

■データベース
dtb_hoge を追加


ファイル数が多くて、よくわかっていないとごちゃごちゃして難しいです... (><)

今回はショップマスターを模倣したので、それに使われている、
BaseInfo, base_info, shop_master あたりを grep 検索しては、
真似して真似して・・・という感じで、
/app/log/admin_site_日付.log に書き出されるエラーログを見ながら、
カスタマイズしていく流れです。

無事にできると、非常に嬉しい、楽しい!

本番環境にある EC-CUBE3 の環境を、
新しく作る開発環境へコピーしてくる、私的メモです。

@本番環境
・データベースをエクスポート
・商品画像 upload/ をダウンロード
・(本体カスタマイズをしているなら) src/Eccube/ をダウンロード
・プラグイン app/Plugin/ をダウンロード
・テンプレート app/template/ をダウンロード
・設定ファイル app/config/eccube/config.yml の auth_magic をメモっておく

@新しい開発環境
・まずは普通に EC-CUBE3 をインストール
・ダウンロードしたモノを各所に上書き
・設定ファイル app/config/eccube/config.yml の auth_magic をメモったモノにする
・データベースのテーブルを一度すべて削除して、エクスポートしたデータをインポート
・オーナーズストア>テンプレートから使用するテンプレートに選択し、コンテンツ管理のキャッシュを削除を実行
↑↑ ここまででとりあえずは見れるようになると思います。

(プラグイン)
・有効化になっているものの、認識がされていない状態です。
・上でダウンロードしたモノが入っている状態で、何か一つのプラグインを無効化→有効化すると、一括で認識されて使える状態になります。
・クレジットカードのプラグインは削除しておいたがいいかなと思います。
↑↑ これでプラグインも対応できます。


これで問題なく動作いたしました。
あとは、設定のメールアドレスを変えたりなどをお忘れなく。

開発環境→本番環境でも基本は同じだと思うので積極的に楽していければと思います!


↓↓ 今度はこれを試してみたい!

ビルトインウェブサーバーで簡単環境構築

EC-CUBE 4系 が発表されましたね!
マスターアップは 10月とのことで、私もさっそくデモを試してみました。

3系からかなり進化していて、すごく乗り換えたいです...。
なかでも管理画面は見やすく、使いやすくなっており、
4系を操作したあと、3系を操作するとすごくイライラします(笑)

ということで、少しでも 3系を快適に使いたく、
管理画面をカスタマイズしてみたので紹介します。


確認は 3.0.16 で行っています。


サイドナビのCSSを改善

3系のデフォルト、見辛いですよね。
4系だとそれを反省して(?)、綺麗になっています。

なので、3系でも真似をして綺麗にしてみました。

eccube3admin_css

変更点は、
・子ナビのボーダーを取り、
・どの親の配下であるかわかりやすくするために背景色を白へ、
・開いてる親の文字色とウェイトを変更しわかりやすく、
・さらに現在アクティブであるナビを強調しました。

CSSはこんな感じに。

<style>
    #side > .nav li {
        transition: background-color .3s;
    }
    #side > .nav li a {
        transition: color .3s, font-weight .3s;
    }
    #side > .nav li a .cb {
        transition: color .3s;
    }
    #side > .nav li.active > a {
        color: #3F5467;
        font-weight: 700;
    }
    #side > .nav li.active > a .cb {
        color: inherit;
    }

    #side > .nav > li:not(:nth-child(6)):not(:nth-child(7)).active {
        background-color: #fff;
    }
    #side > .nav > li:not(:nth-child(6)):not(:nth-child(7)) > ul > li.active > a,
    #side > .nav > li:not(:nth-child(6)):not(:nth-child(7)) > ul > li.active > a:hover  {
        background-color: #3F5467 !important;
        color: #fff;
    }
    #side > .nav > li:not(:nth-child(6)):not(:nth-child(7)) > ul > li {
        border: none;
    }

    #side > .nav > li.active li.active {
        background-color: #fff;
    }
    #side > .nav > li > ul > li.active li.active > a,
    #side > .nav > li > ul > li.active li.active > a:hover  {
        background-color: #3F5467 !important;
        color: #fff;
    }
    #side > .nav > li > ul > li > ul {
        background-color: transparent !important;
    }
    #side > .nav > li > ul > li > ul > li {
        border: none;
    }
    #side > .nav > li > ul > li > ul > li > a:not(:hover) {
        background-color: transparent !important;
        opacity: 1;
    }
</style>

:not(:nth-child(6)) と :not(:nth-child(7)) は、
ナビゲーションの増減によって値が変わるのが注意です。
デフォルトの内容だとそのままで大丈夫です

上のCSSを dashboard.css の一番下に追記するか、
管理画面の default_frame.twig の <//head> 直前に書くとよいかと思います。


商品登録画面のアコーディオンをすべて開かせておく

個人的にどうして表示・非表示のアコーディオンになっているのかわからないのですが、
商品カテゴリやタグ、詳細な設定、フリーエリアなどなどがアコーディオンになっていて開閉できます。
基本的にページを表示したときはそれが閉じており、編集する場合はワンクリックが必要です。
商品が数個程度なら問題ないですが、数が増えてくるとドンドン煩わしくなってきます;;

そこで、編集ページを表示したときに全部開いている状態にしてみました。

<script>
  $(function() {
      // 最初から開ける
      $('#detail_wrap .toggle').click();
  });
</script>

この jQuery を管理画面の product.twig の {% endblock javascript %} 直前に追記します。


商品マスター、受注マスター、会員マスターの初期表示

2系でも同じ悩みがありましたが、商品・受注・会員のマスターの初期表示は、
最小限のフォーム欄と検索ボタンのみです。
一覧を表示させるには検索ボタンを押さなければなりません。
これも最初の数回は良くても、だんだんと面倒になってくる作業の一つです...。

4系では、これを不便に思っていたのか改善されておりましたが、
3系でも依然としてこの問題が残っていました。

3系でも検索ボタンを押さずに一覧を表示させたい!ということで、
PHP にちょっと追記してあげると解決できました。
当初は4系を参考にカスタマイズしようと試みましたが、ググってしてみると、
フォーラムに解決案がありました! → https://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=18643&forum=10

追記するコードはたったこれだけ、
if (!$page_no) {
    $page_no = 1;
}

ファイルと場所は、
・CustomerController.php
・OrderController.php
・ProductController.php
の if (is_null($page_no) && $request->get('resume') != Constant::ENABLED) { の直前になります。

これでマスターのページを開いたときに一覧が表示されます!
ただ修正後、F5更新だとうまく行かなかったので、
一度だけ検索ボタンを押す必要があるみたいで、そこだけ注意が必要です。

以前 2.13系の記事を書きましたが、
今回はその 3系バージョンになります。

ググったところ、情報がなかったので・・・
手探りながらやってみました。

試したバージョンは 3.0.16 になります。

※データそのものが初期化されるので、
 運用中には絶対に実行しないでくださいm(_ _)m
 ※また自己責任でお願いいたします。



商品を初期化

TRUNCATE TABLE `dtb_product`;
ALTER TABLE `dtb_product` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product_category`;
ALTER TABLE `dtb_product_category` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product_class`;
ALTER TABLE `dtb_product_class` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product_image`;
ALTER TABLE `dtb_product_image` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product_stock`;
ALTER TABLE `dtb_product_stock` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product_tag`;
ALTER TABLE `dtb_product_tag` AUTO_INCREMENT = 1;



カテゴリーを初期化

TRUNCATE TABLE `dtb_category`;
ALTER TABLE `dtb_category` AUTO_INCREMENT = 1;



規格を初期化

TRUNCATE TABLE `dtb_class_category`;
ALTER TABLE `dtb_class_category` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_class_name`;
ALTER TABLE `dtb_class_name` AUTO_INCREMENT = 1;



PhpMyAdminの場合?

詳しくないので解説できませんが、データにロックがかかっているために、
上のSQLだけでは実行できませんでした。
SET FOREIGN_KEY_CHECKS=0;
というのを先頭に添える必要があります。


まとめると...

SET FOREIGN_KEY_CHECKS=0;

TRUNCATE TABLE `dtb_product`;
ALTER TABLE `dtb_product` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product_category`;
ALTER TABLE `dtb_product_category` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product_class`;
ALTER TABLE `dtb_product_class` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product_image`;
ALTER TABLE `dtb_product_image` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product_stock`;
ALTER TABLE `dtb_product_stock` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_product_tag`;
ALTER TABLE `dtb_product_tag` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_class_category`;
ALTER TABLE `dtb_class_category` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_class_name`;
ALTER TABLE `dtb_class_name` AUTO_INCREMENT = 1;

TRUNCATE TABLE `dtb_category`;
ALTER TABLE `dtb_category` AUTO_INCREMENT = 1;
これを3系をインストール後に行うと、商品やカテゴリー・規格のが初期化され、
IDを1から始めることができました!


※データそのものが初期化されるので、
 運用中には絶対に実行しないでくださいm(_ _)m
 ※また自己責任でお願いいたします。

このページのトップヘ