[ECCUBE4] OrderTypeに項目追加したいんだけど…

ECCUBE4.0.3でこちらと同じ問題に遭遇してしまいました。

ShoppingController.php内の以下のコード部分でnullが入るようです。
(略)
public function checkout(Request $request)
(略)
var_dump($form->getViewData()); //☆この部分ではnullはなし
$form->handleRequest($request);
var_dump($form->getViewData());exit; //☆この部分でnullが代入される

注文手続き画面に項目追加したい

Customize\Form\Extension\Shopping\OrderTypeExtension で項目を追加したのに、そして注文確認画面まではちゃんとその追加項目を取り回しできているのに、checkout$form->handleRequestでnullが入っちゃって、結果、注文情報に保存されない…

どうにもわからなかったので力業で対応してみました

app/Customize/Form/Extension/Shopping/OrderTypeExtension.php
(ここではreceipt_nameという項目を追加しています)

<?php

namespace Customize\Form\Extension\Shopping;

use Eccube\Common\EccubeConfig;
use Eccube\Form\Type\Shopping\OrderType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Validator\Constraints as Assert;

class OrderTypeExtension extends AbstractTypeExtension
{
    private $eccubeConfig;
    
    public function __construct(EccubeConfig $eccubeConfig)
    {
        $this->eccubeConfig = $eccubeConfig;
    }
    
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $config = $this->eccubeConfig;
        
        
        $builder
            ->add('receipt_name', TextType::class, [
                'required' => false,
                'constraints' => [
                        new Assert\Length( ['min' => 0, 'max' => $config['eccube_name_len'] ] )
                ],
            ])
            ->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'onPreSubmit'])
            ;
    }
    
    public function onPreSubmit(FormEvent $event)
    {
        // ShoppingControllerのcheckoutでhandleRequestの後にreceipt_nameが消える問題の対応
        $data = $event->getData();
        $receipt_name = $event->getForm()->get('receipt_name')->getData();
        if( !isset($data['receipt_name']) ){
            $data['receipt_name'] = $receipt_name ;
        }
        $event->setData($data);
    }

    /**
     * {@inheritdoc}
     */
    public function getExtendedType()
    {
        return OrderType::class;
    }
}

PRE_SUBMITというイベントでformの中身を確認して、receipt_nameがあれば入れ直しています

わざわざこんなソースを書かないといけないのは、きっと何かおかしい…
なにか大きな勘違いをしてるのかもしれないけど、でもとりあえずこれで問題は回避できました

[AWS] safariで NSPOSIXErrorDomain:100 というエラーが出ちゃっていることへの対処

すごく久々なblog投稿です。
世間では新型コロナウイルスで大変なことになっていますが、ありがたいことに自分は昔からのテレワーカーで、そこまで大きな影響を受けずにやっております。

今回は、awsを使っているサーバにmacのsafariでアクセスした際に、

NSPOSIXErrorDomain:100

というエラーが出てしまったので、その対処法のメモです。

まずぱっと調べたら下記ページを見つけました

iOS 11, macOS Hight Sierra で The operation couldn’t be completed. Protocol error が出る場合の対処

たしかに今回問題を起こした環境はELBを置いたEC2という構成の環境だったのでこれに当てはまりそうです。
ここでの情報通りにHTTP/2を無効化したら問題が解決できることも確認できました。

でも・・・HTTP/2を無効化することに、ちょっとそれでいいのか?感があったので、もう少し調べてみました。

で、見つけたのがこちら

AmazonLinux2のhttpdをALB経由で公開するWeb環境で発生していた、SafariのHTTPS接続エラーを改善してみた

うん、確かにうちの環境もAmazon Linux 2ですので、まさにこれっぽい。

情報通りに、/etc/httpd/conf.modules.d/10-h2.conf の中のLoadModuleをコメントアウトで無効化します

/etc/httpd/conf.modules.d/10-h2.conf

# LoadModule http2_module modules/mod_http2.so

