EC-CUBE3.0.5以降でPostgres9の環境だと正常に動作しない時の対処方法

EC-CUBE3.0.5からsessionの保存方法としてDB(dtb_session)を使うことになりました。

ただ、MySQLだと正常に動作しますが、 Postgres9だと環境によっては正常に動作しない時があります。 →MacのHomebrewでインストールしたPostgres9など

原因はSymfony2の問題であり、まだSymfony2側では対応されておりません。

NativeSessionStorage->loadSession() empty $_SESSION with PdoSessionHandler and pgsql · Issue #14569 · symfony/symfony · GitHub

回避方法としては以下のSQLを実行すると動作されるようになります。

ALTER DATABASE データベース名 SET bytea_output = 'escape';

Postgres9以降で動作しないよーという方はぜひお試しください。

EC-CUBE3でMailgunを使ったメール送信方法

以前にEC-CUBE3からGmailを使ったメール送信方法を書きました。

amidaike.hatenablog.com

今回はMailgunを使ったメール送信方法について説明します。

www.mailgun.com

Mailgunの説明は今回割愛しますが Mailgunの管理画面にあるDomain Informationの Default SMTP LoginDefault Password を設定することで簡単に送信できます。

app/config/eccube/mail.yml

mail:
    transport: smtp
    host: smtp.mailgun.org
    port: 25
    username: Mailgunで設定されているDefault SMTP Login
    password: Mailgunで設定されているDefault Password
    encryption: null
    auth_mode: null
    charset_iso_2022_jp: false

以上を設定するだけでメール送信が可能となります。

Mailgunは月10,000通までは無料なので、 クラウドVPSEC-CUBEの環境は出来たけどメールサーバまで作るのはしんどいという方にはお手軽に扱えるサービスです。

今回はSMTPを使ってメール送信の仕方を説明しましたが、 MailgunはAPIが提供されており本来であれば色々とできますので、 もっと色々と細かいことをしたい方はプラグインを作成してみてはいかがでしょうか。

EC-CUBE2とEC-CUBE3のテーブル比較

EC-CUBE3のテーブルについてEC-CUBE2からどのテーブルが無くなったりしているのか把握していなかったので、簡単に比較表を作成してまとめてみました。

こんな感じです。

