• ブログTOP
  • AI・ディープラーニング
  • AR
  • VR
  • WEBサイト
  • WEBマーケティング
  • SEO
  • SNS
  • その他
  • お問い合わせ

ALAKI株式会社

COZIKEEいつまでも使えるTech情報発信ブログ

リクルートサイトはこちら >

knockout.js入門編「WordPressのフォームプラグインにリアルタイムバリデーションを実装する」

2017年9月15日

  • このエントリーをはてなブックマークに追加

knockoutjs-logoこんにちは!

デザイナーの伊東です。
今日はデザインのことではなく、フロントエンドよりのことについて書こうと思います。

現在進行中の案件で、お問い合わせフォームを実装することになりました。
Wordpressに組み込む予定のサイトで、フォームには使い慣れているMW WP Formを使用したいと考えていました。が、Wordpressのフォーム系プラグインにはなぜか、リアルタイムバリデーションが実装されているものがないんです。
リアルタイムバリデーションとは、フォームの送信ボタンを押して初めてエラーが表示されるのではなく、入力し終わるとすぐにメッセージが出るタイプのバリデーションのことです。

静的ページの場合は、リアルタイムバリデーションを有効にできるメールフォームプロというツールを使うのですが、Wordpressに組み込むのは少し手間がかかります。。

そこで!以前から気になっていた”knockout.js“というフレームワークを使って、MW WP Formのフォームにリアルタイムバリデーション機能を追加する方法をご説明します。

knockout.jsとは

“MVVM”という考え方

まずは予備知識として、knockout.jsがどういうものかというところをご説明していきます。
knockout.jsは、「MVVM(Model-View-ViewModel)パターンをサポートするためのJavaScriptフレームワーク」という形で度々説明されます。
フレームワークとして使用するので、jQueryのようなライブラリとの併用も可能です。
ここでMVVMという難しい言葉が出てきました。MVVMの説明としては、以下の記事の一文がわかりやすいです。

  1. システム全体をクライアントサイドとサーバサイドに分ける。
  2. MVVMはクライアントサイドのコードに適用されるパターンなのでサーバサイドについては関知しない。
  3. クライアントサイドとサーバサイドの連携には通常、AJAX(SOAP、RESTなど)が使われる。
  4. クライアントサイドのコードを、HTMLの都合が関係ある部分=プレゼンテーション(Presentation)とHTMLの都合が関係ない部分=ドメイン(Domain)とに分ける
  5. プレゼンテーションを、UIのテンプレートを定義するHTML/CSS=ビュー(View)と、UIの状態の保持、およびUIから呼び出されるメソッドを定義したJavaScript=ビューモデル(ViewModel)とに分ける

引用元:MVVMフレームワーク「Knockout.js」が超絶便利!!その概要と使いどころなどについて

言葉を噛み砕いて簡単に説明すると、デザイナーが作る”UI”やそれを構築する”マークアップ”の部分と、エンジニアが触る”システム”の部分の切り分けを明確にするのがMVVMの考えということです。
knockout.jsは、そのMVVMを利用してWebアプリケーションを構築するためのフレームワークということです。

knockout.js導入に向いているケース

knockout.jsは、ページ遷移なしで頻繁にUIが変化する(DOMの書き換えが行われる)Webアプリケーションの構築に向いています。
そういったWebアプリケーションのことを”シングルページアプリケーション(SPA)“と呼びます。
反対に、ユーザーの操作に合わせてページが遷移する通常のWebサイトの場合は、jQueryなどで部分的にDOMを操作する方が早いかもしれません。
今回は、入力フォームの値に合わせて即時に表示を変えるリアルタイムバリデーションに使用するので、knockout.jsはぴったりです。

 jQueryとknockout.jsのアプローチの違い

jQueryは、javascriptのコードでDOM要素を扱う点において非常に優れたライブラリです。DOM要素につけられた”id”や”class”を参照して操作します。
それに対してknockout.jsは、先ほどご説明した「UIとシステムの切り分け」という観点から、直接DOMを操作するということをしません。ではどうやってUIとシステムを紐付けするのでしょうか?そこで登場するのが”データバインディング“という手法です。
具体的に説明すると、htmlのタグに”data-bind“という属性を記述してシステム側とやりとりを行います。

バリデーションのサンプルを動かす

まずは静的ページで実装する

それでは、上記の説明を踏まえて実際にknockout.jsを使ってバリデーションを実装しましょう!

See the Pen GMgRyE by ito nao (@chokuro) on CodePen.

まずはhtmlに”jquery.js”、”knockout.js”、”knockout.validat.js”の3種類を読み込みます。
最後のknockout.validat.jsにはバリデーション機能を実装する上で使える関数などが記述されています。
上記のファイルを読み込んだら、html側に入力欄とエラーメッセージが表示される空のdivを用意しておきましょう。

