kazumich.log

AjaxZip 2.0 を使って住所を自動入力

この記事は公開日より年以上経過しています

情報が古くなっている可能性がありますのでご注意ください。

a-blog cmscompany1のテーマのお問い合わせフォームに AjaxZip 2.0(郵便番号から住所を検索するJS)を標準インストールにしようかと思っていたのですが、ちょっとファイルサイズが大きいので同梱するのは辞める事にした。 なので、その方法を書いてみる事にしました。



まずは、AjaxZip 2.0 をダウンロードします。そして、以下の場所にアップロードします。 標準で jquery.js は読み込んでいますので、今回は jquery.js や prototype.js は必要ありません。


/js/ajaxzip2/ajaxzip2.js
/js/ajaxzip2/data (ディレクトリ)

これで、ファイルの設定は完了です。

次に、この JS とデータを読み込む設定を


/themes/company1/contact.html


<script src="/js/ajaxzip2/ajaxzip2.js" charset="UTF-8"></script>
<script>AjaxZip2.JSONDATA = '/js/ajaxzip2/data';</script>

を </head>の前に書きます。次は、contact.html で include している form/input.html を編集します。


<input size="12" value="{zip}" name="zip" type="text" />


<input size="12" value="{zip}" name="zip" type="text" onKeyUp="AjaxZip2.zip2addr(this,'pref_code[]','address');" />

のように onKeyUp="AjaxZip2.zip2addr(this,'pref_code[]','address');" を追記します。これでとりあえず、都道府県のプルダウンと住所のTEXTAREAに編集されるようになります。AjaxZip 2.0 のページに設定例がいろいろ書かれていますので、そのフォームにあわせたものは設定を変更下さい。

ここで大事なのは、どこにファイルを置き、そのファイルの置き場をどう指定するかくらいだと思います。AjaxZip 2.0が良く出来ているので、いろいろなフォームで活用できるようになっています。 川崎さん、いいモノを作られていますね。 ありがとうございます。




次のバージョンでは、少し修正したいと思っている事を書いておきます。

今、都道府県が pref_code[] となっていますが、1つの項目のものなので、pref_code である方が正しい記述になると思います。


今回のサンプルのファイルをダウンロードできるようにしました。

AjaxZip 2.0は別途ダウンロード下さい。

更新

Recommendation

a-blog cms と htmx で作る SPA(Single Page Application) なブログテーマの実装方法

