hx-post の利用
a-blog cms を長く利用されている方であれば、POST
リクエストで部分的に HTML を取得・表示する post include 機能を使った経験があるかもしれません。hx-post
は、この post include の発想を引き継ぎつつ、より汎用的で拡張性の高い 上位互換 と考えて差し支えありません。
post include が POST
メソッド限定だったのに対し、htmx の hx-post
では hx-get
をはじめとする他のメソッドとも共通の書き方で扱えるため、これまで実現できなかった部分更新のパターンや UI を、同じシンプルな記述で実装できるようになりました。
基本構文
<form action="" method="post"
hx-post=""
hx-target="#search-result"
hx-swap="outerHTML">
<input type="hidden" name="tpl" value="/include/entry/search-result.html">
<input type="text" name="keyword" placeholder="キーワード">
<button type="submit" name="ACMS_POST_2GET_Ajax">検索</button>
</form>
<div id="search-result">
<!-- 送信結果がここに表示される -->
</div>
この例では、もともと a-blog cms で動作している検索機能に htmx を組み合わせ、ページ遷移なしで検索結果を表示します。
変更点は次のとおりです。
hx-post
/hx-target
/hx-swap
を付与hx-post=""
で現在のページに POST 送信し、返ってきた HTML を#search-result
の要素ごと(outerHTML
)置き換えます。name="tpl"
の hidden フィールドを追加
取得した HTML を描画するテンプレート(例:/include/entry/search-result.html
)を指定します。送信ボタンの
name
を変更
通常の検索フォームではname="ACMS_POST_2GET"
となっていますが、これをname="ACMS_POST_2GET_Ajax"
に変更します。これにより、指定したテンプレートを使った部分的な HTML を返すモードになります。
この方法を使えば、既存の検索フォームを大きく書き換えることなく、スムーズな Ajax 型の検索に置き換えられます。
hx-push-url と ACMS_POST_2GET_Ajax の拡張設定
hx-post
で hx-push-url="true"
を指定すると、フォーム送信後の履歴には hx-post
に指定した URL がそのまま記録されます。そのため、例えば次のような URL になることがあります。
https://example.com/keyword/検索文字列/tpl/include/entry/search-result.html
この URL をブラウザで直接リロードすると、tpl
パラメータ以降を解釈できず、404 Not Found となってしまいます。この状態では、履歴やブックマークからの再アクセスが正常に動作しないため、hx-push-url
のメリットが活かせません。
この問題を解消するために、a-blog cms では ACMS_POST_2GET_Ajax に URL を組み立て直す機能が追加されました。この機能を有効にすると、履歴には tpl
以降を除いた URL が保存され、リロードやブックマーク時にも正しくページが表示されるようになります。
利用方法
<div data-acms-hx-push-url="true">
<!-- 検索結果の内容 -->
</div>
この属性を持つ要素がテンプレート内に含まれている場合、ACMS_POST_2GET_Ajax
が履歴用の URL を組み立て直し、tpl
以降を除外して履歴に反映します。
最終的に履歴へ保存される URL
data-acms-hx-push-url="true"
を返却テンプレートに指定し、hx-post
で hx-push-url="true"
を用いた場合、履歴には tpl
以降を除いた 正規化された URL が保存されます。
https://example.com/keyword/検索文字列/
この形であれば、リロードやブックマーク、共有時にも期待通りのページが表示されます。
hx-post 実装例
siteテーマ「事例紹介」検索機能
https://utsuwa3m.ablogcms.org/works/htmx.html#works-search
通常のグローバルナビゲーションからアクセスするページでは、htmx を利用しない通常の検索機能として実装されていますが、htmx.html に実装サンプルが用意されています。
詳しくは hx-swap-oob 実装例 をご覧ください。