設定変更したらapache再起動
最初の対策で無効化していたELBのHTTP/2も有効に戻します

safariでチェックをしてみたところ、エラーを出すこと無くアクセスできるようになりました。

おまけ

参考サイトではKeepAlive設定にも言及していました
設定していなかったのでこちらも推奨通りに設定しました

/etc/httpd/conf.d/keepalive.conf

KeepAlive On
KeepAliveTimeout 120

[chromebook] Crostini環境にWindowsファイル共有(smb)をマウントする

今入っているプロジェクトが、VPNでつないでファイルサーバ(Windows)にアクセスしてね〜、というルールだったので、めんどくせーなクラウドに置けよchromebookで作業できるように準備しました

素直にはsmbをマウントできなかった

素直なLinuxならcifs-utilesでsmbをマウントできます
参考 Ubuntu から Windows の共有フォルダをマウントして利用する

chromebookでもできるだろと思っていたら、kernel moduleがないよ的なエラー(詳細は失念)でできないと判明
どうしたものかと調べたら、Dropboxのときと同様、こちらもFUSEでマウントできる方法がありました

ほぼ元記事そのままになるけど、手順メモです

FUSEを使ってマウントする方法

まずはインストール

$ sudo apt install fuse smbnetfs

fuseグループを作って、ログインユーザをグループメンバーにする
(必要ないかもしれないけど元記事がやっているので同じように実行)

$ sudo groupadd fuse
$ sudo gpasswd -a "$USER" fuse

設定ファイルを作る
ここでは~/network以下にマウントする例なので、別の場所にマウントしたければこれを書き換えます
[user][password]のところはファイルサーバの認証ID/PWをいれてください

$ mkdir ~/.smb
$ cp /etc/smbnetfs.conf ~/.smb/
$ echo "auth [user] [password]" > ~/.smb/smbnetfs.auth
$ chmod 600 ~/.smb/smbnetfs.auth
$ mkdir ~/network
$ smbnetfs ~/network

これで例えば192.168.1.2というsmbサーバ上のhogehogeという共有ポイントにアクセスするのであれば、~/network/192.168.1.2/hogehoge でアクセスできる・・・そうです
自分の場合はこれだけではアクセスできなかった(あとから考えたら単にパスワード間違えてただけかもしれないけど)ので、さらに設定を追加しました

ここまでの流れでsmbnetfsでマウント実行していたときはアンマウントしておきます

$ fusermount -u ~/network

~/.smb/smbnetfs.host というファイルを作って(アクセス権は600が良いようです)内容を以下のようにします
※ 192.168.1.2がファイルサーバのアドレス、WORKGROUPがワークグループ名、hogehogeが共有ポイント名

host 192.168.1.2 WORKGROUP visible=true
link hogehoge 192.168.1.2/hogehoge

この状態でsmbnetfsでマウントやり直し

$ smbnetfs ~/network

これで~/network/hogehoge でアクセスできるようになりました!
(linkで設定したので~/network/192.168.1.2/hogehogeに加えて~/network/hogehogeにもマウントされています)

[chromebook] hp chromebook x360 14を開発に使えるようにいろいろ初期設定

先日購入したhp chromebook x360 14で開発作業ができるように行った設定(主にCrostini環境の整備)をまとめます。

Dropbox

基本的には先日書いた記事のまま
ただ、マウント時のパーミッションを自分だけが読み書きに変える – SSHの鍵を同期してるんだけど600になっていないと使えない – ためにexpectの内容を少し変更

#!/usr/bin/expect

set PASSWORD "パスワード"
spawn env LANG=C /home/ユーザー/.local/bin/dbxfs -o umask=077
expect {
    "keyring:" {
        send "${PASSWORD}\n"
    }
}
expect {
    "\\\$" {
        exit 0
    }
}

IME

日本語入力環境を整えます

$ sudo apt install fonts-noto
$ sudo apt fcitx fcitx-mozc fcitx-lib*

IMEの設定を起動します