今回、この a-blog cms で作られているブログを htmx を利用して SPA(Single Page Application) にする実験をしてみましたので、その点について紹介をしてみます。 Single Page Application(SPA)とは ウェブ開発の世界では、Single Page Application(SPA)がますます人気になっています。SPA は、従来の複数ページからなるウェブサイトと異なり、単一の HTML ページで動作し、ユーザーの操作に応じて部分的に、必要なデータだけをサーバーから取得するためデータの授受が最小限になり、ページの表示速度向上が向上します。 一般的には、React や Vue.js などのフレームワークを利用して構築することが多く、エンジニアのコストが増えることもあります。 htmx をフロントエンドに、 バックエンドには a-blog cms を採用すると a-blog cms では、PHP のコードを書くことなく、テンプレートには HTML のみを記述し、管理画面で表示件数やソート順、表示する情報の条件を設定する必要がなく、バックエンドのコードは記述する事がありません。また、そのテンプレートの HTML に属性を追加するだけで、htmx が動作し、手軽に SPA を実現することが可能です。 最初のアクセスは a-blog cms が担当 トップページはもちろんですが、Google検索や SNS のリンクなどで途中のページにアクセスがあった際にも、最初のアクセスは a-blog cms がページ全体の HTML を生成します。 分かりやすくするために、サブカラムの一番上に a-blog cms のロゴを表示するようにしています。 2ページ目以降は htmx が担当し Ajax で更新しています 1ページ目を表示し、どこかのリンクをクリックすると Ajax で部分的にページを更新するような実装になっています。この時には a-blog cms のロゴだったところが、htmx に変わっている事で確認できます。 History API の活用( hx-push-url ) 一般的には htmx の属性で hx-push-url="true" と追加することで、htmx でページを書き換えた際にブラウザの URL も変更されます。また、URL 以外にタイトルタグの更新も簡単にできるため、ページ全体をリロードしない部分的な更新であっても、ブラウザの履歴にはクリックするたびにタイトルと URL が記録されます。そのため、ブラウザの戻るボタンで前のページに戻ることが可能になります。 今回の実装では、この書き換えられた URL でブラウザのリロードをした場合に a-blog cms が同様のページを生成できるように、hx-push-url="{url}" のように URL を指定し History API に書き込む情報を調整しています。 htmx 化する際の実装方法 リンクの修正 通常 &lt;a herf="{url}"&gt; と書かれているようなリンクを以下のように修正します。 今回は、ほとんどのリンクが entry-body.html のテンプレートを利用して部分的にページを更新する事になりました。内容としては、以下のようになります。 元のリンク先 a-blog cms をバックエンドに利用する際には必要な記述 htmx でアクセスする URL を指定 History API に記録したい URL を設定 置き換えたい場所の &lt;div id="main-contents"&gt; &lt;div&gt;を残す設定 置き換えたい場所を指定 ページの上部にスクロールする a-blog cms 側の設定 「htmx でアクセスする URL を指定」で、例えば https://kazumich.com/htmx-spa-blog202405.html/tpl/include/htmx/entry-body.html と指定しているとすると https://kazumich.com/htmx-spa-blog202405.html で表示される内容を、/tpl/include/htmx/entry-body.html のテンプレートに切り替えて表示させるという指示になります。 次に、そのテンプレートについて解説します。 呼び出されるテンプレート entry-body.html 呼び出されるテンプレートについては、もともと Entry_Body のモジュールだけ書かれているテンプレートファイルですが、ここに Topicpath モジュールと、タイトルタグを生成するための Ogp モジュールを追記して1つのファイルにまとめています。 (略) (略) htmx:{title} entry-body.html のテンプレートファイルの中で hx-swap-oob="true" が付いている &lt;div id="topicpath"&gt; 〜 &lt;/div&gt; は、id="topicpath" の部分が置き換わります。hx-swap-oob="true" については複数のエリアを一緒に更新ができる便利な属性になります。また、&lt;title&gt;〜&lt;/title&gt; については htmx の属性をつける事なくタイトルタグを置き換えることができます。 残った HTML が、&lt;div id="main-contents"&gt; 〜 &lt;/div&gt; に置き換えられる事になり、複数のエリアの置き換えが完了する事になります。 このように a-blog cms を利用するとバックエンドの処理を PHP で書くことなく、htmx を呼び出すついでに、呼び出される HTML ファイルを書き、呼び出される側の HTML にも hx-swap-oob="true" などの属性を付加するなどして相互に関連するテンプレートを HTML だけで書いていくことが可能なのです。 検索機能の実装 これまでは &lt;a hx-get="{url}" ... &gt; タグでリンクを作成し、htmx を動かしコンテンツを呼び出すことについて説明を書いてきましたが、次は記事の検索機能を hx-post を利用して作っていくことを解説していきます。 標準的な検索フォーム htmx 化するには hx-get で方法が身についていれば、hx-post でも同様に書くことができます。今回のフォームでの htmx を動作させる場合のトリガーには hx-trigger="submit" を利用します。 加えて name="tpl" を hidden で追加します。 これで hx-post の設定は完了です。 オマケ: input 要素に hx-trigger="keyup" で htmx を動かす キーワード検索の &lt;input&gt; を以下のように修正します。 &lt;form&gt; 自体を POST する必要があると最初は考えましたが、この &lt;input&gt; タグ単体でサーバーに情報を送ることができたらと考え hx-get で呼び出したい URL を指定し、hx-trigger="keyup" で GET リクエストを送ってみたところ思った動きになりました。その後、delay:1s を追加し、1秒後に動作するようにしています。 あと、hx-push-url="true" とする事で URL も https://kazumich.com/?keyword=htmx のようになります。ここでは entry-summary.html を指定しており、サブカラムの最新記事を更新しています。 hx-post で hx-push-url="true" をする際のオマジナイ History API を利用して URL を書き換える際に、hx-get であれば URL を hx-push-url="{url}" のように、この URL にしたいと事前に設定ができますが、hx-post の場合には POST 後に URL が確定し、書き換えられた URL となってしまいます。 この URL から include/htmx/**.html を削除する JavaScript になります。 addEventListener('htmx:beforeHistoryUpdate', function (event) { const proposedUrl = event.detail.history.path; const customUrl = proposedUrl.replace(/\/tpl\/include\/htmx\/.*\.html/, ''); event.detail.history.path = customUrl; }); htmx 動作後に a-blog cms の acms.js を再度起動する a-blog cms が標準提供している JavaScript で acms.js というものがあります。ページを読み込んだ後で、この acms.js が動かないと困るようなこともありますので、HTML の読み込み後に再起動します。 addEventListener('htmx:afterSwap', function (event) { ACMS.Dispatch(event.target); }); ※ 現在、シンタックスハイライトが上記の JavaScript を書いても動作していない問題を抱えています。その点は改善された際にアップデートします。 a-blog cms で作られたブログを SPA にする ヘッドレスCMS を活用して JSON を相手に、SPA ブログを作ろうと思うと少しづつ SPA 化していくというよりは、最初からそのように実装していく事になります。その点、今回の私のブログを SPA 化する際には、部分的にこの部分を htmx を動くようにしよう! を繰り返し、最終的には全てのページの遷移を htmx で動くように進めていきました。 ビルド環境も必要ないですし、htmx の利点である JavaScript を書かない = 難しいプログラミングをしない の延長で、バックエンド側である PHP も書かず、htmx属性を追加するついでに、呼び出す HTMLテンプレートを書き、またその中に htmx属性も含める。これで a-blog cms の実装ができる人であれば誰でも簡単に SPA 化していくことが可能になるのではないでしょうか。 もちろん、a-blog cms の学習コストが高いという方もいるかと思いますが、よかったら htmx@blogテーマがどんな実装になっているのか ablogcms.io の環境で試してみてください。

