jQuery UIのsortableを使って、リストをドラッグで並び替えをし、並び順を書き換えてからSQLで送信します。
もくじ
js関連記事
【jQuery】pdfが存在するか、mimeタイプのバリデーションする
jQuery UIのsortableを使ってリストをドラッグで並び替える
jQueryのモーダルウィンドウを使ってフォームの確認画面を実装する
HTMLのcanvasタグとJavaScriptで円グラフの画像をつくる
bxSliderをカルーセルやコンテンツスライダーなど便利なサンプル5種
bxSliderの使い方と、オプションでのカスタマイズ方法
select・optionタグをjQueryで、プルダウンの選択値を取得、変更する
jQueryでinput[type="file"]で画像アップロード時にプレビューを表示する
jQueryでrequiredの専用エラー文と文字数制限のバリデーションをつくる
sortableのサンプル
See the Pen
Untitled by むぅ (@mugenweb)
on CodePen.0
sortableで並べ替えができるリストの作成
HTML
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script type="text/javascript" src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script> <ul id="sort"> <li>動かせる項目1</li> <li>動かせる項目2</li> <li>動かせる項目3</li> </ul>
jQueryを読み込んでから、jQuery UIを読み込みます。
もし動かない場合は読み込む順番が間違ってないか確認しましょう!
動かしたい要素の親要素にid="sort"
を指定しています。
セレクタはなんでも大丈夫ですが、今回はidを使用しています。
sortableを指定するJavaScript
JavaScript
$(function () { $("#sort").sortable(); });
HTMLで指定したセレクタを指定し、sortable()
とするだけでドラッグできるようになります。
ドラッグ中にカーソルを変えるcss
css
.ui-sortable-handle { cursor: grab; } .ui-sortable-handle:active { cursor: grabbing; }
sortable()
を使うとドラッグできる要素にui-sortable-handle
クラスが追加されるので、cssでカーソルを指定しておくとドラッグできる要素だと視覚的に「ドラッグできる要素なんだ」と認識してもらいやすくなります。
現在の並び順を取得する
HTML
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script type="text/javascript" src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script> <ul id="sort"> <li id="1">動かせる項目1</li> <li id="2">動かせる項目2</li> <li id="3">動かせる項目3</li> </ul>
JavaScript
$(function () { $("#sort").sortable({ update: function () { $("#log").text($('#sort').sortable("toArray")); } }); });
先程のコードを少し変更します。
JavaScriptのtoArray
の指定では、ドラッグ対象の要素のidを元に取得するので、事前にドラッグ対象の要素全てにidを設定する必要があります。
この場合はliにはidを振ります。
移動した並び順を書き換える
HTML
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script type="text/javascript" src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script> <ul id="sort"> <li id="1">動かせる項目1 <input type="text" class="seq" value="1" name="seq[1]"></li> <li id="2">動かせる項目2 <input type="text" class="seq" value="2" name="seq[2]"></li> <li id="3">動かせる項目3 <input type="text" class="seq" value="3" name="seq[3]"></li> </ul>
JavaScript
$(function () { $("#sort").sortable({ update: function () { $("#log").text($('#sort').sortable("toArray")); var i = 1; $(".seq").each(function () { var seq = $(this).val(i); i++; }); } }); });
先程のコードを少し変更します。
今回はドラッグが完了したタイミングで、inputタグに現在の並び順を反映させます。
inputタグには、クラスseq
を指定してあり、それらを順番にインクリメントした値で書き換えます。
こうすることで、ユーザーが実際に並び替えたい順番を取得することができます。
ここまでできたら、これをSQLに反映させるだけです。
移動した並び順からSQLを作成する
PHP
foreach ($_POST['seq'] as $key => $val) { $strSql = 'UPDATE table_name SET seq = :seq WHERE id = :id'; $params = [ ':id' => $key, ':seq' => $val, ]; $result = $obj->insert($strSql, $params); }
前回のコードで、入力値が自動で反映されるようになったので、formで送信することでUPDATE処理を行います。
inputタグにname="seq[1]"
をしてるので、送信されたデータからSQLを作成します。
あとはforeachで添え字からidを、値から並び順を取得し、UPDATEするだけです。
ただこれはバリデーションをしていないし、送信されたデータごとにUPDATE文を投げているので項目数が多い場合は対策が必要です。
コメント