<?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()); ?>