$ fcitx-autostart
$ fcitx-configtool

設定内容はこちらを参考にしました
(参考先はC101PA=arm64用なのでx360 14=amd64に当てはめるには注意)

Mozcの追加

  1. 左下の方の+ボタンを押して表示されたポップアップの、Only Show Current Language のチェックボックスを外します。
  2. その次にSearch Input Methodをクリックして、mozcと入力します。
  3. 上に表示されたmozcをクリックして追加完了です。

フォント設定

  1. 画面上部のAppearanceタブを選択します。
  2. fontのところに表示されているフォント名をクリックします。(デフォルトに何が表示されているのかメモし忘れました。。)
  3. search font nameをクリックしてNoto Sans CJK JPと入力します。
  4. 表示されているNoto Sans CJP JP Regularを選択して完了。
  5. Menu fontの方でも同じように設定する。

毎回起動時にfcitx-autostartをするのは嫌なので自動起動を設定します
こちらを参考にさせていただきました

/etc/systemd/user/cros-garcon.service.d/cros-garcon-override.conf
に下記を追加

Environment="GTK_IM_MODULE=fcitx"
Environment="QT_IM_MODULE=fcitx"
Environment="XMODIFIERS=@im=fcitx"

~/.sommelierrc
にて起動時に呼び出し(ファイルがなければ新規作成)

/usr/bin/fcitx-autostart

Visual Studio Code

こちらを参考にさせていただきました
C101PAのときはarmだから第三者のパッケージを使っていましたが、x360 14だとMicrosoftからの公式を使えるのが嬉しい!

まずレポジトリを登録

$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
$ sudo install -o root -g root -m 644 microsoft.gpg /etc/apt/trusted.gpg.d/
$ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'

追加したレポジトリからパッケージリストをよみこんでインストール実行

$ sudo apt update
$ sudo apt install code

あとはcodeを立ち上げお好みで設定を変更すればVSCodeの準備も完了です
個人的には下記が大事だと思います

フォントの設定
日本語等幅フォント(ex: Noto Sans Mono CJK JP)を追加しないと日本語でカーソルがずれる
ショートカットの設定
そのままではIMEで使うctrl+spaceが競合しているので回避

[chromebook] hp chromebook x360 14を買いました

現在、hpの80周年記念だかなんかでchromebook x360 14のi5モデルが破格の55,000円で販売されています

税率8%の今月中は税込みで59,400円
さらに9月いっぱいはLINEショッピングでhpダイレクトのポイントが増額されていて、なんと10%のポイントバック
つまり、現状日本で最もハイスペックなchromebookであるこの1台が、税込みでも実質53,900円(59,400円 – 5,500ポイントバック)で買える…!

10/15に発表されるかも知れない新pixelbookを待つべきか・・・とも思ったけど、こんな好条件を逃すときっと後悔する!!

そうしてポチッたのが先週の話
注文から1週間程度でモノが届きました

第一印象はとにかく真っ白な天板が美しい!
キーボードにバックライトもついているし、5万円台で買ったノートにはとても見えない高級感があります

スペックを見たときは重さが1.6kgというのがどうしても気になっていたんですが、実際手にとってみると、さすがに軽いとは言えないものの、昔のPCの重さを考えたらまあまあ許容範囲でしょうか

SDカードスロットは、挿すと頭が少し出るタイプ
抜き差しはしやすい反面、持ち運びにはちょっぴり気になります
重さといい、SDカードの出っ張りといい、持ち運ぶというよりは半据え置きで使うのが想定されている使い方なのかも

いざ起動させて気になったのは、ファンの音
特別うるさいわけじゃないはずですが、個人的には最近ファンレスに慣れきってたので、ファンがあるってだけで音が気になりました

USB-Cポートは左右にあってどちらでも充電できますが、どうやら4Kで出力できるのは右側だけ。左側では2Kまでしか出力できない模様です
家では外部ディプレイにつないで使うつもりなのでポートの向きが制限されるのはちょっと残念

