...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<?php class DataSource { private $data_source; function __construct($dataSourceID) { $this->data_source = $this->getDataSource($dataSourceID); } /// <summary> /// Load a DataSource specified by it's ID /// </summary> /// <param name="datasourceId">the ID of the DataSource to be loaded</param> /// <returns>the DataSource object corresponding to the DataSource with the specified ID or null if not found</returns> public function getDataSource($dataSourceId) { // get the file content from the js file of the ds directory $ds_contents = file_get_contents("ds/".$dataSourceId.".js",true); // replace string to parse JSON format $data_source = str_replace("isc.RestDataSource.create(", "", $ds_contents); $data_source = str_replace(");", "", $data_source); // this pattern make key: = "value" to "key" = "value" (ID: "supplyItem" => "ID": "supplyItem",) $pattern = '/[^ ]+:/'; $result = preg_replace_callback($pattern,array($this,'preg_pattern'),$data_source); // remove new line and tab etc. $result = preg_replace('/\r|\n|\t/', '', $result); // make json format $json = $result; return json_decode($json, true); } // pattern regular private function preg_pattern($match) { return '"'.substr($match[0],0,strlen($match[0])-1).'":'; } /// <summary> /// Get a field's data by it's name /// </summary> /// <param name="name">The name of the field</param> /// <returns>A Dictionary with the attributes of the field, or null if field was not found</returns> private function getField($name) { $ds = $this->data_source; $fields = $ds['fields']; foreach($fields as $field) { if ($field['name'] == $name) return $field; } return null; } |
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<?php require 'DataSource.php'; class DSRequest { var $dataSource;public function execute() { var $operationType; $ds = var $startRow; var $endRow; new DataSource($this->dataSource); if(empty($ds)) { return null; } return $ds->execute($this); } var $textMatchStyle; var $componentId; var $data; var $sortBy; var $oldValues; function __construct($params) { // json to array $request = json_decode($params, TRUE); // extract the $request array extract($request); // set componentId if(isset($componentId)) $this->componentId = $componentId; // set dataSource if(isset($dataSource)) $this->dataSource = $dataSource; // set startRow if(isset($startRow)) $this->startRow = $startRow; // set sortBy if(isset($sortBy)) $this->sortBy = $sortBy; // set endRow if(isset($endRow)) $this->endRow = $endRow; // set oldValues if(isset($oldValues)) $this->oldValues = $oldValues; // set textMatchStyle if(isset($textMatchStyle)) $this->textMatchStyle = $textMatchStyle; // set data if(isset($data)) $this->data = $data; // set operationType if(isset($operationType)) $this->operationType = $operationType; } public function setData($data) { $this->data = $data; } public function getDataKeys() { $data = $this->data; $keys = array_keys($data); return $keys; } public function execute() { $ds = new DataSource($this->dataSource); if(empty($ds)) { return null; } return $ds->execute($this); } } |
A Couple of noteworthy comments regarding the newly refactored code:
...
Refactoring DSResponse
In the DSResponse object, notice that it contains an object wrapped inside another just to mimic the structure of the JSON required by the front-end, with all the properties forwarded to the internal object.
Code Block | ||||
---|---|---|---|---|
| ||||
<?php
require 'bean.php';
class DSResponse extends Bean
{
// variables
/* Read/Write property*/
var $data;
/* Read/Write property*/
var $startRow;
/* Read/Write property*/
var $endRow;
/* Read/Write property*/
var $totalRows;
/* Read/Write property*/
var $status;
public function setData($value) {
$this->data = empty($value) ? null : (Array)$value;
return $this;
}
public function getData( )
{
return $this->data;
}
public function setStartRow($value) {
$this->startRow = (int)$value;
return $this;
}
public function getStartRow( )
{
return $this->startRow;
}
public function setEndRow($value) {
$this->endRow = (int)$value;
return $this;
}
public function getEndRow( )
{
return $this->endRow;
}
public function setTotalRows($value) {
$this->totalRows = (int)$value;
return $this;
}
public function getTotalRows( )
{
return $this->totalRows;
}
public function setStatus($value) {
$this->status = (int)$value;
return $this;
}
public function getStatus( )
{
return $this->status;
}
} |
The RPCManager
Now implement the RPCManager class. This class needs to include the DSRequest and DSResponse classes to process the request and response.
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<?php
require 'DSResponse.php';
require 'DSRequest.php';
class RPCManager
{
var $_request;
var $_response;
function __construct($request)
{
$this->_request = $request;
} |
When the user calls for any method relative to the CRUD such as fetch, add, update etc, the method called processRequest() will be executed with the request parameters.
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
/// <summary>
/// Process the request for which this RPCManager was created for
/// </summary>
/// <returns></returns>
public function processRequest()
{
// retrieve the requests with data
$request = new DSRequest($this->_request);
// set the response variable
$response = $request->execute();
// safeguard, if was null, create an empty response with failed status
if (empty($response))
{
$response = new DSResponse();
$response->setStatus(-1);
}
$this->_response = $response;
return $this->buildResult();
} |
This method makes use of various helper methods. One for parsing a DSRequest object from the payload and one for building the response to be sent to the front-end. As discussed earlier in the article, this is being created as an anonymous object to be serialized to JSON (an object which mimics the layout of the required JSON). The object is created with the appropriate values, retrieved from the DSResponse object which the DSRequest method returned:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
/// <summary>
/// Transforms a object object into a JsonNetResult. Will setup the serializer with the
/// appropriate converters, attributes,etc.
/// </summary>
/// <param name="dsresponse">the object object to be transformed to JsonNetResult</param>
/// <returns>the created JsonNetResult object</returns>
private function buildResult()
{
$data = array();
$data['response'] = (Array)$this->_response;
echo json_encode($data);
} |
...
A Couple of noteworthy comments regarding the newly refactored code:
- A reference to the RPCManager executing this request will be stored in DSRequest .This has to be done because, while the request is being.executed, access will be required to various items such as the DataSource object, etc - These items will all be provided by the RPCManager class.
- The execute() method itself only loads the DataSource object then calls the DataSource's execute method for processing the request.
Processing the Request
With all the functionality delegated to the RPCManager, the code becomes extremely simple:
...