EC-CUBE4.2 同一商品の複数の規格をカートに一括投入するカスタマイズ

EC-CUBE4のお話。
タイトルだけではわからないかもしれないですが、例えば衣料品の同一商品について、サイズ違い・色違いをまとめてカートに投入するといったカスタマイズです。
EC-CUBE2では無料のプラグインがありますが、EC-CUBE4には見当たらなかったのでカスタマイズしてくれと言うご要望でした。

僕自身、EC-CUBE4というかsymfonyは殆ど触ったことがなかったので、そのへんの調査からになりました。
一番参考になったのは、以下のサイトです。
1)
https://symfonycasts.com/screencast/collections/add-new-collection-prototype

2) https://symfony.com/doc/current/reference/forms/types/collection.html

同時に複数の商品をカートに入れるためには、AddCartTypeを複数配置することになります。
symfonyのドキュメントによると、ひとつのフォームで複数のentityを扱えるようにするには、CollectionTypeを使えということでした。
EC-CUBE4でカートに商品を投入するフォームタイプは、
src/Eccube/Form/Type/AddCartType.php
です。
これをCollectionTypeを使って、複数扱えるようにします。

src/Eccube/Controller/ProductController.php
をカスタマイズする必要があるので
app/Customize/Controller/
下にコントローラーファイルを作成します。
function detail()をオリジナルからコピーして、フォームビルダー部分を

$builder = $this->formFactory->createBuilder( );
$builder
    ->add(
        'data',
        CollectionType::class,
        [
            'entry_type' => AddCartType::class,
            'entry_options' => [
                'product' => $Product,
                'id_add_product_id' => false,
                'attr' => ['class' => 'oneclass'],
            ],
            'allow_add' => true,
            'allow_delete' => true,
            'label' => '',
        ]
    );

のようにします。
また、twigテンプレート
src/Eccube/Resource/template/default/Product/detail.twig
を、
app/template/default/Product
にコピーしておきます。

この状態で、
/products/detail/xxxx
にアクセスして、変数formをダンプすると、

children->data->vars->prototype

の中に、AddCartTypeの要素がずらずら〜と入っているはずです。

detail.twigのadd_cartのフォームの中に、上記1)のURLにあるように、

<div class="product-class-item" data-prototype="{{ form_widget(form.data.vars.prototype)|e('html_attr') }}"></div->

を追加すると、data-prototypeの部分に、数量と規格の選択部分のhtmlが吐き出されています。
この部分には、

これまた1)を参考に、追加削除ボタンを処理するJavaScriptを作成します。
(僕の書いたコード、相当カッコ悪いと感じているのでここには載せません)
そうすると、

<div id="form_data_X" class="oneclass">〜</div>

で囲われた、一つの商品規格選択フォーム要素が追加されます。
フォームの要素のnameは、form[data][0][quantity]のようになっていると思います。
これで、複数の規格をカートに投入すると、配列として送信されます。
なお、カート追加のactionはproducts/addmulti_cartにしました。
商品一覧(/products/list)のほうで/products/add_cartは使うかもしれないので、アクションを分けておいたほうが楽かなと思いましたので。

ProductController.phpのfunction addCartもコピーして、function addmultiCart()としてカートへ追加する処理を記述します。
フォームビルダーのところはfunction detailと同じです。

エラーがなければ、$form->getData() にはカートに入れる商品毎の配列が入っています。
ここは、

foreach ( $addCartData['data'] as $oneItem ) {
    $this->cartService->addProduct($oneItem['product_class_id'], $oneItem['quantity']);
}

とループを回して、ひとつずつカートに追加するようにしました。

もうちょっと、シュッとしたやりかたがあるようが歩きもしますが、とりあえず動いたのでOKとしました。

なお、symfonyがなのか、CollectionTypeがなのかわかりませんが、メモリーをかなり使うようです。
僕が試したubuntu22.04(PHP8.1)のデフォルト値のmemory_limitではメモリー不足になってしまいました。
memory_limitを512Mにしたらエラーは起きなくなりました。

カテゴリー: Webコンテンツ | EC-CUBE4.2 同一商品の複数の規格をカートに一括投入するカスタマイズ はコメントを受け付けていません

mpcbridge ver 6.2

pd(Music Player Daemon)のリモコンとして動作するWebアプリ、mpcbridge ver 6.2をリリースしました。

mpcbridgeの詳細は、こちらをご覧ください。

