2016年4月25日月曜日

CodeIgniterとGrocery CRUDに選択一括削除機能を付ける方法

http://www.grocerycrud.com/より抜粋


CodeigniterのCRUD画面を自動生成してくれる便利なライブラリGrocery CRUDにチェックボックスで選択した項目を一括削除する機能を追加しましたので、その方法をブログにまとめました。
  エラーチェックをしていなかったりなどそのまま使うには不完全なところもありますので、適宜付け加えて使ってみてください。

はじめに


Codeigniter とは、アメリカの EllisLab によって開発された PHP のフレームワークです。
低い学習コストと圧倒的な速さから4大フレームワークの1つに数えられることもある大変人気のあるフレームワークの1つです。


そんなCodeIgniterですが、シンプルであるがゆえに単純なデータベースのCRUDを実装するにもコード量が多くなってしまうという欠点があります。

そこでGrocery CRUDというライブラリを使うことで半自動的にCRUD画面を作成し、その欠点を補ってくれるので便利なのですが、一気に大量のデータを削除したいときに一括削除の機能がなかったため、追加してみました。

Grocery CRUDの基本的な使い方はこちらに分かりやすく説明されています。

選択一括削除機能の追加

1. こちらの公式ドキュメントを用意し、Grocery CRUDを用いて基本的なCRUD画面を作成する

 ※このブログではCodeigniter 3.0.6、grocery CRUD 1.5.2で検証しています。


2. Examplesコントローラ(Examples.php)に受け取ったデータを削除するメソッドを追加
function delete_selection() {
    $id_array = array();
    $selection = $this->input->post("selection");
    $primary_key = $this->input->post("primary_key");
    $table_name = $this->input->post("table_name");

    $id_array = explode("|", $selection);
    $delete_flag = false;
    $deleteNum = 0;
    $errorMessage = '';
    foreach ($id_array as $item) {
        if ($item != '' && $item != 'on') {
            //1行ずつ削除
            $this->db->where($primary_key, $item);
            $mes = $this->db->delete($table_name);
            if (!$mes) {
                $errorMessage .= $this->db->error()['message'] . "\n";
            }
        }
    }
}

3. application/libraries/Grocery_CRUD.phpの1557行目にテーブル名をビューに渡すための変数追加
$data->table_name = $this->get_table();

4. assets/grocery_crud/themes/datatables/views/list.php最上部にチェックボックスのチェック状態を取得し削除メソッドを呼び出すためのJavascriptを追加
<script type="text/javascript">
function delete_selected()
{
    var list = "";
    $('input[type=checkbox]').each(function() {
        if (this.checked) {
            //remove selection rows
            $('#custom_tr_'+this.value).remove();
            //create list of values that will be parsed to controller
            list += this.value + '|';
        }
    });

    alert('一括削除します');

    //send data to delete
    $.post('<?php echo site_url('masters/delete_selection'); ?>', {selection: list, primary_key: '<?= $primary_key ?>', table_name: '<?= $table_name ?>'}, function (data) {

    alert(data);
        location.reload();
    });
}
</script>

5. 見出し行のカラムをチェックボックスに合わせて増やすため、27行目当たり、theadの先頭に下記追加
<th width="20px"><th>


6. 各行にチェックボックスを表示するため38行目あたりに下記追加
<td><input type="checkbox" name="custom_delete" value="<?= primary_key_value?>" />


7. 検索窓のカラムをチェックボックスに合わせて増やすため、84行目あたり、tfootの行の先頭に下記追加(非表示のINPUTタグ)
<th><input type="text" style="display:none;"></th>


8. 最下行に削除ボタン追加
<input type="button" value="Delete Selected" class="delete_all_button" onclick="delete_selected();">


これで下記のようにテーブルの左にチェックボックス、下部にDelete Selectedボタンが出現し、チェックしたデータの一括削除がおこなえるようになりました。




チェックをしてDelete Selectedボタンを押すとアラートが現れ、OKを押すと該当レコードが一括削除されます。


140 180 Codeigniter , CRUD , grocery CRUD , MySQL , PHP

記載されている会社名、および商品名等は、各社の商標または登録商標です。

0 コメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...