2系テーブル 論理テーブル名 3系テーブル
dtb_api_account APIアカウント ×
dtb_api_config API設定 ×
dtb_baseinfo 店基本情報 dtb_base_info
dtb_best_products おすすめ商品情報 ×
dtb_bkup バックアップ ×
dtb_bloc ブロック情報 dtb_block
dtb_blocposition ブロック記事情報 dtb_block_position
dtb_category カテゴリ情報 dtb_category
dtb_category_count カテゴリ商品数情報 dtb_category_count
dtb_category_total_count カテゴリ商品合計数情報 dtb_category_total_count
dtb_class 規格情報 dtb_class_name
dtb_classcategory 規格分類情報 dtb_class_category
dtb_csv CSV情報 dtb_csv
dtb_csv_sql CSV詳細設定SQL情報 ×
dtb_customer 顧客情報 dtb_customer
dtb_customer_favorite_products お気に入り商品情報 dtb_customer_favorite_product
dtb_deliv 配送業者情報 dtb_delivery
dtb_delivfee 送料情報 dtb_delivery_fee
dtb_delivtime 配送時間情報 dtb_delivery_time
dtb_holiday 休日情報 ×
dtb_index_list インデックス一覧 ×
dtb_kiyaku 規約情報 dtb_help
dtb_mail_history 受注メール送信履歴 dtb_mail_history
dtb_mailmaga_template メルマガテンプレート情報 ×
dtb_mailtemplate メールテンプレート情報 dtb_mail_template
dtb_maker メーカー ×
dtb_maker_count メーカーカウント ×
dtb_member 管理者情報 dtb_member
dtb_mobile_ext_session_id モバイルセッション情報 ×
dtb_module モジュール情報 ×
dtb_module_update_log モジュール更新ログ情報 ×
dtb_news 新着情報 dtb_news
dtb_order 受注情報 dtb_order
dtb_order_detail 受注詳細情報 dtb_order_detail
dtb_order_temp 受注一時情報 ×
dtb_other_deliv その他の配送先情報 dtb_customer_address
dtb_ownersstore_settings オーナーズストア設定 ×
dtb_pagelayout ページレイアウト情報 dtb_page_layout
dtb_payment 支払方法情報 dtb_payment
dtb_payment_options 支払選択肢情報 dtb_payment_option
dtb_plugin プラグイン情報 dtb_plugin
dtb_plugin_hookpoint プラグインフックポイント ×
dtb_products 商品情報 dtb_product
dtb_product_categories 商品カテゴリ関連 dtb_product_category
dtb_product_class 商品規格情報 dtb_product_class
dtb_product_status 商品ステータス情報 ×
dtb_recommend_products 関連商品情報 ×
dtb_review レビュー除法 ×
dtb_send_customer 顧客メール送信履歴 ×
dtb_send_history メール送信履歴 ×
dtb_session セッション情報 dtb_session
dtb_shipment_item 配送商品情報 dtb_shipment_item
dtb_shipping お届け先情報 dtb_shipping
dtb_tax_rule 消費税ルール dtb_tax_rule
dtb_templates テンプレート情報 dtb_template
dtb_update モジュール更新情報 ×
mtb_allowed_tag 許可タグ ×
mtb_auth_excludes 管理画面認証除外 ×
mtb_authority 管理者マスタ mtb_authority
mtb_constants 定数マスタ ×
mtb_country 国マスタ mtb_country
mtb_customer_order_status 顧客表示用受注ステータス mtb_cusotmer_order_status
mtb_customer_status 顧客ステータス mtb_customer_status
mtb_db データベース種別 mtb_db
mtb_delivery_date 商品発送日 dtb_delivery_date
mtb_device_type 端末種別 mtb_device_type
mtb_disable_logout ログアウト無効ページ ×
mtb_disp 公開フラグ mtb_disp
mtb_job 職業マスタ mtb_job
mtb_magazine_type メルマガ種別 ×
mtb_mail_magazine_type メールマガジン種別 ×
mtb_mail_template メールテンプレート ×
mtb_mail_tpl_path メールテンプレートパス ×
mtb_mail_type メール種別 ×
mtb_mobile_domain モバイルドメイン ×
mtb_order_status 受注状態 mtb_order_status
mtb_order_status_color 受注ステータス色 mtb_order_status_color
mtb_ownersstoer_err オーナーズストアエラー種別 ×
mtb_page_max ページ最大表示数 mtb_page_max
mtb_permission 管理画面アクセス権限 ×
mtb_pref 都道府県マスタ mtb_pref
mtb_product_list_max 商品一覧最大表示数 mtb_product_list_max
mtb_product_status_color 商品ステータス色 ×
mtb_product_type 商品種別マスタ mtb_product_type
mtb_recommend おすすめレベル ×
mtb_reminder パスワード質問マスタ ×
mtb_review_deny_url レビュー拒否URL ×
mtb_sex 性別マスタ mtb_sex
mtb_status 商品ステータス ×
mtb_status_image ステータス画像 ×
mtb_target ブロックターゲット ×
mtb_taxrule 課税規則マスタ mtb_taxrule
mtb_wday 曜日 ×
mtb_work 管理者稼働状態 mtb_work
mtb_zip 郵便番号 mtb_zip

こうしてまとめてみると、結構テーブルが無くなっていますね。 機能自体がなくなっているものもあるため、致し方ありませんが。 2系から3系へ頑張って移行されようとしている方はこちらを参考に頑張ってください。

レンタルサーバでEC-CUBE3のURLにhtmlを付けさせない方法

以前にEC-CUBE3をレンタルサーバにインストールする際のURLの設定の仕方について以下の記事を書きました。

amidaike.hatenablog.com

通常ec-cubeをそのままインストールすると http://hogehoge.com/html/ とhtmlがurlについてしまいます。

その回避方法として上記記事を作成したのですが、 この記事内ではファイルを移動したりと結構面倒なことをしていたため、 .htaccessを使って対処できないかなと思い、 .htaccessを以下のようにごにょごにょと対応してみました。

ec-cube直下の.htaccessに現状

order allow,deny
deny from all

と記述されている内容を