次は環境設定にやったことを投稿したいと思います

Apple Watch Series 5 届きました!

新しいapple watchが届きました!

外箱
内箱

パッケージがかわいい!
白い箱1つのかと思ったらそれは包み紙(?)みたいな外箱で、中に本体とベルトが個別に箱に入ってる作りです
外箱は外はそっけなく真っ白なのに内側はいろいろなapple watchがカラフルに描かれていて、それがなんともかわいいかんじ
series2,3のときはこうじゃなかった。今回からなのかな

スポーツバンド、nikeスポーツバンド(穴のあいてるやつ)と買ってきたので、今回はスポーツループを購入
バンドはずっと互換性を保ってくれてるのが嬉しいです

左からseries2, series5, series3

手持ちの歴代機種比べ
series2と今回のseries5は、名称こそ同じ”ゴールド”だけど色味がだいぶ違う
series4を飛ばしているので40mmにサイズアップしたのは今回が初めてだけど、38mmの機種と外見は大きな違いはない感じです

左からseries2, series5, series3

裏側の作りはまるで違う!
series3では緑の光が漏れて夜なんかには気になることがあったけど、今回はどうなんだろ

セットアップ完了

各種アプリをインストールして、apple payの設定済ませて、セットアップ完了

常時点灯ディスプレイはどんな感じなんだろ。バッテリ持つのかな。
これから短くても1年は使うことになるので、快適なこと期待しています!

[ECCUBE4] 4.0.3へのアップデートでハマった罠

もともと4.0.2でスタートしていた開発中のサイトを、先日リリースされた4.0.3にアップデートすることになりました

アップデートの手順は開発ドキュメントを参考にしました

ところが・・・

アップデートした後動かしてみると、カートから先でエラーが発生!
その内容は 「Attempted to call an undefined method named “setTaxAdjust” of class “Eccube\Entity\OrderItem”.」というものでした

カスタマイズしたどこかが悪さしているのか、導入したプラグインのどれかが悪いのか・・・?
とにかく原因を調べてみることに

まずはなんせEccube\Entity\OrderItemでエラーというのだからとsrc/Eccube/Entity/OrderItem.php を見てみると、おや、ちゃんとsetTexAdjustあるぢゃん
あるのにどうして・・・?
そうかproxyか!
ということで app/proxy/entity/src/Eccube/Entity/OrderItem.php を見ると確かにsetTexAdjustが存在していません

こんな場所いじってないのにどうしてだ・・・?
ともかくproxyを再構築してみよう、と開発ドキュメントの手順をおさらいしていると

プロキシファイルを削除

