<?php
$date_format = 'Y-j-m';
/**
* Returns an array containing a random data type and the editor
* associated with that type, used by the generateData function.
*/
function generateType($index) {
global $date_format;
$rand = $index === 0 ? 1 : rand(0, 4);
switch ($rand) {
case 0:
return array('data' => 'string', 'editor' => array(
'xtype' => 'textfield',
'allowBlank' => false
));
case 1:
return array('data' => 'int', 'editor' => array(
'xtype' => 'numberfield',
'minValue' => 1,
'maxValue' => 200
));
case 2:
return array('data' => 'date', 'editor' => array(
'xtype' => 'datefield',
'format' => $date_format
));
case 3:
return array('data' => 'float', 'editor' => array(
'xtype' => 'numberfield',
'minValue' => 400,
'maxValue' => 800
));
case 4:
return array('data' => 'bool', 'editor' => array(
'xtype' => 'checkbox'
));
}
}
/**
* Returns a hard-coded data value matching the type passed in.
*/
function getDataValue($type) {
global $date_format;
switch ($type['data']) {
case 'string':
return 'data';
case 'int':
return 123;
case 'date':
return date($date_format);
case 'float':
return 456.78;
case 'bool':
return true;
}
return $type;
}
/**
* Generates all of the test data and field/column definitions that will
* make up the data and metadata for this request.
*/
function generateData() {
global $date_format;
$row_count = rand(10, 30);
$col_count = rand(5, 10);
$types = array();
$data['data'] = array();
$fields = array();
$columns = array();
$defineFields = true;
for ($i=0; $i<$row_count; $i++) {
for ($j=0; $j<$col_count; $j++) {
// first pass through columns only, define fields and columns
if ($defineFields) {
// generate a random data type for the field/column
$type = generateType($j);
array_push($types, $type);
// =====================================================================
// define the default placeholder field definition. this fields
// config is supported by the metachange handling in Ext by default
// to reconfigure the data store's field definitions.
$field = array(
'name' => 'field-'.($j+1),
'type' => $type['data']
);
// add any type-specific field attributes
if ($type['data'] === 'date') {
$field['dateFormat'] = $date_format;
}
// add the field to the fields list
array_push($fields, $field);
// =====================================================================
// define the default placeholder column definition to match the field.
// note that this columns block only applies to grids. in the past the
// fields config was reused both by the store and also by grids, but since
// it is usually preferable to add column-specific metadata that the store
// doesn't care about, it's usually better to split the two definitions.
$col = array(
'dataIndex' => 'field-'.($j+1)
);
// add in column-specific attributes
if ($j === 0) {
// special config for the id column, fixed width and non-editable
$col['text'] = 'ID';
$col['width'] = 40;
}
else {
$col['text'] = 'Field '.($j+1).' ('.$type['data'].')';
$col['editor'] = $type['editor'];
$col['flex'] = 1;
}
// add in type-specific column attributes
switch ($type['data']) {
case 'date':
$col['xtype'] = 'datecolumn';
$col['format'] = $date_format;
break;
case 'float':
$col['xtype'] = 'numbercolumn';
$col['format'] = '$0.00';
break;
case 'bool':
//$col['xtype'] = 'checkcolumn';
break;
}
// finally, add the column to the columns list
array_push($columns, $col);
}
// every row/col pass, load up some data
$row['field-'.($j+1)] = $j == 0 ? ($i+1) : getDataValue($types[$j]);
}
// flip this flag after the first column pass since the fields are defined
$defineFields = false;
// add the row of generated data to the top-level data object
// that will be returned in the response
array_push($data['data'], $row);
}
// assemble the metadata
$meta = array();
$meta['fields'] = $fields;
$meta['columns'] = $columns;
$meta['root'] = 'data';
$meta['idProperty'] = 'field-1';
$meta['messageProperty'] = 'msg';
// assemble the top-level data object being returned.
// the data is already in $data['data'] at this point.
$data['metaData'] = $meta;
$data['total'] = $row_count;
$data['msg'] = 'Success!';
return $data;
}
echo json_encode(generateData());
?>