Prestashop + Docker Upgrade : 1.7.x -> ..... -> 9.2

1.7.xモジュールのアップデートで1 Click UpdateがUpdate Assistantへ更新されます。
PHPバージョンは、1.7.xがサポートしているバージョン7.4を維持。

アップグレード後、以下のエラーを修正。


Table ‘store.ps_layered_filter_block’ doesn’t exist

テーブルを再作成

  1. 管理画面で「モジュール」→「モジュールマネージャー」→ Faceted Search (ブロックレイヤードナビゲーション) を確認
  2. 再インストール
    再インストールすると必要なテーブル (ps_layered_filter_block など) が自動作成されます。

Argument 7 passed to PrestaShop\PrestaShop\Core\Domain\Order\QueryResult\OrderInvoiceAddressForViewing::__construct() must be of the type string, array given, called in /var/www/html/src/Adapter/Order/QueryHandler/GetOrderForViewingHandler.php on line 356

以下参照して該当ファイルのコード書換え。

store/src/Adapter/Order/QueryHandler/GetOrderForViewingHandler.php

/*
        if ($address->id_state) {
            $state = new State($address->id_state);

            $stateName = $state->name;
        }
*/

        if ($address->id_state) {
            $state = new State($address->id_state);
            $langId = (int) $order->getAssociatedLanguage()->getId();

            // `name` が配列の場合、現在の言語 ID に対応する値を取得
            if (is_array($state->name)) {
                $stateName = $state->name[$langId] ?? reset($state->name);
            } else {
                $stateName = $state->name;
            }
        }

overrideフォルダの旧ファイルのリネーム

バージョン1.6から引き継がれているPHPコード(クラス)を無効化するため、overrideフォルダ内のindex.phpを除く全てのPHPクラスファイルを無効化。キャッシュをクリアし、クラスへの参照を全てclassesへ移行。

