...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
isc.RestDataSource.create({ "ID": "supplyItemsuppyItem", "fields": [ { name: [ {"name":"itemID", "type": "sequence", "hidden": "true", "primaryKey": "true" }, { "name": "itemName", "type": "text", "title": "Item", "length": "128", "required": "true" }, { "name": "SKU", "type": "text", "title": "SKU", "length": "10", "required": "true" }, { "name": "description", "type": "text", "title": "Description", "length": "2000" }, { "name": "category", "type": "text", "title": "Category", "length": "128", "required": "true", foreignKey: "supplyCategory.categoryName" }, { "name": "units", "type": "enum", "title": "Units", "length": "5", "valueMap": ["Roll", "Ea", "Pkt", "Set", "Tube", "Pad", "Ream", "Tin", "Bag", "Ctn", "Box"] }, { "name": "unitCost", "type": "float", "title": "Unit Cost", "required": "true", "validators": [ { "type": "floatRange", "min": "0", "errorMessage": "Please enter a valid (positive) cost" }, { "type": "floatPrecision", "precision": "2", "errorMessage": "The maximum allowed precision is 2" } ] }, { "name": "inStock", "type": "boolean", "title": "In Stock" }, { "name": "nextShipment", "type": "date", "title": "Next Shipment"} } ], "dataFormat": "json", criteriaPolicy:"dropOnChangeoperationBindings",: [ operationBindings: [ { "operationType": "fetch", "dataProtocol": "postMessage", "dataURL": "fetch.php" }, { "operationType": "add", "dataProtocol": "postMessage", "dataURL": "add.php" }, { "operationType": "update", "dataProtocol": "postMessage", "dataURL": "update.php" }, { "operationType": "remove", "dataProtocol": "postMessage", "dataURL": "remove.php" } ] }); |
Notice that this definition is almost a JSON file, with a small addendum at the beginning and the end. If the 'isc.RestDataSource.create(' part from the beginning and ');' part from the end were removed, this would give a valid JSON object which will be deserialized as a JSON object.
...
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
public function execute($request) { switch($request->operationType) { case 'fetch': return $this->fetch($request); case 'add': return $this->add($request); case 'update': return $this->update($request); case 'remove': return $this->remove($request); } } private function add($request) { $ds = $this->data_source; $new_data = $request->data; //DSResponse $response = new DSResponse(); $response->setData($new_data); $response->setStatus(0); return $response; } private function update($request) { $old_data = $request->oldValues; $update_data = $request->data; $ds = $this->data_source; // update all fields which have changed. they are defined in the data property if ( count($request->getDataKeys()) != 0 ) { foreach($request->data as $key => $value) { $old_data[$key] = $value; } } // build the criteria //DSResponse $response = new DSResponse(); $response->setData($old_data); $response->setStatus(0); return $response; } private function remove($request) { $ds = $this->data_source; $new_data = $request->data; // get the table name from data source $tbl_name = $ds['ID']; $new_data = $request->data; $insert_values = array(); // make the query $columns = ''; $values = ''; foreach($new_data as $key => $value) { $columns .= $key.','; $values .= "?,"; array_push($insert_values, $value); } // remove the last comma $columns = substr($columns, 0, strlen($columns) - 1); $values = substr($values, 0, strlen($values) - 1); // result insert query $insert_query = 'INSERT INTO '.$tbl_name.' ('.$columns.') VALUES ('.$values.')'; // Run the insert query R::exec($insert_query, $insert_values); //DSResponse $response = new DSResponse(); $response->setData($new_data); $response->setStatus(0); return $response; } private function fetchupdate($request) { $old_data = $request->oldValues; // get the DataSource $update_data = $request->data; $ds = $this->data_source; $tbl_name = $ds['ID']; $query = "select * from $tbl_name s "; $query_count = "select count(*) from $tbl_name s"; // build up the query // update all fields which have changed. they are defined in the data property if ( count($request->getDataKeys()) != 0 ) { $query .= ' where '; $query_count .= ' where '; foreach( foreach($request->data as $key => $value) { $old_data[$key] = $value; } } // get the id by primary key $values = array(); // get the fieldtable name from data source $field$tbl_name = $this->getField($key); if(!empty($field))$ds['ID']; $set_value = ''; // make the update query foreach($old_data as $key => $value) { { $type$set_value .= $field['type']; "$key = ?,"; if( $type == "text" || $type == "link" || $type == "enum" || $type == "image" || $type == "ntext" ) { $query .= "s." . $key . " like " . " '%" . $value . "%' and " ;array_push($values, $value); } array_push($values, $old_data['itemID']); // remove the last comma $set_value = substr($set_value, 0, strlen($set_value) - 1); // result insert query $update_query = 'UPDATE '.$tbl_name.' SET '.$set_value.' WHERE itemID = ?'; R::exec($update_query, $values); // build the criteria //DSResponse $response = new DSResponse(); $response->setData($old_data); $response->setStatus(0); return $response; } private function remove($request) { $ds = $this->data_source; // get the table name from data source $tbl_name = $ds['ID']; $new_data = $request->data; // make the delete query $itemID = $new_data['itemID']; $delete_query = "DELETE FROM $tbl_name WHERE itemID = ?"; // Run the insert query R::exec($delete_query, array($itemID)); //DSResponse $response = new DSResponse(); $response->setData($new_data); $response->setStatus(0); return $response; } private function fetch($request) { // get the DataSource $ds = $this->data_source; $tbl_name = $ds['ID']; // check the advanced cretira $query_result = $this->buildStandardCriteria($request); $query = "select * from $tbl_name "; $query .= $query_result['query']; // sort by if( !empty($request->sortBy) ) { // set the orderBy $query .= " order by "; // we start to build a coma separated list of items. First item won't have coma // but every possible next will do $seperator = ""; foreach($request->sortBy as $index => $sort) { // if column name is with -, then ordering is descending, otherwise ascending if ( strpos($index, '-') === 0 ) { $query .= $seperator . $sort . " ASC"; } else { $query .= $seperator . substr($sort, 1) . " DESC"; } $separator = ','; } } //DSResponse $response = new DSResponse(); $products = R::getAll($query, $query_result['value']); // get the count $count = count($products); $response->setData($products); $response->setStartRow($request->startRow); $response->setEndRow($request->endRow); $response->setTotalRows($count); $response->setStatus(0); // sanity check, if no rows, return 0 if ($response->getEndRow() < 0 ) { $response->setEndRow(0); } return $response; } |
Note: move out the existing criteria building code into a separate method called buildStandardCriteria():
Code Block | ||
---|---|---|
| ||
private function buildStandardCriteria($request) { $result = array(); $query = ''; $values = array(); if ( count($request->getDataKeys()) != 0 ) { $query .= ' where '; foreach($request->data as $key => $value) { // get the field $field = $this->getField($key); if(!empty($field)) } else { "s." . $key . "=" . " '" . $value . "' and " ; { } }$type = $field['type']; $query_count .if( $type == "s.text" . $key . " like " . "'%" . $value . "%' and " ; } // remove 'and' of the query $query = substr($query, 0, strlen($query)- 4); $query_count = substr($query_count, 0, strlen($query_count)- 4); } // sort by if( !empty($request->sortBy) ) { // set the orderBy $query .= " order by "; // we start to build a coma separated list of items. First item won't have coma // but every possible next will do $seperator = ""; foreach($request->sortBy as $index => $sort) { // if column name is with -, then ordering is descending, otherwise ascending if ( strpos($index, '-') === 0 ) { $query .= $seperator . $sort . " ASC"; || $type == "link" || $type == "enum" || $type == "image" || $type == "ntext" ) { //$query .= "s." . $key . " like " . " '%" . $value . "%' and " ; $query .= $key . " like ? and " ; array_push($values, "%".$value."%"); } else { $query"s." .= $seperator$key . substr($sort, 1) . " = ? and " DESC"; } $separator = ','; } } // convert the payload to our DRequest object array_push($values, $value); } // get the count $products_count = R::getAll($query_count); $count = $products_count[0]['count(*)']; //DSResponse $response = new DSResponse();} } // remove 'and' of the query $products = R::getAll($query); $response->setData($products); $response->setStartRow($request->startRow); $response->setEndRow($request->endRow); $response->setTotalRows($count); $response->setStatus(0 $query = substr($query, 0, strrpos($query, 'and')); // sanity check, if no rows, return 0 if ($response->getEndRow() < 0 ) { $response->setEndRow(0); }} $result['query'] = $query; $result['value'] = $values; return $response$result; } |
Note |
---|
In this article, the RedBean library was used to get the data from the database on the line 185 and the line 191. |
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
isc.ListGrid.create({ "ID": "supplyItemGridsupplyItem", "width": 700, "height": 224, "alternateRecordStyles": true, "dataSource": supplyItem, "showFilterEditor": true, "autoFetchData":true, "dataPageSize":20, "canEdit":true, "canRemoveRecords":true }); |
Next, There needs to be a method for adding new records. Add a button which, on click, will trigger a new record being available for editing in the grid. The source for this is:
Code Block | ||||
---|---|---|---|---|
| ||||
isc.IButton.create({ top: 250, title: "Edit New", click: "supplyItemGridsupplyItem.startEditingNew()" }); |
At this point, all four operations are implemented (add, update, remove, fetch). However please note these are just plain samples,and do not contain anything other than basic type error validation.
...