↓↓ダウンロードはこちら
https://mpcbridge.fourthgate.jp/files/download/mpcbridge.tar.gz

以下の修正、変更を行っています。
1) 楽曲ファイル情報に音声フォーマットを追加
2) 検索にまつわるいくつかのバグを修正

一つ目の音声フォーマットの情報はわりと便利だと感じています。
楽曲の一覧を表示したときに、標本化周波数、量子化ビット数を表示します。また、ステレオ(2ch)は「S」の絵文字が、サラウンド音声は「SS」の絵文字が表示されます。

カテゴリー: 未分類 | mpcbridge ver 6.2 はコメントを受け付けていません

mpcbridge ver 6.1

mpd(Music Player Daemon)のリモコンとして動作するWebアプリ、mpcbridge ver 6.1をリリースしました。

mpcbridgeの詳細は、こちらをご覧ください。

↓↓ダウンロードはこちら
https://mpcbridge.fourthgate.jp/files/download/mpcbridge.tar.gz

以下の修正、変更を行っています。
1) 検索の条件にジャンルを追加
2) 検索にまつわるいくつかのバグを修正

検索の時に、ジャンル指定できるようにしました。同名の曲がある場合にジャンル指定することで、多少検索しやすくなるかなと思います。

カテゴリー: PCオーディオ, Webコンテンツ | mpcbridge ver 6.1 はコメントを受け付けていません

CakePHP4のAuthenticationで複数の認証

CakePHP4で、管理者向けの認証と一般ユーザー向けの認証を設置したい場合について・・・

管理画面は /admin 以下にあるとします(route.phpでprefixを設定しているとして)。

Application.php の getAuthenticationService で、urlが/adminで始まっているかどうかで処理を切り分けます。


if ( preg_match( '/^\/admin\/?/', $path ) ) {
〜〜〜
$service->loadAuthenticator('Authentication.Session', [
'sessionKey' => 'ManagementAuth', // 管理者認証に使用するセッションキー
] );
$service->loadIdentifier('Authentication.Password',
[
'fields' => $fields,
'resolver' => [
'className' => 'Authentication.Orm',
'userModel' => 'Adminusers',
],
]
);
〜〜〜
} else {
〜〜〜
$service->loadAuthenticator('Authentication.Session', [
'sessionKey' => 'MemberAuth', // 管理者認証とは別のセッションキーを設定
] );
$service->loadIdentifier('Authentication.Password',
[
'fields' => $fields,
'resolver' => [
'className' => 'Authentication.Orm',
'userModel' => 'Users',
],
]
);
〜〜〜
}

のようにすると、/admin 以下で動くコントローラーでは、Adminusers モデルを使用します。
それ以外のコントローラーでは、Users モデルを使って認証します。

もっとスマートな方法があるんだろうと思いますが、とりあえず、これでうまくいっています。

カテゴリー: Webコンテンツ | CakePHP4のAuthenticationで複数の認証 はコメントを受け付けていません

CakePHP4.2のDebug Kitでmissing routeが起きた場合の対処

以下、なんとなく…のお話です。

CakePHP4.2.xで

を使用している場合に、Debug Kitがmissing routeになって動かなくなりました。
で、たどり着いたのが、unauthenticatedRedirectやloginUrlの指定方法。
cookbookでは、

$service->setConfig(['unauthenticatedRedirect' => Router::url(['prefix' => false,'plugin' => null,'controller' => 'Users','action' => 'login',]),'queryParam' => 'redirect',]);

のように指定しています。
これを

$service->setConfig(['unauthenticatedRedirect' => '/users/login']),'queryParam' => 'redirect',]);

のように指定すると、Debug Kitのmissing routeが解消されました。

なんとなく…です。

カテゴリー: Webコンテンツ | CakePHP4.2のDebug Kitでmissing routeが起きた場合の対処 はコメントを受け付けていません

ubuntu18.04 → ubuntu20.04

お正月休みを使って、ubuntu18.04からubuntu20.04へのアップグレードを行ったので、その備忘録。
といってもredmineがひっかかっただけですが…

ubuntu18.04のパッケージは3.4だったので、redmine公式サイトから4.0をダウンロードして使っていました。
ubuntu20.04にアップグレードしたら、redmineが動いていません。
調べてみると、rubyのバージョンがあっていない。
redmine4はruby2.6までだそうですが、ubuntu20.04でインストールされるrubyは2.7です。