この時使用するのが”data-bind”属性です。今回はinputタグの親要素に”validationElement”、inputタグに”textinput”、メッセージが入る空のdivに”validationMessage”というプロパティを指定しました。
ちなみに各プロパティは任意の文字列ではなく、”knockout.js”、または”knockout.validat.js”で定義されたプロパティです。

それぞれシステム側とやりとりするための目印だと思っていただいたらいいかと思います。

次にjsの記述を見てみましょう。
以下の部分でバリデーションのルールとそのルールに対する結果を定義します。

JavaScript
1
2
3
4
5
6
7
8
9
10
11
function myViewModel() {
    var self = this;
    self.email = ko.observable().extend({
        required: {
            message: '必須項目です!'
        },
        email: {
            message: 'メールアドレスの記述が間違っています!'
        }
    });
}

“required”と”email”という部分は”knockout.validat.js”で定義された文字列です。それぞれ入力の有無と、メールアドレスとして正しい文字列かどうかを判断し、falseの場合の文字を設定します。

次に以下の部分でバリデーションの初期設定を行います。

javascript
JavaScript
1
2
3
4
ko.validation.init({
    insertMessages: false,
    errorElementClass: 'has-error'
});

“insertMessages”を”true”にすると、”validationMessage”に表示されるメッセージとは別に、inputタグの直後にメッセージが表示されます。任意の場所に表示させたいのであれば、ここは”false”で構いません。
“errorElementClass”には、エラー時に付与するclass名を指定できます。
このclassは、”validationElement”を定義したDOM要素に対して付与されます。

最後の2文で、今まで定義・初期設定をしてきたバリデーションを作動させます。

JavaScript
1
2
var viewModel = ko.validatedObservable(new myViewModel());
ko.applyBindings(viewModel);

作動させてしまえば、”textinput”に入力された値に対してバリデーションが発動し、結果に合わせてメッセージを表示するという動きが完成します。

MW WP Formでバリデーションを動かしてみる

静的ページで動作確認ができたところで、いよいよ、本題であるwordpressのフォームプラグインと組み合わせてみます。

ここまでくればゴールは後少しです!

wordpressでも同様に、”jquery.js”、”knockout.js”、”knockout.validat.js”の3種類のファイルは読み込ませてください。

以下のjsの記述はそのまま使えそうですね。

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$(function() {
function myViewModel() {
    var self = this;
    self.email = ko.observable().extend({
        required: {
            message: '必須項目です!'
        },
        email: {
            message: 'メールアドレスの記述が間違っています!'
        }
    });
}
 
ko.validation.init({
    insertMessages: false,
    decorateElement: true,
    errorElementClass: 'has-error'
});
    var viewModel = ko.validatedObservable(new myViewModel());
    ko.applyBindings(viewModel);
})

後は、MW WP Formのフォーム作成画面で必要なところに”data-bind”属性をつけてあげましょう。

 

と言いたいところですが、
実はMW WP Formでは、classやtypeなどの通常htmlで使用されている属性以外は設定できないことがわかりました!

スクリーンショット 2017-09-14 1.07.32

inputタグを生成する画面に任意の属性を追加する項目はなく。。

 

スクリーンショット 2017-09-14 1.09.52

仕方なく手動で入力してみましたが反映されませんでした。。

そこで、inputタグに特定のclassをつけ、そのclassに対してjsで”data-bind”属性を付与するというやり方で対処しました。

下記のコードをバリデーションの定義より前に挿入します。

JavaScript
1
$('.target_email').attr("data-bind","value: email");

後はMW WP Formのinputタグ挿入時に、”target_email”というclassをつけてあげると問題なくバリデーションが機能しました!

注意点

今回ご紹介した方法は、htmlの役割とシステムの役割が混同してしまっているので、MVVMの考え方にはそぐわない部分があります。

そのことを理解した上で、Wordpressでリアルタイムバリデーションを実装する場合は、参考にしていただければ幸いです。

  • ツイート
  • このエントリーをはてなブックマークに追加

You may also like...

  • a9655d86fe6d2a92aa4270801aaf6b39

    WordPressのSNS自動投稿の決定版!Twitter/Facebookと連携するSNAP(NextScripts: Social Networks Auto-Poster)の使い方

    18 1月, 2019

  • 15285626_xxl

    見積もりにCMSってあるんですが何ですか?とならないための3つのポイント

    20 11月, 2015

  • Local_by_Flywheel_top

    WordPressをlocal環境で高速構築!Local by Flywheelの使い方徹底解説!

    24 11月, 2017

プログラマー募集
  • Next story Ajax処理を実装しよう!(サーバーサイド編)
  • Previous story Ajax処理を実装しよう!(フロントエンド編)

弊社サービス

