Продолжаем писать клиент для просмотра dbf файлов на ExtJs
Работающий пример здесь: http://jobtools.ru/js/dbfshow/. Хочу предупредить, что загружать надо только dbf файл, и не слишком большого размера, так как индикатора загрузки нет и не видно что происходит и когда закончится.
Создаем главное окно нашей программы:
Ext.require('Ext.Window', function() {
var win = new Ext.Window({
title : "DBFShow.On " + VERSION,
width : 700,
height : 410,
layout : 'fit',
tbar : [{// тулбар c меню
text : 'Файл',
// кнопка с выпадащим меню
menu : [// само меню
{
text : 'Открыть',
handler : function() {
Ext.require('Ext.Window', function() {
var openFileForm = new Ext.Window({
title : "Открыть файл",
width : 510,
height : 110,
items : [openFile]
})
openFileForm.show();
})
}
}, {
text : 'Закрыть'
}]
}, {
text : 'О программе...',
handler : function() {
Ext.require('Ext.Window', function() {
var about = new Ext.Window({
title : "О программе",
width : 510,
height : 310
})
about.show();
})
}
} // простая кнопка
],
items : [grid]
})
win.show();
}); Что мы здесь делаем:
var win = new Ext.Window - создаём главное окно, указали заголовок окна title, размеры width, height.
Создаём меню:
tbar : [{// тулбар c меню
text : 'Файл',
// кнопка с выпадащим меню
menu : [// само меню
{
text : 'Открыть',
handler : function() { .... в handler прописываем обработку события нажатия на кнопку меню, в нашем случае при нажатии на кнопку «Открыть» создаём новое окно Ext.Window с предложением пользователю выбрать файл для загрузки с единственным элементом openFile:
var openFile = Ext.create('Ext.form.Panel', {
width: 510,
height: 70,
items: [{
xtype: 'filefield',
id: 'form-file',
emptyText: 'Выберите файл',
fieldLabel: 'DBF',
name: 'dbf-path',
width: 350,
buttonText: '',
buttonConfig: {
iconCls: 'upload-icon'
}
}],
buttons: [{
text: 'Загрузить',
handler: function() {
var form = this.up('form').getForm();
if (form.isValid()) {
form.submit({
url: 'file-upload.php',
//waitMsg : 'Загружаем Ваш файл...',
success: function(fp, o) {
// msg('Ок', 'Файл "' + o.result.file + '" загружен на сервер');
filename_ = o.result.file;
process(filename_);
openFile.ownerCt.close();
},
failure: function(fp, o) {
openFile.ownerCt.close();
}
});
}
}
}, {
text: 'Reset',
handler: function() {
this.up('form').getForm().reset();
}
}]
});
Форма с двумя кнопками «Загрузить» и «Отмена». При нажатии кнопки Загрузить проверяется форма на заполненность и пересылаем файл на сервер. При корректной загрузке success передаем управление функции process():
function process() {
if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0) {
xmlHttp.open("GET", "dbfshow.php?func=getModel&filename=" + filename_);
xmlHttp.onreadystatechange = handleServerResponse;
xmlHttp.send(null);
} else setTimeout('process()', 1000); В этой функции обращаемся к dbfshow.php на сервере и передаем ей как параметр имя функции func = getModel и имя открываемого файла filename_
Если dbfshow.php получает func = getModel, то он считывает формат загруженной DBF-ки (заголовок, описание колонок) и передает ответ клиенту с указанием func = DEFINITION, дабы клиент знал что пришло описание колонок, необходимое для динамического заполнения Model и Store :
<?php
include 'dbf.php';
$db = new dbf();
$filename = $_GET["filename"];
if ($_GET['func']=='getModel')
{
$db->open("Upload/".$filename);
$db->readHeader();
$db->readColumns();
$text ="[";
$columns ="[";
for ($i=0; $i<=$db->getCountColumns()-1;$i++)
{
$text.="{name:'";
$text.=iconv("windows-1251", "UTF-8",$db->getColumnName($i));
$text.="', type:'";
$text.="string'";
$text.="},";
$columns.="{ text:'";
$columns.=iconv("windows-1251", "UTF-8",$db->getColumnName($i));
$columns.="', dataIndex: '";
$columns.=iconv("windows-1251", "UTF-8",$db->getColumnName($i));
$columns.="'},";
}
$text = substr($text, 0, strlen($text)-1);
$text.="]";
$columns = substr($columns, 0, strlen($columns)-1);
$columns.="]";
$a = array();
array_push($a, array('MODEL'=>$text));
array_push($a, array('COLUMNS' =>$columns));
$db->close();
echo json_encode(array(
'FUNC'=> 'DEFINITION',$a));
}
?> Вот как выглядит ответ сервера:

При получении ответа клиентом, запускается функция:
function handleServerResponse() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
response = xmlHttp.responseText;
//response.setContentType('text/html')
var data = JSON.parse(response);
if (data.FUNC == 'DEFINITION') {
columns = eval('(' + data[0][1].COLUMNS + ')');
var myModel = Ext.ModelManager.getModel('Model');
fields = myModel.prototype.fields.getRange();
Ext.each(columns, function(permission) {
fields.push({
name: permission.text,
type: 'string'
});
});
myModel.setFields(fields);
store.removeAll();
grid.reconfigure(store, columns);
store.load({
params: {
filename: filename_
}
});
}
} else {
alert("При обращении к серверу возникли проблемы: " + xmlHttp.statusText);
}
}
Если в пришедших данных data Func = DEFINITION, то пришло описание полей.
Создаём новую переменную копию нашей Model
var myModel = Ext.ModelManager.getModel('Model'); Заполняем массив описания колонок fileds:
fields = UserType.prototype.fields.getRange();
Ext.each(columns, function(permission) {
fields.push({
name: permission.text,
type: 'string'
});
}); Конфигурируем наш store и grid:
myModel.setFields(fields); store.removeAll(); grid.reconfigure(store, columns);
И заставляем наш store загрузить данные, через указанный нами ранее proxy (в настройках store):
store.load({
params: {
filename: filename_
}
}) Напомню что proxy в store настроен на получение данных с вызовом get_data.php:
proxy: {
type: 'ajax',
url: 'get_data.php',
extraParams: {
filename: filename_
}, Содержимое файла get_data.php, который отдает данные из dbf нашему гриду:
<?php
include 'dbf.php';
$a = array();
$rows = array();
$row = array();
$limit = $_GET["limit"];
$start = $_GET["start"];
$filename = $_GET["filename"];
$db = new dbf();
$db -> open("Upload/" . $filename);
$db -> readHeader();
$db -> readColumns();
$countRows = $db -> GetCountRows();
$totalRows = $start + $limit;
if ($totalRows > $countRows)
$totalRows = $countRows;
for ($z = $start; $z <= $totalRows; $z++) {
for ($i = 0; $i <= $db -> getCountColumns() - 1; $i++) {
$row[iconv("windows-1251", "UTF-8", $db -> getColumnName($i))] = iconv("windows-1251", "UTF-8", $db -> getValue($z, $i));
}
array_push($rows, $row);
$row = array();
}
$db -> close();
echo json_encode(array('sucess' => true, 'total' => $countRows, 'records' => $rows));
?> Так выглядят данные отправляемые сервером для грида:

Ну вот вроде и всё ).
Надо опять вернуться и расширить функционал: отображение прогресса загрузки, использование правильной кодировки файла.
Исходник: [Загрузка не найдена]

спасибо огромное