弊社で運営しているウェブサービス「マイ見積」で使っている、見積フォーム作成時のバリデーション機能の紹介です。
※PHPの基礎、concrete5のファイル構成などは既知の想定で書いています。
concrete5のブロックのコントローラ
concrete5のブロックのコントローラを見ると、のように、validateというメソッドが用意されています。このvalidateに、ブロック編集→保存するときに、入力されたデータをチェックするコードを書いておきます。
↓は画像ブロックの例(ver8.5.4)です。
public function validate($args) { $e = $this->app->make('helper/validation/error'); $f = File::getByID($args['fID']); $svg = false; if (is_object($f)) { $svg = $f->getTypeObject()->isSVG(); } if (!$args['fID']) { $e->add(t('Please select an image.')); } if (isset($args['cropImage']) && ((int) $args['maxWidth'] <= 0 || ((int) $args['maxHeight'] <= 0)) && !$svg) { $e->add(t('Cropping an image requires setting a max width and max height.')); } if ($svg && isset($args['cropImage'])) { $e->add(t('SVG images cannot be cropped.')); } $this->app->make(DestinationPicker::class)->decode('imageLink', $this->getImageLinkPickers(), $e, t('Image Link'), $args); return $e; }
エラーメッセージを出す
入力データを期待通りに入れてもらえるとは限りません。そのような場合は、ユーザー(入力した人)にエラーメッセージを返します。

ユーザーにフィードバックを返すことで、入力データをユーザーに直してもらえる、という仕組みです。
では実際に、エラーメッセージを返すコードをみていきましょう。 画像ブロックの例で、
if (!$args['fID']) { $e->add(t('Please select an image.')); }
という部分がありますね。ここの$e->add()がエラーメッセージを返すコードです。
$args['fID']が空っぽの時に、「Please select an image.」というメッセージを(言語の翻訳をして)返します。
複雑な検証も書ける
↑の例は、「空っぽかどうか」だけ判定していましたが、もっと複雑な検証も可能です。マイ見積の。実際の検証では、
$allowed_string_attr = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-_'; if (strlen($args['handle'][$i]) !== strspn($args['handle'][$i],$allowed_string_attr)) { $error->add(sprintf('ハンドル [%s] : 許可されていない文字が含まれています。', h($args['handle'][$i])) . 'アルファベット、数字、マイナス記号が利用できます。'); }
というように、「入力された文字列が、許可された文字だけで構成されているか」をチェックすることができます。
記事公開日: 2021年02月05日