弊社で運営しているウェブサービス「マイ見積」で使っている、見積フォーム作成時のバリデーション機能の紹介です。
※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日
#

レスキューワーク株式会社では、新春お年玉企画として、「con... 詳細はこちら

#

弊社運営のウェブメディア「自動計算」をアプリ対応にしまし... 詳細はこちら

#

concrete5では、システムが何か処理を行ったときに、オリジナ... 詳細はこちら