<FilesMatch "^composer|^autoload|^cli-config|^COPYING|\.(ht|ini|lock|dist|git|sh)$">
    order allow,deny
    deny from all
</FilesMatch>

<Files ~ "index.php|index_dev.php">
    order deny,allow
    allow from all
</Files>

<IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine On
    RewriteBase /html/

    RewriteRule ^user_data/(.*)$ /html/user_data/$1 [QSA,L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !^(.*)\.(gif|png|jpg|css|ico|js)$ [NC]
    RewriteRule ^(.*)$ index.php [QSA,L]

</IfModule>

に変更します。 その後、

app/config/eccube/path.yml

にあるroot_urlpath を

root_urlpath:

に修正すればhtmlがなくてもhttp://hogehoge.comだけでアクセス出来るようになります。

これで問題なく動作できるかどうか試していただけると助かります。 こちらはApache2.4未満の方を対象にしていますので、Apache2.4以上またはApache以外をお使いの方は別途対応できればと思います。

ただしこちらの対処だけではまだ不充分であり、 srcディレクトリやtestディレクトリvendorディレクトリなどの直下に対して、 appディレクトリ直下に置いてある.htaccessと同じものを置いて制限をかける必要があります。

【追記】
さくらサーバだとOptions +FollowSymlinksが使えないため、Optionsの行を消して対応可能かどうか試して頂ければと思います。

プラグイン使用時に<html>タグが削除される及び文字化けが発生する問題

現在公開されているEC-CUBE3向けのプラグインではプラグイン対象ページだと

<!doctype html>
<html lang="ja">
</html>

のタグが出力されない現象及び文字化けが発生しています。

原因は、 $crawler->html(); を使うとタグが出力されない及び文字化けが発生します。

対処方法として、

public function Hoge(・・・・)
{
・・・・
    $crawler = new Crawler($response->getContent());
    $html = $this->getHtml($crawler);
・・・
}

/**
 * 解析用HTMLを取得
 *
 * @param Crawler $crawler
 * @return string
 */
private function getHtml(Crawler $crawler)
{
    $html = '';
    foreach ($crawler as $domElement) {
        $domElement->ownerDocument->formatOutput = true;
        $html .= $domElement->ownerDocument->saveHTML();
    }
    return html_entity_decode($html, ENT_NOQUOTES, 'UTF-8');
}

というようにgetHtmlを自作してdomElementを1行ずつ取得することで文字化けは直ります。

また、$crawler->filterも同様に文字化けが発生しますので、

$oldElement = $crawler->filter('#main');
$oldHtml = $oldElement->html();
$oldHtml = html_entity_decode($oldHtml, ENT_NOQUOTES, 'UTF-8');

とすることでこちらも対応可能です。

本来であれば本体側で組み込んで欲しい機能ですね。

EC-CUBE3の勉強会資料を公開

過去3回EC-CUBE3向けの勉強会を開催しているのですが、要望が多かったのでスライド資料を公開しました。

少しでもEC-CUBE3の理解の手助けになれば嬉しいです。

最後の資料はプラグイン作成用の簡単な説明資料となっていますので、プラグインを作る方にとっては少しでも手助けになるのではないかなと思います。

EC-CUBE3でGmailを使ったメール送信方法

EC-CUBE3ではメール送信に

と3つのtransportが設定できます。

メールサーバを設定するにはinstall時に設定可能ですが、 インストール後に再設定をし直すには以下の箇所で設定できます。

app/config/eccube/mail.yml

mail:
    transport: smtp
    host: localhost
    port: 25
    username:
    password:
    encryption: null
    auth_mode: null

gmailを使って送信したい場合、以下のように設定するとGmailを使って送信できます。

mail:
    transport: smtp
    host: smtp.gmail.com
    port: 465
    username: GMAILのユーザー名
    password: GMAILのパスワード
    encryption: ssl
    auth_mode: login

メールサーバの指定が簡単に設定出来るのは便利ですね。

[追記] Gmailの設定によってはアプリを許可する必要がありますので、 Gmailで送信できないという方は一度Googleにログインして許可して確認してみてください。

安全性の低いアプリがアカウントにアクセスするのを許可する - Google アカウント ヘルプ