
たいそうな見出しをつけましたが、ようは上の画像のように、EXCELっぽいインターフェースなんだから、見積書なんぞに使えるんでねぇの?ということです。
Handsontableについては、前回の記事を参考にしてください。
今回は、HTML+PHP+MySQL+Javascript(jQuery)と「Handsontable」を使って、上の様なことをやってみたいと思います。
とはいえ、HTMLのところはそれほど難しくないです。前回とまったく同じ。
Excel風インターフェースを表示したい部分にIDを指定した要素を配置しておきます。
<div id="excel"></div>
そして、PHP+MySQLから必要なデータを取得しておきます。見積・請求の詳細データですね。
// 結果を格納する配列
$details = array();
// SQLでごにょごにょやってデータをとってきます
$sql = "SELECT * FROM [テーブル] WHERE id='[条件]'";
$rs = mysql_query($sql);
while($row = mysql_fetch_assoc($rs)){
$details[] = $row;
}
そのとってきたデータをJSON形式にします。
<script>
var data = [
<?php
foreach($details as $d){
echo "['".$d['rows']."', '".$d['name']."', '".$d['num']."', '".$d['label']."', '".$d['price']."', '".$d['memo']."'],";
}
?>
];
</script>
あとで使うので、配列を一つ用意します。
fileds = ['rows','name','num','label','price','total','memo'];
Handsontableを書き出します。
var $container = $('#excel');
$container.handsontable({
// 上で指定したデータを使って描画します
data: data,
// 列名を以下にします
colHeaders: ["番号", "商品名", "数量","単位","単価","合計","備考"],
// 行ラベルを表示します
rowHeaders: true,
// 最低12行は表示します
minRows: 12,
// 最低7列は表示します
minCols: 7,
// 列幅を指定します
colWidths: [10,150,20,20,30,50,100],
// 変更後に呼び出されるコールバック関数を指定します
onChange: function(change, source) {
if(source === 'loadData') return;
// change[0]の中に、変更した行数、列数、変更前の値、変更後の値が
// 配列で入っていますので、それを使って、変更された場所、値を呼び出します
onField = fileds[change[0][1]]; // 変更フィールド名の取得
onRow = change[0][0]+1; // 変更行数の取得
onData = change[0][3]; // 変更後のデータ取得
$("#"+onField+onRow).val(onData); // 値をセット
onNum = $("#num"+onRow).val(); // 変更行の数量取得
onPrice = $("#price"+onRow).val(); // 変更行の単価取得
if(onNum*onPrice > 0){
data[onRow-1][5] = onNum*onPrice;
}else{
data[onRow-1][5] = "";
}
$container.handsontable('render');
}
});
オプションについてはカンタンに説明は書いてますが、詳しくはHandsontableの公式サイトを確認してください。
ようするに、14行目まではHandsontableの描画設定、15行目以降はHandsontableで変更があった際に、「input type=”hidden”」要素の値を書き換えにいっています。下の様に必要個数分だけhidden要素を用意しておけばいいわけです。
<input type="hidden" name="rows[1]" id="rows1" value=""> <input type="hidden" name="name[1]" id="name1" value=""> <input type="hidden" name="num[1]" id="num1" value=""> <input type="hidden" name="label[1]" id="label1" value=""> <input type="hidden" name="price[1]" id="price1" value=""> <input type="hidden" name="memo[1]" id="memo1" value=""> <input type="hidden" name="rows[2]" id="rows2" value=""> <input type="hidden" name="name[2]" id="name2" value=""> <input type="hidden" name="num[2]" id="num2" value=""> <input type="hidden" name="label[2]" id="label2" value=""> <input type="hidden" name="price[2]" id="price2" value=""> <input type="hidden" name="memo[2]" id="memo2" value=""> ・・・
ちゃんと、数量か単価に変更があったら数量×単価がされるように26行目から指定しています。
最終的に31行目で再描画することで、合計値を表示しています。
このようにすれば、インターフェースをEXCELっぽくしてWEBアプリが作れます。
このプラグインは使い勝手がありそうです。