a-blog cms 1.4で搭載される1ユニット更新機能

これまでの a-blog cms では、エントリーの情報を更新する際には、全てのユニットを全部表示し更新していまし た。次期バージョン1.4では、1つのユニットのみのフォームを表示させ更新する機能 が実装される予定です。 もう少し、感想が聞きたい! とりあえず、すぐに反応のあった3人を紹介しておきましょう! もっと、この事について書いてくれるようなブログが出てくるのをお待ちしてます。 .bbpBox26342757037 {background:url(http://a3.twimg.com/profile_background_images/90586715/bg.gif) #ffffff;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block} 操作の敷居が低くなっていいなあ...! → Twitter / @山本一道@アップルップル: #ablogcms 1.4で追加される1ユニット更新 ... | http://twitter.com/#!/kazumich/status/26342528942less than a minute ago via YoruFukurouなかはらnxaxmxa .bbpBox26343869718 {background:url(http://s.twimg.com/a/1285613852/images/themes/theme4/bg.gif) #f7f7f7;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block} イィネ!楽しみです。 RT @kazumich: #ablogcms 1.4で追加される1ユニット更新機能の紹介動画をアップしました。 http://bit.ly/cL0mc3 今、ご利用の方はすぐにでも使いたい機能ではないかと思います。less than a minute ago via Echofonesshi ishi`grinstyleesstwi .bbpBox26345533185 {background:url(http://a1.twimg.com/profile_background_images/145028880/body_bg_01.gif) #34a9bb;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block} おおおおお! RT @kazumich: #ablogcms 1.4で追加される1ユニット更新機能の紹介動画をアップしました。 http://bit.ly/cL0mc3 今、ご利用の方はすぐにでも使いたい機能ではないかと思います。less than a minute ago via Echofonうぇびんwebbingstudio .bbpBox26381279747 {background:url(http://s.twimg.com/a/1285890902/images/themes/theme4/bg.gif) #0099B9;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block} クライアントさんの喜ぶ笑顔が浮かびます^^ 合宿が楽しみです! RT @kazumich: #ablogcms 1.4で追加される1ユニット更新機能の紹介動画をアップしました。 http://bit.ly/cL0mc3 今、ご利用の方はすぐにでも使いたい機能ではないかと思います。less than a minute ago via Echofonmiuko47miuko47 11月19日&20日に開催される合宿時の参加者に、1ユニット更新機能が搭載された1.4aをお渡しします。すぐにでも使いたいという方は是非、合宿に参加下さい。プログラマさん向けのモジュール講座もありますし、初心者向けのヒヨコ組のための勉強会もやります。きっと、交通費+参加費くらいは元が取れるくらいのイベントになるように頑張りますので、よろしくお願いします! a-blog cms Training Camp 2010 Autumn : ATND

a-blog cmsの続きを読むをAjax対応にする方法

検索部分のAjax対応について company3で試すjs-post_inculde機能 | kazumich.log で書きましたが、今回は続きを読むのリンクについてカスタマイズしてみようと思います。カスタマイズのベースとなるテーマとしては、1.3.0bより同梱されるようになった company3 です。 初期状態の続きを読む部分 まずは、今回のカスタマイズをする部分を見てみましょう。 一覧用のテンプレートになりますので、index.html というファイルになります。company3 には /themes/company3/index.html(標準的に利用される日付がない一覧) /themes/company3/news/index.html(日付がある一覧) /themes/company3/search.html(検索結果一覧) /themes/company3/search.html(タグ検索結果一覧) の4つの一覧表示のテンプレートがあるようです。まずは、お知らせ(/news/)のテンプレートを修正していきましょう。 「{continueName}」の続きを読む 違うテンプレートで表示させる URL上に /tpl/**テンプレート名** と書く事でテンプレートを切り換える事が可能です。以下のように修正して下さい。 「{continueName}」の続きを読む include/continue.html という以下のファイルが1.3.0b2以降は用意されていますので、これで実際にブラウザで表示させると、続き部分のみが表示されたかと思います。これは、Entry_Continue というモジュールが動作し、続き部分のみを表示させたからという事になります。 通常のリンクをAjax対応に フォームからの情報をPOSTすると、その部分だけを書き換えてくれる js-post_include 機能というものを利用しますので、aタグでのリンクだった部分をformで処理するように以下のように修正します。 あとは、ボタンのスタイルを調整するとか、画像のボタンにするとかで好みにあわせてカスタマイズして下さい。残り3つのテンプレートも同様に修正する事で、company3のテーマでの続きを読む部分をAjax対応は完了となります。 以下に、結果の動画だけ貼っておきます。前半は検索結果のAjax化、後半がココで紹介した続きを読むのAjax化です。フォームに class="js-post_include" というクラスを書き、target="#main" のような感じでどのエリアを書き換えるかを指定するだけ でページのリロード無しにコンテンツを書き換える事ができるようになります。アイデア次第で、いろいろなところで利用可能かと思います。一度、お試し下さい。

company3で試すjs-post_inculde機能

a-blog cms 1.3.0b では、JavaScriptが分からない人でもAjax機能を実装する事が簡単に出来る機能が用意されております。その方法を簡単に書いておきますので、よろしければ以下の手順のようにお試し下さい。 サイト内検索した時にリロード無しにメインのコンテンツエリアを書き換える 修正するファイルは、/themes/company3/include/subInfo.html のみで、最初は以下のような感じになっております。 検索 メインコンテンツの表示内容の確認 まずは、何が起っているのか分かるようにAjax機能を利用せずに、ページ遷移して目的の表示をさせてみます。上記との違いは、 "hidden"で渡している"tpl"の値を /themes/company3/search.html から /themes/company3/include/search.html に変更します。実行して頂いてソースを確認して頂けば分かる事ですが、簡単に説明すると<html>タグから始まるHTML全文でなく、JavaScriptで書き換えたい部分だけにしたHTMLのテンプレートになっています。 Ajax化するにはclassとtargetを指定するだけ 次に、formタグに class="js-post_include" target="#jsChangeContents" を追記します。 完成形は以下のような感じ。target属性は、どこのdivを書き換えるかを指定しています。targetが無いと、そのフォーム自身が置き換わります。 検索 jQueryを利用してオリジナルでPHPのプログラムを書いて同様の事をしようとすると、凄い大変な作業かと思いますが、a-blog cms であれば、やってみよう!と思えば数分で実装が可能です。これは一度ご自身で体験してみて下さい。私自身、このエントリーを書きながらカスタマイズして感動しています。 a-blog cms 1.3.0b のダウンロードはこちら! ※注意: js-post_include はPOSTで動作しますので、このサンプルで表示されるページャーのリンクは正常に動作しません。その部分は別の方法で実装する必要がありますので、ご了承下さい。

a-blog cmsでAjax検索機能を実装 (1.2.2b) その2

昨晩書いた a-blog cmsでAjax検索機能を実装 (1.2.2b) では、以下のように書いています。 (検索されるとココが置き換わります) (検索されるとココが置き換わります) 今回は、SUBMITボタンを押さないで表示させるような事をしてみたいと思います。 class="js-post-include" を class="js-post-include-ready" と -ready" を追記します。 また、検索の条件になる keyword の value を設定しておきます。 これで、検索のボタンを押さなくても(検索されるとココが置き換わります)が置き換わって表示されるようになります。 (検索されるとココが置き換わります) であれば、入力やボタンが無くてもいい事になりますので、さらに以下のように修正します。 随分、すっきりした感じですね。 条件の設定ができませんが、以下の部分には CSS で検索された結果が表示されているハズです。 ソースは上記の form タグが書かれています。 いかがでしょうか? こんな感じに class="js-post_include-ready" を利用する事ができます。 その3 では、検索エンジンのキーワードに反応させる方法というのを書いて見ます。 1.2.2bという未配布のバージョンのものについて書いていますので、もう少しだけお待ち下さいね。

Contact

お問い合わせはこちら