【Salon Booking System】ゲスト申込時のcan't be emptyバグ回避

以前携わった案件でSalon Booking Systemを導入した際に、ゲスト申込時のバグに遭遇いたしました。

プラグインのフォーラムなどに問い合わせても解決方法がわからなかったのですが、時間ができたのでソース解析して回避方法を確認しましたので公開いたします。

Salon Booking Systemは現時点で最新バージョンの7.6.4で確認

salon booking system でのcan't be emptyバグ事象

ゲスト申込時に必須項目が必ず「can't be empty」になってしまうというバグでした。

事象が発生する条件は2つです。

  • ゲストでの申し込み
  • 必須入力の項目がある

必須項目のフィールドに入力しているにもかかわらず、エラーになります。

salon booking system can't be emptyバグ

can't be emptyの直し方だけ教えて

原因とかいいからどうやったらバグを回避できるのか知りたい

というせっかちさんのために、まずはコード書きます。

対象のファイルは

wp-content/plugins/salon-booking-system/views/shortcode/salon_details.php

こちらが変更前のソース(一部)

<?php
foreach ($fields as $key => $field):
?>
<?php
 $value = !$bb->get($key) && null !== $field['default_value'] ? $field['default_value'] : $bb->get($key) ;
 $type = $field['type'];
 $width = $field['width'];
?>

修正後のソースがこちら。

foreachでループした後に、変数keyをfield配列の中に格納されたkeyで上書きしています。

foreach ($fields as $key => $field):
?>
<?php
 $key = $field['key']; //この行を追加
 $value = !$bb->get($key) && null !== $field['default_value'] ? $field['default_value'] : $bb->get($key) ;
 $type = $field['type'];
 $width = $field['width'];
?>

該当のソースはサイズによって条件分岐されていますので、修正箇所は複数あります。

修正が必要なのは3か所で、181行目付近・253行目付近・329行目付近になります。

can't be emptyバグの原因

本事象はゲストで申込しようとした場合の「必須項目」でのみ発生いたします。ログイン済みの会員では発生いたしません。

ということで、ゲストと会員の場合の画面を比較してみます。

ゲストでの必須項目

salon booking system ゲストでの必須項目表示

会員での必須項目

salon booking system 会員での必須項目表示

注目すべきは下部の項目のnameパラメータです。

Salon Booking Systemでは申込時の項目を管理画面から追加する場合、システムで自動でIDが発番されます。そのIDごとにラベルや入力値が管理されています。

しかし左の「ゲストでの申込」の場合は、正しくIDが参照されず0からIDが振られてしまっております。

これがバグの原因です。

画面表示のソースに戻ってみましょう。

<?php
foreach ($fields as $key => $field):
?>
<?php
 $value = !$bb->get($key) && null !== $field['default_value'] ? $field['default_value'] : $bb->get($key) ;
 $type = $field['type'];
 $width = $field['width'];
?>
-----------中略------------
$additional_opts = array(
 'sln[' . $key . ']', $value,
 array('required' => $field->isRequiredNotHidden())
);

slnの配列に変数keyの値を設定しています。これがそのまま画面表示されていますので、この変数keyの値を正しく格納すればいいわけです。

この変数keyはforeachで変数$fieldsから取得していますが、ここがバグの原因になっています。

正しいIDはfieldの方から取得できますので、変数keyの値をfieldの配列から取得したkeyで上書きすれば問題なく動作するようになります。

foreach ($fields as $key => $field):
?>
<?php
 $key = $field['key']; //この行を追加
 $value = !$bb->get($key) && null !== $field['default_value'] ? $field['default_value'] : $bb->get($key) ;
 $type = $field['type'];
 $width = $field['width'];
?>

コメントを残す