Sample SJP

<?php
/*
The SJP
http://sjp.impartmedia.com/
// ============================================================================================
This file contains two classes that are used to reference the SJP. The SJP class, and a Cache class.
You don't need to manually use the Cache class, it it used by the SJP class.
We highly recommend this be run on a server with Memcache, as it is a very efficient cache method. 
Failing that, the Cache class implements a simple filesystem cache to keep the SJP calls to a minimum
as they can take some time, and would cause your page to load more slowly.
To use this class, for example to build an operator page:
// Create an instance of the SJP class with the visitor centre ID required
$mySJP = new SJP(3);
// Set the state for the SJP call, in this case, set the operator ID
$mySJP->set_state(array(
'operators'=>'53667'
));
// Fetch the accommodation operator details data
$mySJP->fetch('accommodation','operator_details');
// To use the returned data, check your instance's 'data' member
// In this case, we refence the first entry in the data array
$operator = $mySJP->data[0];
// Try var_dump or print_r on this data object - it should contain all the members and data you
// need to build a detail operator page. For example:
<h1><?=strip_tags($operator->TradingName);?></h1>
<p class="description">
<?=strip_tags($operator->Description);?>
</p>
<div class="map">
<!-- 
The map method accepts width, height and zoom 
You need to have a SJP class instantiated and data fetched
-->
<img src="/<?=$mySJP->mapURL(300,300,10);?>" alt="Map" />
</div>
<div class="images">
<?php
foreach($operator->Pictures as $pic) {
echo '<img src="'.$pic.'" />'."\n";
}
?>
</div>
// You'll note that we've included strip_tags in each text output call. We generally recommend this, 
// as you may receive HTML tags you don't want in the data output.
// SJP Class usage notes ======================================================================
1. Create an instance of the class
2. Use the set_state method to set any parameters you want for the SJP call, refer to the SJP for 
   specific details, but some common ones are:
 a. date (str - date formatted as YYYY-MM-DD)
 b. period (int)
 c. adults (int)
 d. children (int)
 e. infants (int)
 f. operators (str - comma separated list of operator IDs)
3. Run the fetch method of the instance to fetch data for the product type and data you want
   from cache, or the SJP.
4. Use the output data to create your html page
// SJP Class fetch methods ====================================================================
The SJP class fetch method accepts to parameters:
1. the product type - 'accommodation', or 'tours'
2. the specific message to call
For accommodation, there are three messages included:
1. 'operator_details'
2. 'room_details'
3. 'rates_grid'
for tours, there are two messages included:
1. 'tours_details'
2. 'rates_grid'
*/
// Config =====================================================================================
// SJP Location
define('SJP_URL','http://sjp.impartmedia.com');
// Cache prefix, to ensure no cache clashes - keep unique to each implementation/website
define('CACHE_PREFIX','sjp-handle-class');
// Location to use in the filesystem if memcache is unavailable
define('FILE_SYSTEM_CACHE','/tmp');
// Hostname of the memcache server, if available
define('MEMCACHE_HOST','localhost');
// Memcache port on memcache server 
define('MEMCACHE_PORT',11211);
// Default cache expiry for static-ish data (should be large - 4 hours-ish) [seconds]
define('LONG_CACHE',4*60*60);
// Default cache expiry for rates data (shouldn't be more than a few minutes) [seconds]
define('SHORT_CACHE',60);
// The primary SJP class ======================================================================
class SJP {
// Members
private $sjp_calls = array(
'accommodation'=>array(
'operator_details' => array(
'url'=>'/be/getOperatorsDetailsShort',
'exp'=>LONG_CACHE
),
'room_details' => array(
'url'=>'/be/getAccomRoomsDetails',
'exp'=>LONG_CACHE
),
'rates_grid' => array(
'url'=>'/be/getAccomRatesGrid',
'exp'=>SHORT_CACHE
)
),
'tours'=>array(
'tours_details' => array(
'url'=>'/be/getToursOperatorTourDetails',
'exp'=>LONG_CACHE
),
'rates_grid' => array(
'url'=>'/be/getToursRatesGrid',
'exp'=>SHORT_CACHE
)
)
);
// Pointer to the cache handler
private $cache_handle;
// Internal state storage
private $state = array();
private $vcID;
public  $data;
// Constructor
public function __construct($vcID) {
// Set cache handler
$this->cache_handle = new Cache();
// Set the vcID
$this->vcID = $vcID;
}
// Primary call - fetches from cache or SJP
public function fetch($type,$method) {
$q_str = $this->build_string();
$cache_id = $type.$method.$q_str;
// Attempt to get from cache
$data = $this->cache_handle->get($cache_id);
if($data == null || $data == false || $data == '') {
$sjpURL = SJP_URL . $this->sjp_calls[$type][$method]['url'].$q_str;
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $sjpURL);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($curl_handle);
curl_close($curl_handle);
$this->cache_handle->set($cache_id, $data, $this->sjp_calls[$type][$method]['exp']);
}
$this->data = json_decode($data);
}
// Build a URL for a google static map
public function mapURL($w=200,$h=200,$z=12) {
if(count($this->data) < 1) {
return '';
}
$op = $this->data[0];
// If lat/lng is zero
if($op->Latitude == 0 && $op->Longitude == 0) {
return '';
}
return '//maps.googleapis.com/maps/api/staticmap?sensor=false&center='.$op->Latitude.','.$op->Longitude.'&size='.$w.'x'.$h.'&zoom='.$z;
}
// Set state - for use to set params
public function set_state($arr) {
foreach($arr as $key=>$val) {
$this->state[$key] = $val;
}
}
// Reset state to empty array
public function clear_state() {
$this->state = array();
}
// Build query string from state
private function build_string() {
// Build query string
$q_str = '?q=' . $this->vcID;
foreach($this->state as $key=>$val) {
$q_str .= '&'.$key.'='.$val;
}
return $q_str;
}
}
// Cache class used by SJP ====================================================================
class Cache {
// Members
private $is_memcache = false;
private $handle;
// Constructor
public function __construct() {
// Check if memcache exists
if(class_exists('Memcache')) {
$this->handle = new Memcache();
try {
$this->handle->connect(MEMCACHE_HOST,MEMCACHE_PORT);
$this->is_memcache = true;
} catch(Exception $e) {
$this->setup_fs_cache();
}
// Create the fs cache structure
} else {
$this->setup_fs_cache();
}
}
// Get from cache method
public function get($id) {
$ref = $this->makeID($id);
if($this->is_memcache) {
return $this->handle->get($ref);
} else {
$filepath = $this->fs_path.'/'.$ref;
if(file_exists($filepath)) {
$expires = file_get_contents($filepath.'.expires');
if(time() < $expires) {
return file_get_contents($filepath);
} else {
unlink($filepath);
unlink($filepath.'.expires');
return null;
}
} else {
return null;
}
}
}
// Set to cache method
public function set($id,$data,$expiry=LONG_CACHE) {
$ref = $this->makeID($id);
if($this->is_memcache) {
$this->handle->set($ref,$data,$expiry);
} else {
file_put_contents($this->fs_path.'/'.$ref, $data, LOCK_EX);
file_put_contents($this->fs_path.'/'.$ref.'.expires', time() + $expiry, LOCK_EX);
}
}
// Make ID
private function makeID($string) {
return md5(CACHE_PREFIX.$string);
}
// Setup the filesystem cache
private function setup_fs_cache() {
// Check directory is there
$path = FILE_SYSTEM_CACHE.'/'.CACHE_PREFIX;
$this->fs_path = $path;
$error = 'Couldn\'t setup FS cache - disabled';
// Try to create the dir
if(!file_exists($path) || !is_dir($path)) {
try {
mkdir($path,0775,true);
} catch(Exception $e) {
echo $error;
exit();
}
}
// Can we save things?
if(!is_dir($path) && !is_writable($path)) {
echo $error;
exit();
}
}
}
?>

Featured Destinations

Margaret River Busselton

More

Parks Victoria

More

Tourism Whitsundays

More

Tourism Top End - Darwin

More

View Retreats

More

Bay Of Islands

More

Sydney Visitor Centre

More

Barossa Visitor Centre

More

Visit Canberra

Read more...

Destination Launceston

More

Get in touch

To discuss further information regarding the use of beGadgets, please get in touch via the details below.

 

Call Bookeasy
Call
 
(07) 5668 2530
Email Bookeasy
Email
 
support@bookeasy.com
Visit Bookeasy
Visit
 
Suite 30303,
 
9 Lawson St,
Southport, QLD 4215

Our Technologies.

Gold Coast, AU

  • Meet us.
    Southport Central 
    Tower 3, Level 3, Suite 30304
    9 Lawson Street
    Southport, QLD 4215

    +61 7 5668 2530
  • Write us.
    support@bookeasy.comThis email address is being protected from spambots. You need JavaScript enabled to view it.
  • Follow us.
    Twitter logo white   FB-f-Logo  white 29    In-White-28px-R

Recent Tweets