|
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
Note: This is an unedited contribution. If this article is inappropriate,
needs attention or copies someone else's work without reference then please
Report This Article
IntroductionExtJS is really cool library generating fancy looking GUI apps in Javascript. I started using ExtJS for a bunch of database frontends and found that I needed to have a DataGrid that would change its contents based on and AJAX call that filtered data based on some search parameters. Notionally this was easy enough and it appeared there may be many ways to make this happen. As it turns out there is one right way and many - seemingly plausible - options that don't work. Using the codeThe Javascript/ExtJS portion looks like this: Ext.onReady(function(){
Ext.QuickTips.init();
var proxy = new Ext.data.HttpProxy({
url: 'demo.data.php',
method: 'post'
});
var dstore = new Ext.data.JsonStore({
url: 'demo.data.php',
proxy: proxy,
fields: ['id', 'data'],
totalProperty: 'totalCount',
root: 'matches'
});
dstore.load();
var grid = new Ext.grid.GridPanel({
store: dstore,
columns: [
{id:'id', header: "Id", width: 60, sortable: true, dataIndex: 'id'},
{id: 'data', header: "Data", width: 200, sortable: true, dataIndex: 'data'}
],
stripeRows: true,
autoExpandColumn: 'data',
height:350,
width: 500,
title:'Demo Data'
});
var search = new Ext.FormPanel({
labelWidth: 150,
frame:true,
title: 'Search Demo Data',
bodyStyle:'padding:5px 5px 0',
width: 500,
defaults: {width: 230},
defaultType: 'textfield',
items:
[{
fieldLabel: 'Search regular expression',
name: 'pattern',
id: 'pattern'
}],
buttons: [{
text: 'Search',
handler: function() {
dstore.load({
params: {
pattern: document.getElementById('pattern').value
}});
}
}]
});
search.render('search_form');
grid.render('search_results');
});
The backend datasource (which happens to be from PHP) looks like this: <?php $items = Array(Array('id'=>1, 'data' => 'the first item'), Array('id'=>2, 'data' => 'the second item'), Array('id'=>3, 'data' => 'one fish'), Array('id'=>4, 'data' => 'two fish'), Array('id'=>5, 'data' => 'red fish'), Array('id'=>6, 'data' => 'blue fish') ); $matches = Array(); if(!isset($_REQUEST['pattern']) || $_REQUEST['pattern'] == '') { $matches = $items; } else { foreach ($items as $item) { if (eregi($_REQUEST['pattern'], $item['data'])) { $matches[] = $item; } } } echo json_encode(Array('totalCount' => count($matches), 'matches' => $matches ) ); ?> The HTML file (that really is just the standard stuff) is included in the ZIP file. Points of InterestMySQL/PHP backend data sourceFor those looking to load database data (probably MySQL for PHP folk) into and ExtJS JSONStore, the PHP file supplies most of what you need to know. Basically you want an array of data that you then encode with $data = Array(); $qry = mysql_query("SELECT id, description FROM ..."); while ($vals = mysql_fetch_array($qry)) { $data[] = Array('id' => $vals['id'], 'description' => $vals['description']; } echo json_encode($data); Paging control on DataGridIf you are using a paging control on the grid then you will want the parameters that are sent to the DataStore to persist between calls (ie for when they press the paging buttons to retrieve the next page of data). To do this you need to set the function search_submit() {
dstore.baseParams = {
number: document.getElementById('number').value,
title: document.getElementById('title').value,
keywords: document.getElementById('keywords').value,
typeid: document.getElementById('typeid').value,
allversions: (document.getElementById('allversions').checked) ? 1 : 0,
};
dstore.load({
params: {
start: 0,
limit: 25
}
});
}
HIstory24-Jul-2008 - PJC - First posted
|
|||||||||||||||||||||||||||||||||||||||||||||||