Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
themeEclipse
languagephp
titleDataSource.php
<?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
themeEclipse
languagephp
titleDSRequest.php
<?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
languagephp
titleDSResponse.php
<?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
themeEclipse
languagephp
titleDSResponse
linenumberstrue
<?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
themeEclipse
languagephp
titleRPCManager.php
firstline21
linenumberstrue
/// <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
languagephp
titleDSResponse.php
firstline15
/// <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:

...