デーブルタグを使って表示しているリストを、編集画面に飛ばさずテーブル上でデータ修正して、DB更新したい、という場合のサンプルです。
あいかわらず自分向けのメモメモなので、流用する場合は修正が必要な場合があります。
動作概要
前提としては、DBから読み込んだデータをテーブルタグを使ってリスト表示している状態。
行の一番右側に「編集」ボタンを表示しておき、このボタンがクリックされたら、その行を編集モードに切り替える。
編集モードに切り替わると、「編集」ボタンが消えて「保存」「キャンセル」ボタンが表示される。
「保存」ボタンをクリックすると修正した内容でDBが更新され、「キャンセル」をクリックすると編集モードを終える。
表の一番下には追加用の行が表示され、この行に入力して右側の「追加」ボタンをクリックすると、新しい行が追加される。
この条件で作成し、ブラウザで表示したものがこれ。
1行目が編集モードになっている状態、2行目が表示されているだけの状態、3行目が最終行で行追加ができる状態です。
ソース:HTML部分
テーブルタグで画面表示を行う部分です。
<table id="list">
<thead>
<tr id="list-title">
<th class="id">ID</th>
<th class="name">名前</th>
<th class="remarks">備考</th>
<th class="updated">更新日</th>
<th></th>
</tr>
</thead>
<tbody>
<tr class="data-edit">
<form method="post" action="<?php print basename( __FILE__ ); ?>">
<td class="id">1</td>
<td class="name_value">テスト 太郎</td>
<td class="name_change"><input type="text" name="name" value="テスト 太郎" maxlength="128"></td>
<td class="remarks_value">めもめも</td>
<td class="remarks_change"><input type="text" name="remarks" value="めもめも" maxlength="128"></td>
<td class="updated">2019-02-01</td>
<td class="button">
<input type="button" value="編 集" class="edit-line">
<input type="submit" value="保 存" class="save-line">
<input type="button" value="キャンセル" class="cancel-line">
</td>
<input type="hidden" name="id" value="1">
<input type="hidden" name="mode" value="update">
</form>
</tr>
</tbody>
<tfoot>
<tr id="add">
<form method="post" action="<?php print basename( __FILE__ ); ?>">
<td class="id"></td>
<td class="name"><input type="text" name="name" maxlength="128"></td>
<td class="remarks"><input type="text" name="remarks" maxlength="128"></td>
<td class="updated"></td>
<td class="data-edit"><input type="submit" value="追 加"></td>
<input type="hidden" name="mode" value="add">
</form>
</tr>
</tfoot>
</table>
ソース:jQuery部分
表示モードと編集モードを切り替えるためのjQueryです。
$(function(){
// 編集ボタンクリック処理
$('.edit-line').click(function(){
$(this).parent().find('.edit-line').hide();
$(this).parent().find('.save-line').show();
$(this).parent().find('.cancel-line').show();
$(this).parents('.data-edit').find("[class$='_value']").hide();
$(this).parents('.data-edit').find("[class$='_change']").show();
});
// 保存ボタンクリック処理
$('.save-line').click(function(){
$(this).parent().find('.edit-line').show();
$(this).parent().find('.save-line').hide();
$(this).parent().find('.cancel-line').hide();
$(this).parents('.data-edit').find("[class$='_value']").show();
$(this).parents('.data-edit').find("[class$='_change']").hide();
});
// キャンセルボタンクリック処理
$('.cancel-line').click(function(){
$(this).parent().find('.edit-line').show();
$(this).parent().find('.save-line').hide();
$(this).parent().find('.cancel-line').hide();
$(this).parents('.data-edit').find("[class$='_value']").show();
$(this).parents('.data-edit').find("[class$='_change']").hide();
});
$("[class$='_value']").show();
$("[class$='_change']").hide();
});
ソース:PHP部分
PHPの処理としては、POSTで送られてくるパラメータによって追加・更新処理を行います。
// POSTで送られてくるパラメータの取得
$mode = filter_input( INPUT_POST, 'mode', FILTER_SANITIZE_STRING );
$post_data['id'] = filter_input( INPUT_POST, 'id', FILTER_SANITIZE_STRING );
$post_data['name'] = filter_input( INPUT_POST, 'name', FILTER_SANITIZE_STRING );
$post_data['remarks'] = filter_input( INPUT_POST, 'remarks', FILTER_SANITIZE_STRING );
if( $mode === 'add' ){
# DB追加処理
} else if( $mode === 'update' ){
# DB更新処理
}
さいごに
行をクリックしたら編集モードに切り替わるようにすれば、もうちょっと使い勝手が良くなるかもしれません。
ボタンの配置をどうするかが悩みどころですが、更新日はDB側で自動設定するので、編集モード中は、更新日カラムに「保存」「キャンセル」ボタンを表示してもいいかも。
次のステップは、画面更新をまったく挟まずに、DB更新してテーブルを表示しなおす、かな。
初稿:2019年2月9日
コメント