MONJI+ MUGHEN ALAKI クラウド型受発注システム さよなら過去のAR。WebARがイベント集客に革命を起こします。

運営会社

ALAKI株式会社 ALAKI株式会社採用サイト

人気の記事

  • alaki1462_A_businessman_who_works_logically_1da80a2e-c297-4911-bdd6-feba0ebf1357

    仕事術

    【書籍要約】数学的な仕事術大全

    4 11月, 2024

  • fv-main-img-min

    空間コンピューティング

    世界初!「空間コンピューティング」を専用端末不要、スマホのWebブラウザのみで実現する『Web XR Site』を公開しました

    22 6月, 2023

  • Virtual reality players isometric vector illustration. VR UI and navigation. Futuristic digital technology. Virtual screen. Mixed reality 3d concept. Person in VR headset. Web banner idea

    AR

    Appleから新世代MRグラス「Vision Pro」の登場 – デジタルと現実世界が融合する新時代へ

    6 6月, 2023

  • AWE

    未分類

    ARアプリ『MUGHEN』が世界最大のAR/VRアワード「AWE」のファイナリストに選出されました!

    26 5月, 2023

  • python-logo-master-v3-TM

    pyhotn / 業務効率化

    「SwinIR」で高画質化した画像を pythonを使用して一括で元のサイズに戻す方法

    2 2月, 2023

カテゴリー

  • AI・ディープラーニング
  • AR
  • BtoB
  • CMS
  • Git
  • Google AdWords
  • gulp
  • Javascript
  • Laravel
  • Photoshop
  • Pug
  • pyhotn
  • Sass
  • SEO
  • SNS
  • Twitter広告
  • VR
  • Web3.0
  • WEBサイト
  • WEBマーケティング
  • YouTube
  • コーディング
  • システム開発
  • スマートフォンサイト
  • セキュリティ
  • セミナー
  • その他
  • ツール
  • デザイン
  • ベトナムレポート
  • 仕事術
  • 未分類
  • 業務効率化
  • 空間コンピューティング
  • 色

アーカイブ

  • 2024年11月
  • 2023年6月
  • 2023年5月
  • 2023年2月
  • 2023年1月
  • 2022年12月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年2月
  • 2021年12月
  • 2021年9月
  • 2021年7月
  • 2021年6月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年6月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年11月
  • 2018年9月
  • 2018年8月
  • 2018年7月
  • 2018年6月
  • 2018年5月
  • 2018年4月
  • 2018年3月
  • 2018年2月
  • 2018年1月
  • 2017年12月
  • 2017年11月
  • 2017年10月
  • 2017年9月
  • 2017年8月
  • 2017年7月
  • 2017年6月
  • 2017年4月
  • 2017年3月
  • 2017年2月
  • 2017年1月
  • 2016年12月
  • 2016年11月
  • 2016年10月
  • 2016年9月
  • 2016年8月
  • 2016年7月
  • 2016年6月
  • 2016年5月
  • 2016年4月
  • 2016年3月
  • 2016年2月
  • 2016年1月
  • 2015年12月
  • 2015年11月
  • 2015年10月
  • 2015年9月
  • 2015年7月
  • 2015年3月
  • 2015年2月
  • 2015年1月
  • 2014年12月
  • 2014年11月
  • 2014年10月
  • 2014年9月
  • 2014年8月
  • 2014年7月
  • 2014年6月
  • 2013年10月
  • 2013年9月

Facebook

お問い合わせ

お問い合わせ

人気の記事

  • 【書籍要約】数学的な仕事術大全
  • 世界初!「空間コンピューティング」を専用端末不要、スマホのWebブラウザのみで実現する『Web XR Site』を公開しました
  • Appleから新世代MRグラス「Vision Pro」の登場 – デジタルと現実世界が融合する新時代へ
  • ARアプリ『MUGHEN』が世界最大のAR/VRアワード「AWE」のファイナリストに選出されました!
  • 「SwinIR」で高画質化した画像を pythonを使用して一括で元のサイズに戻す方法

カテゴリー

  • AI・ディープラーニング
  • AR
  • BtoB
  • CMS
  • Git
  • Google AdWords
  • gulp
  • Javascript
  • Laravel
  • Photoshop
  • Pug
  • pyhotn
  • Sass
  • SEO
  • SNS
  • Twitter広告
  • VR
  • Web3.0
  • WEBサイト
  • WEBマーケティング
  • YouTube
  • コーディング
  • システム開発
  • スマートフォンサイト
  • セキュリティ
  • セミナー
  • その他
  • ツール
  • デザイン
  • ベトナムレポート
  • 仕事術
  • 未分類
  • 業務効率化
  • 空間コンピューティング
  • 色

検索

ALAKI株式会社 © 2025. All Rights Reserved.