前回、拡張の方法としてはGridに特化して、Gridで表示されているカラムやrendererを利用して、見えているものが、タブ区切りでダウンロードできる事を検討した。が、見えているものとは別に列やフォーマットを指定できる方が汎用性が高いことが分かり、その方向で拡張を実施することとした。
拡張したdownloadメソッド
/** * Download store data * @param {Object} opt (optional) Specifies download filename and columns. */ Ext.data.Store.prototype.download = function(opt){ opt = opt||{}; var output=[],o=[], columns = opt.columns||(function(st){ var cs=[], i=0; st.fields.eachKey(function(k) {cs.push(k);}); return cs; })(this), fn = opt.filename||opt.fn||'download.txt'; for (var i=0,col; col=columns[i]; ++i) { if (typeof col === 'string') { columns[i] = col = {field: col} } if (!col.header) col.header = col.field; if (!col.format) col.format = function(v,r){return v;}; o.push(col.header); } output.push(o.join('\t')); this.each(function(rec) { var o=[]; for (var i=0,col; col=columns[i]; ++i) { o.push(col.format(rec.get(col.field), rec)); } output.push(o.join('\t')); }); var form = Ext.DomHelper.append(document.body, { tag: 'form', style: 'display:none', action: 'download.php', method: 'post', cn:[{ tag:'textarea', name:'body', html:output.join('\n') },{ tag:'input', name:'Content-Disposition', value:'attachment;filename='+'"'+fn+'"' },{ tag:'input', name:'Content-Type', value:'text/tab-separated-values' }] }); form.submit(); document.body.removeChild(form); }
呼出しサンプル1
こちらではパラメータなしでdownloadメソッドを呼び出した例、storeの内容がそのままダウンロードされる
呼出しサンプル2
こちらはパラメータとして、ダウンロードファイル名や、列やフォーマットの指定を行ってダウンロードする例
使用に当たっては「ExtJSのGridやChartにデータダウンロードの機能を追加する」で使用したdownload.phpが必要となります。