【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つです。
- ゲストでの申し込み
- 必須入力の項目がある
必須項目のフィールドに入力しているにもかかわらず、エラーになります。
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バグの原因
本事象はゲストで申込しようとした場合の「必須項目」でのみ発生いたします。ログイン済みの会員では発生いたしません。
ということで、ゲストと会員の場合の画面を比較してみます。
ゲストでの必須項目
会員での必須項目
注目すべきは下部の項目の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']; ?>