rm -f app/proxy/entity/*.php

プロキシの再生成

ん? おい、ちょっとまて!

これじゃあ元のプロキシ削除できてないよね?
ここでアップデートしくじっていたのかー

rm -f app/proxy/entity/src/Eccube/Entity/*.php

上記のようにして削除することで、そのあとのプロキシ再生成もちゃんとできるようになりました

公式ドキュメント信じて、何も考えず言われたまんま打ち込んでるだけじゃ駄目だね・・・
でもきっと他にもハマる人いると思うな
ドキュメントの間違い報告って受け付けてるんだろうか?

[ECCUBE4] TwigにPHP関数を追加。もちろん本体ソースは触らずに

今リアルにECCUBE4案件が動き出しているのでECCUBE4関係のメモが続きます
今日はTwigに関数を追加する方法です

Twigはテンプレートエンジンですので、その中でデータ処理を行うようなものではありません
ありません・・・が、ほんとにちょっとした処理ぐらいならTwig上でやってしまったほうがわかりやすくなることがあるのも事実

今回は、配列の中で、指定した値を持つ要素の、そのキーが知りたい、という場面が発生しました
PHPならarray_searchを使う場面です
Twigではin_array(指定した値を持つ要素があるかないか判断)的な処理はできるものの、そのキーを返すものは用意されてないようなので、独自でarray_searchに相当するヘルパー関数を追加したい – それもECCUBE4本体のファイルを編集することなく

検索すると先達が方法を投稿してくれていました

[EC-CUBE4] Twig内で使用できる独自のヘルパー関数を追加する方法

こちらの解説ではオリジナルな関数を作っていますが、今回はPHPのarray_searchをそのまんま使えばいいので、もっとシンプルになりました
下記ではarray_searchに加えてついでにarray_flipも加えてます

app/Customize/Twig/Extension/EccubeExtension.php

<?php
namespace Customize\Twig\Extension;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

class EccubeExtension extends AbstractExtension
{
    public function getFunctions()
    {
        return [
            new TwigFunction('array_search', 'array_search'),
            new TwigFunction('array_flip', 'array_flip'),
        ];
    }
}

使い方はPHPそのまんまです

{% array_search(needle , some_array) %}

[ECCUBE4] 本体カスタマイズ時の設定ファイル

ECCUBE4で本体カスタマイズするときに動作設定をどこに書けばいいのか、開発ドキュメントにもそれらしい記述が見当たらず、ちょっとハマったのでメモ

本体カスタマイズといえどもできるだけ本体アップデートに追随できるように、本体のファイルそのものはなるべく編集したくないものです
そういうニーズは多いハズで、実際、ECCUBE4ではそういう目的で使うためのapp/Customizeフォルダが用意されています

で、今回ハマったのが、じゃあCustomizeの中で使う定数などを書いていく設定ファイルはどこに置いたらいいのか、という問題でした

プラグインなら、[プラグインディレクトリ]/Resouce/config/services.yaml に書けばいいとドキュメントにあります
※ 2019年9月12日現在、公式ドキュメントでは、[プラグインディレクトリ]/Resouce/services.yaml って書いてあるけどこれは間違いかと思われます

ならばCustomizeでも同様かなと app/Customize/Resouce/config/services.yaml を置いてみましたが、これだと読み込んでもらえません

試行錯誤してみましたが、どうやら設定ファイルはCustomizeの外、app/config/eccube/packages に置く作りになっているようです

もちろん既存ファイル – 例えば app/config/eccube/services.yaml – に追記しちゃうのも手なのですが、そんなことしなくとも app/config/eccube/packages の中に自由な名前で設定ファイルを置けば読み込んでくれました

例として、バナー管理を組み込むカスタマイズのためのサンプルです
twigのasset関数用のパッケージ設定も同じファイルの中で同時に記述できました

app/config/eccube/packages/banner.yaml

parameters:
    banner_save_image_dir: '%kernel.project_dir%/html/upload/banner_image'
    banner_position:
        top: 1
        side_top: 2
        side_bottom: 3
    banner_position_label:
        top: 'TOPページ'
        side_top: 'サイドメニュー上部'
        side_bottom: 'サイドメニュー下部'

framework:
    assets:
      packages:
        banner_image:
          base_path: '/html/upload/banner_image'

app/config/eccube はアップデート時に差し替えするよう指示されてるディレクトリなので、間違えてディレクトリごと置き換えてファイルを消すようなことがないように注意がいりますね

[Ubuntu] まっさらなUbuntu server 18.04に追加するEC-CUBE4必要環境パッケージ

毎回何が必要だっけって調べるのが面倒なので覚書
gdとpearはECCUBE本体では必要とされてないけど使う場面も多そうなので付け足してます
ECCUBEならずともこれで大抵のLAMPアプリはいけるんじゃないかな

$ sudo apt install apache2 mariadb-client mariadb-server php composer php-mysql php-mbstring php-zip php-json php-xml php-curl php-intl php-apcu php-gd php-pear php7.2-opcache

mariaDBを新規インストールしたら初期設定も忘れずに

$ sudo mysql_secure_installation

あとはファイアウォールもね

$ sudo ufw default DENY
$ sudo ufw limit ssh
$ sudo ufw allow http
$ sudo ufw allow https
$ sudo ufw enable