$ sudo rm -r var/cache/*
$ sudo mv override/classes/xxx.php override/classes/xxx.php.bak

php-fpmのベースイメージを7.4から8.1へアップグレード

prestashop/prestashop - Docker Image


ドキュメント


E-Mail送信テスト

注文後のメール送信テストは下記テンプレートを選択して実行。


国・地域別アクセス制限設定

https://www.prestashop.com/forums/topic/1073412-geolocation-ps-1788/

トラブルシュート


注文メール表示エラー

Emailテーマでテンプレートを上書き後発生

テーブルセルのズレ

以下の要素がそれぞれ参照ファイルにより独自のテーブルを作成しているが、テンプレートで各テーブルを完全に分離した状態で配置していない。

{products} : mails/_partials/order_conf_product_list.tpl

{discounts} : mails/_partials/order_conf_cart_rules.tpl

翻訳テンプレートから修正するか、言語ごとに以下のファイルを直接編集。

翻訳テンプレートの以下の編集画面でテーブルの列を追加してセルをマージ、{products} {discounts} をマージしたセルへ移動。

修正ファイル(修正箇所のみ)

themes/classic/mails/en/order_conf.html

<table class="table table-recap" bgcolor="#ffffff"><!-- Title -->
<tbody>
<tr>
<th bgcolor="#fbfbfb" style="border: 1px solid #D6D4D4; background-color: #fbfbfb; color: #333; font-family: Arial; font-size: 13px; padding: 10px;">Reference</th>
<th bgcolor="#fbfbfb" style="border: 1px solid #D6D4D4; background-color: #fbfbfb; color: #333; font-family: Arial; font-size: 13px; padding: 10px;">Product</th>
<th bgcolor="#fbfbfb" style="border: 1px solid #D6D4D4; background-color: #fbfbfb; color: #333; font-family: Arial; font-size: 13px; padding: 10px;" width="17%">Unit price</th>
<th bgcolor="#fbfbfb" style="border: 1px solid #D6D4D4; background-color: #fbfbfb; color: #333; font-family: Arial; font-size: 13px; padding: 10px;">Quantity</th>
<th bgcolor="#fbfbfb" style="border: 1px solid #D6D4D4; background-color: #fbfbfb; color: #333; font-family: Arial; font-size: 13px; padding: 10px;" width="17%">Total price</th>
</tr>
<tr>
<th bgcolor="#fbfbfb" style="border: 1px solid #D6D4D4; background-color: #fbfbfb; color: #333; font-family: Arial; font-size: 13px; padding: 10px;" colspan="5">{products} {discounts}</th>
</tr>

セラーへ新規注文メールが送信されない

モジュール専用テンプレートディレクトリ

themes/classic/modules/ps_emailalerts/mails/en/new_order.html

を

themes/classic/mails/en/new_order.html

にコピーしないとテンプレートが有効にならない。

PrestaShopのメールテンプレート読み込み処理は、基本的にモジュール専用のメールテンプレートをこの場所からは参照しないようです。


Manropeフォント崩れ

https://www.prestashop.com/forums/topic/1077642-ps-8-help-with-font-and-background-for-the-store-page/

一部ブラウザでフォント崩れが発生するため、デフォルトのクラッシックテーマのフォントをManropeからArialへ変更。

SSH接続して以下ファイルの該当箇所を変更

themes/classic/assets/css/theme.css

body{font-family:Arial,sans-serif; ........................

8.2.4 -> 9.0.3 へのアップデート時のエラー

管理画面でキャッシュをクリアし、ps_mboとps_metricsを無効にしてアップデートを実行すること。

注)ps_metricsについては、無効にしても下記エラーが発生するため、管理画面で無効にしたの上でモジュールそのものを削除、またはフォルダ名を変更して読み込まないようにすること。

/modules/ps_metrics/src/Adapter/LoggerAdapter.php line 75

Declaration of PrestaShop\Module\Ps_metrics\Adapter\LoggerAdapter::emergency
($message, array $context = [])
must be compatible with

Psr\Log\LoggerInterface::emergency(string|\Stringable $message, array $context = []): void

ps_metricsモジュールの LoggerAdapter(emergency($message, array $context = )) が古いため発生したエラー。

上記モジュールを無効にして再度アップデート。このモジュールはショップのプロセスには何も影響しないため名称変更して無効化。

$ docker exec -ti prestashop-fpm bash
# mv ps_metrics ps_metrics_disabled

メール送信エラー

MailerはswiftmailerからSymfony Mailerへ変更
Gmailのsmtpポートは587のままだとエラー。465に設定すると送信可。


Friendly URL(URL書き換え)のリセット

管理画面にブラウザからアクセスできなくなった場合、データベースでリセット
PS_REWRITING_SETTINGS( テーブルps_configuration)を検索して1から0へ変更。
キャッシュ削除

# rm -rf var/cache/*

ログイン不可

IDとパスワードは正しく、ログイン画面に戻ってきてしまう。

.htaccessファイルに以下のみを指定。

SetEnvIf X-Forwarded-Proto https HTTPS=on

下記データを一時的に無効

PS_COOKIE_CHECKIP を 0

ログインして以下手順で.htaccessを再生成

  • 管理画面の ショップパラメータ > トラフィック & SEO に移動。
  • 下の方にある「URLの設定」セクションで、フレンドリーURLを一度「いいえ」にして保存し、再度「はい」にして保存

メールテンプレート

themes/classic/mailsにメールテンプレートが残っている場合、ここが優先されて使用されますが、これらテンプレートは変換コマンドでは上書きされないようです。このため、このフォルダは無効にします。

# mv themes/classic/mails themes/classic/mails_backup

下記変換コマンド(または管理画面のEmail Themeから)で作成されるメールテンプレートhtml.txtファイルは、mails/en, mails/ja ディレクトリに保存されます。

# bin/console prestashop:mail:generate -o true classic en-US
# bin/console prestashop:mail:generate -o true classic ja-JP

メールテンプレートについては以下も参照。

リダイレクトループ(無限ネスト)+クローラ攻撃系アクセス対策

Nginxの設定変更 —> 設定内容は未公開

対策ファイル追加

override/controllers/front/AuthController.php

<?php

class AuthController extends AuthControllerCore
{
    public function init()
    {
        parent::init();

        // backパラメータ取得
        $back = Tools::getValue('back');

        if ($back) {

            // ① 長さ制限(重要)
            if (strlen($back) > 1000) {
                $back = '';
            }

            // ② back多重ネスト検出
            if (substr_count($back, 'back=') > 1) {
                $back = '';
            }

            // ③ authenticationループ防止
            if (stripos($back, 'controller=authentication') !== false) {
                $back = '';
            }

            // ④ URLとして不正なら破棄
            if (!filter_var($back, FILTER_VALIDATE_URL)) {
                $back = '';
            }

            // 上書き
            if (empty($back)) {
                $_GET['back'] = null;
            }
        }
    }
}

9.1.3 —> 9.2

Update Assistantの更新がされないため、下記最新版をダウンロードし

Module manager ---> Upload a module

で手動アップロード・更新。

Update Assistant

v7.6.6 - by PrestaShop

更新後、Update Assistantの手順に従い更新(不必要なモジュールのアンインストールなど)。