ということで、おおよそ以下のことを行いました。

  • ruby2.6をソースコードからビルド
  • /usr/bin/rubyのリンク先をruby2.6に変更
  • bundler、gem、passengerの再構築
  • apache2の/mods-available/passengerをオフにする
  • apache2のredmine設定ファイルにpassengerの設定を追記
  • assets/config/manifest.js を作成

最後のmanifest.jsはなんで必要になったのかがようわかりませんが…

===追記(2021.01.03)===
baserCMSも動きませんでした。MySQL8で引っかかります。

app/Config/database.php
のdefaultに、公式サイトを参考に、以下の内容を追加しました。

'settings' => array("sql_mode" => "'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'")

カテゴリー: Webコンテンツ, サーバーまわり | ubuntu18.04 → ubuntu20.04 はコメントを受け付けていません

mpcbridge ver 6.0

mpd(Music Player Daemon)のリモコンとして動作するWebアプリ、mpcbridge ver 6.0をリリースしました。

mpcbridgeの詳細は、こちらをご覧ください。

↓↓ダウンロードはこちら
https://mpcbridge.fourthgate.jp/files/download/mpcbridge.zip

以下の修正、変更を行っています。
1) CakePHPコアを4.1にアップデート
2) mpdのバージョンが0.21以降の場合、楽曲ファイルのフォーマット(サンプリングレート、量子化ビット数、チャンネル数)を表示します
3) mpdのバージョンが0.21以降の場合、フリーテワード検索の条件にハイレゾ/CDが選択できます
4) アーティスト情報を更新

ディレクトリからの選曲時、フリーワードでの検索時に、楽曲ファイルのサンプリングレート等が確認できるようになったので、ハイレゾフォーマットとCDフォーマットが混在している環境では、ちょっと便利になったのではないかと思います。

カテゴリー: PCオーディオ | mpcbridge ver 6.0 はコメントを受け付けていません

Ubuntu18のphp7.2

よくわからない現象に遭遇したので、備忘録代わりに…

さくらインターネットのVPS上で、Ubuntu18.04を使用しています。

もちろんPHPもインストールしているのですが、一部のphpスクリプトが動かないという現象に素遇しました。
apacheのログには、
[core:notice] [pid 14401] AH00052: child pid 15570 exit signal Aborted (6)
と出ています。

いろいろ試したのですが、
<?php phpinfo(); ?>
だけのphpファイルでも上記エラーが起きます。

手元(ローカル)のUbuntu18.04のPHPでは上記のようなことは起きていません。
ググってみて、それらしい記事を見つけられず…

藁にもすがるような気持ちで、phpだけをアンインストールして、再度インストールし直したら、なんと!治りました。

という、ちょっと気持ちの悪いお話でした。

カテゴリー: サーバーまわり | Ubuntu18のphp7.2 はコメントを受け付けていません

当社Webサイトについて

現在、当社のWebサイト(https://www.fourthgate.jp/)が閲覧できなくなっています。

VPSのOSをUbuntu18.04にアップデートした → PHPが7.2になった → Webサイトに使っていた BaserCMS 3 が動かなくなった

ということです。
ちょっと時間がないので、しばらくはこの状態です。

カテゴリー: 仕事 | 1件のコメント

Raspberry Pi 3 B+ に gitlab をインストールする

subversionを使っていますが、いい加減、gitに切り替えないとと思いつつ幾星霜…
ようやく重い腰を上げて、gitlab をインストールしてみようかと思い立ちました。
が、予想外に四苦八苦。

一つ目は、ラズパイの起動ディスク。
SDカードに全部突っ込むのはさすがにどうかと思い、USB-HDDからの起動とします。
mpd用のラズパイでは、USBストレージからいとも簡単に起動したので、すんなりいくだろうと思ったのですが…
システムが起動したりしなかったりします。どうやらHDDケースのせいのようです。
オートパワーオフなどの機能が入っているケースだとうまくないようです。
ずっと以前に買った、USB/IEEE1394兼用ケースにしたら、うまく起動するようになりました。

二つ目は、gitlabのメモリ使用量。
gitlabのデフォルトの設定のままだと、ラズパイではメモリ不足でスワップしまくって、かえって遅くなってしまうらしいです。
ということで、先人達の記事にあるとおり、postgresqlにアサインするバッファ容量を減らして対応しました。

ようやく、gitlabのスタートラインに建てました…
こんな遠回りしているから、イカンのですよね(笑)

カテゴリー: サーバーまわり | Raspberry Pi 3 B+ に gitlab をインストールする はコメントを受け付けていません