2012-04-28 17:28:18 +00:00
< ? php
2012-04-30 19:50:35 +00:00
2012-04-28 17:28:18 +00:00
/**
* CLASS : Share Your Cart Base
* AUTHOR : Barandi Solutions
* COUNTRY : Romania
* EMAIL : catalin . paun @ barandisolutions . ro
* VERSION : 1.0
* DESCRIPTION : This class is used as a base class for every PHP plugin we create .
* * Copyright ( C ) 2012 Barandi Solutions
*/
2012-10-15 10:57:58 +00:00
if ( ! defined ( 'ABSPATH' ) ) exit ; // Exit if accessed directly
2012-04-28 17:28:18 +00:00
require_once ( dirname ( __FILE__ ) . " /class.shareyourcart-api.php " );
if ( ! class_exists ( 'ShareYourCartBase' , false )){
abstract class ShareYourCartBase extends ShareYourCartAPI {
//this array is used to hold function calls between different instances of this class
private static $_SINGLE_FUNCTIONS_CALLS = array ();
2012-04-30 19:50:35 +00:00
private static $_SDK_VERSION = '1.6' ; //the first one is the SDK main version, while the second one is it's revision
2012-04-28 17:28:18 +00:00
protected static $_DB_VERSION = '1.1' ;
/**
* Constructor
* @ param null
*/
function __construct () {
//set exception handler
if ( set_exception_handler ( array ( & $this , 'UncaughtExceptionHandler' )) !== null )
restore_exception_handler (); //if there allready was an exception handler, revert back to it
parent :: __construct ();
//now, add the api version to the button_js, in order to force users to download the latest
//JS file
$this -> SHAREYOURCART_BUTTON_JS .= '?v=' . $this -> getConfigValue ( 'api_version' );
$this -> SHAREYOURCART_BUTTON_URL .= '?client_id=' . $this -> getClientId ();
//set the language
SyC :: setLanguage ( $this -> getConfigValue ( 'lang' ));
}
/**
* Execute NonQuery SQL
* @ param string action
* @ param string extra
* @ return boolean
*/
protected abstract function executeNonQuery ( $sql );
/**
*
* Get the row returned from the SQL
*
* @ return an associative array containing the data of the row OR NULL
* if there is none
*/
protected abstract function getRow ( $sql );
/**
* Abstract getTableName
* @ param string key
*
*/
protected abstract function getTableName ( $key );
/**
* Abstract setConfigValue
* @ param string option
* @ param string value
* @ return boolean
*/
protected abstract function setConfigValue ( $field , $value );
/**
* Abstract setConfigValue
* @ param string option
* @ param string value
* @ return string
*/
protected abstract function getConfigValue ( $field );
/**
* Description : This returns an array with the details of the product
* displayed on this page . If it is not a product , it
* will return FALSE
* @ remarks this will be mostly used by LITE integrations , so no need to make it mandatory
* @ param null
* @ return boolean / array
*/
protected function getCurrentProductDetails (){
return FALSE ;
}
/**
*
* Return TRUE if this page describes a single product , otherwise FALSE
*
*/
protected abstract function isSingleProduct ();
/**
*
* Return the URL to be called when the button is pressed
*
*/
protected abstract function getButtonCallbackURL ();
/*
*
* Create url for the specified file . The file must be specified in relative path
* to the base of the plugin
*/
protected abstract function createUrl ( $file );
/**
*
* Called after the session has been reloaded
*
*/
protected abstract function loadSessionData ();
/**
*
* Returns the plugin ' s secret key . This should be overwritten only by the actual plugin
*
*/
protected abstract function getSecretKey ();
/**
*
* Insert a row in the table
* @ param string tableName
* @ param array data
*
*/
protected abstract function insertRow ( $tableName , $data );
/**
*
* Apply the coupon code
*
*/
protected abstract function applyCoupon ( $coupon_code );
/**
*
* Get the plugin version .
* @ return an integer
*
*/
protected abstract function getPluginVersion ();
/**
*
* Get the entire Version , including the SDK one
*
*/
public function getVersion ()
{
//make sure a developer enters only a number as a version
if ( ! is_int ( $minor_version = $this -> getPluginVersion ()))
throw new Exception ( SyC :: t ( 'sdk' , 'The Plugin Version must be an integer' ));
return self :: $_SDK_VERSION . '.' . $minor_version ;
}
/**
*
* Return TRUE if there is a newer version of the plugin
*
*/
protected function hasNewerVersion ()
{
return version_compare ( $this -> getVersion (), $this -> getConfigValue ( 'latest_version' ), '<' );
}
/**
*
* Check if this instance can load , or not !
* This is ment so that at ALL times , only the latest plugin version will work
*
*/
protected function canLoad ()
{
$v = version_compare ( $this -> getVersion (), $this -> getConfigValue ( 'plugin_current_version' ));
//first, check if this instance is the latest one, or not
if ( $v < 0 ) return false ;
//save the latest version, for later reference
if ( $v > 0 )
$this -> setConfigValue ( 'plugin_current_version' , $this -> getVersion ());
return true ;
}
/**
* install the plugin
* @ param null
* @ return boolean
*/
public function install ( & $message = null ) {
//this is a single call function
if ( ! $this -> isFirstCall ( __FUNCTION__ ))
return ;
//create the tokens table
$this -> createTable ( $this -> getTableName ( 'shareyourcart_tokens' ), array (
'id' => 'int(11)' ,
'token' => 'varchar(255)' ,
'session_id' => 'varchar(255)' ,
), 'id' );
//create the coupon log table
$this -> createTable ( $this -> getTableName ( 'shareyourcart_coupons' ), array (
'id' => 'int(11)' ,
'token' => 'varchar(255)' ,
'coupon_id' => 'varchar(255)' ,
), 'id' );
//save the DB version, for later use
$this -> setConfigValue ( 'db_version' , self :: $_DB_VERSION );
//if we have credentials in the DB, try to activate the plugin
//with them
$activated = false ;
$appKey = $this -> getAppKey ();
$clientId = $this -> getClientId ();
if ( ! empty ( $appKey ) && ! empty ( $clientId )){
$activated = $this -> activate ( $message );
}
return true ;
}
/**
* uninstall the plugin
* @ param null
* @ return boolean
*/
public function uninstall ( & $message = null ) {
//this is a single call function
if ( ! $this -> isFirstCall ( __FUNCTION__ ))
return ;
//first, make sure we deactivate the plugin
$this -> deactivate ( $message );
//remove the tables
$this -> dropTable ( $this -> getTableName ( 'shareyourcart_tokens' ));
$this -> dropTable ( $this -> getTableName ( 'shareyourcart_coupons' ));
//remove the db version
$this -> setConfigValue ( 'db_version' , null );
return true ;
}
/**
* activate the plugin
* @ param null
* @ return boolean
*/
public function activate ( & $message = null ) {
//this is a single call function
if ( ! $this -> isFirstCall ( __FUNCTION__ ))
return ;
//active the API
if ( $this -> setAccountStatus ( $this -> getSecretKey (), $this -> getClientID (), $this -> getAppKey (), true , $message ) === TRUE ) {
$this -> setConfigValue ( " account_status " , " active " );
return true ;
} else {
$this -> setConfigValue ( " account_status " , " inactive " );
return false ;
}
}
/**
* deactivate the plugin
* @ param null
* @ return boolean
*/
public function deactivate ( & $message = null ) {
//send the notification to the API
$this -> setAccountStatus ( $this -> getSecretKey (), $this -> getClientID (), $this -> getAppKey (), false , $message );
//no matter what the API says, disable this plugin
$this -> setConfigValue ( " account_status " , " inactive " );
return true ;
}
/**
* getAppKey
* @ param null
* @ return appKey
*/
public function getAppKey () {
return $this -> getConfigValue ( 'appKey' );
}
/**
* getClientID
* @ param null
* @ return clientID
*/
public function getClientId () {
return $this -> getConfigValue ( 'clientId' );
}
/**
* Check if the plugin is active , or not
* @ param null
* @ return boolean
*/
public function isActive () {
return ( $this -> getConfigValue ( 'account_status' ) == " active " );
}
/**
* startSession
* @ param string $params
* @ return boolean
*/
public function startSession ( $params ) {
//make sure the params contain the required entries
if ( ! isset ( $params [ 'app_key' ]))
$params [ 'app_key' ] = $this -> getAppKey ();
if ( ! isset ( $params [ 'client_id' ]))
$params [ 'client_id' ] = $this -> getClientId ();
//create a new session
$data = parent :: startSession ( $params );
//save session details
$this -> insertRow ( $this -> getTableName ( 'shareyourcart_tokens' ), $data );
//we can't rely on the fact that the row has been inserted, so check!
if ( $this -> getSessionId ( $data [ 'token' ]) === null )
throw new Exception ( SyC :: t ( 'sdk' , 'Token cannot be saved. Check your "{table_name}" table permissions.' , array ( '{table_name}' => $this -> getTableName ( 'shareyourcart_tokens' ))));
return true ;
}
/**
* ensureCouponIsValid
* @ param string $params
* @ return boolean
*/
public function assertCouponIsValid ( $token , $coupon_code , $coupon_value , $coupon_type ) {
//first call the parent function
parent :: assertCouponIsValid ( $token , $coupon_code , $coupon_value , $coupon_type );
//get the session_id associated with the token
$session_id = $this -> getSessionId ( $token );
//make sure the session is valid
if ( $session_id === null ) {
throw new Exception ( SyC :: t ( 'sdk' , 'Token not found' ));
}
//resume the session
session_destroy ();
session_id ( $session_id );
session_start ();
$this -> loadSessionData ();
}
/**
* simply show the button
* @ param null
* @ return boolean
*/
public function showButton () {
echo $this -> getButton ();
}
/**
*
* get the button code
*
*/
public function getButton () {
//make sure the API is active
if ( ! $this -> isActive ()) return ;
return $this -> renderButton ( $this -> getButtonCallbackURL ());
}
/**
* renderButton
* @ param null
* @ return boolean
*/
protected function renderButton ( $callback_url ) {
ob_start ();
$current_button_type = $this -> getConfigValue ( " button_type " );
$button_html = $this -> getConfigValue ( " button_html " );
$button_img = $this -> getConfigValue ( " btn-img " );
$button_img_width = $this -> getConfigValue ( " btn-img-width " );
$button_img_height = $this -> getConfigValue ( " btn-img-height " );
$button_img_hover = $this -> getConfigValue ( " btn-img-h " );
$button_img_hover_width = $this -> getConfigValue ( " btn-img-h-width " );
$button_img_hover_height = $this -> getConfigValue ( " btn-img-h-height " );
switch ( $current_button_type )
{
case '1' :
include ( dirname ( __FILE__ ) . '/views/button.php' );
break ;
case '2' :
include ( dirname ( __FILE__ ) . '/views/button-img.php' );
break ;
case '3' :
include ( dirname ( __FILE__ ) . '/views/button-custom.php' );
break ;
default :
include ( dirname ( __FILE__ ) . '/views/button.php' );
break ;
}
return ob_get_clean ();
}
/**
*
* show the button on a product page
*
*/
public function showProductButton () {
echo $this -> getProductButton ();
}
/**
*
* get the button for a product page
*
*/
public function getProductButton () {
if ( $this -> isSingleProduct () && ! $this -> getConfigValue ( 'hide_on_product' )){
return $this -> getButton ();
}
//else return nothing
return null ;
}
/**
*
* show the button on a cart page
*
*/
public function showCartButton () {
echo $this -> getCartButton ();
}
/**
*
* get the button for the cart page
*
*/
public function getCartButton () {
if ( ! $this -> getConfigValue ( 'hide_on_checkout' )){
return $this -> getButton ();
}
//return nothing
return null ;
}
/**
*
* Simply show the page header
*
*/
public function showPageHeader () {
echo $this -> getPageHeader ();
}
/**
* Get the page header code
* @ param null
* @ return boolean
*/
public function getPageHeader () {
//this is a single call function
if ( ! $this -> isFirstCall ( __FUNCTION__ ))
return ;
$data = $this -> getCurrentProductDetails ();
ob_start ();
include ( dirname ( __FILE__ ) . '/views/page-header.php' );
return ob_get_clean ();
}
/**
* Show the admin header code
* @ param null
* @ return boolean
*/
public function showAdminHeader () {
echo $this -> getAdminHeader ();
}
/**
* Get the admin header code
* @ param null
* @ return boolean
*/
public function getAdminHeader () {
//this is a single call function
if ( ! $this -> isFirstCall ( __FUNCTION__ ))
return ;
//check the SDK status
$this -> checkSDKStatus ( true ); //for a check, as the admin might have changed the language in the configure page, so we need to sync with it
ob_start ();
include ( dirname ( __FILE__ ) . '/views/admin-header.php' );
return ob_get_clean ();
}
/**
* show the admin page
* @ param null
* @ return boolean
*/
public function showAdminPage ( $html = '' , $show_header = TRUE , $show_footer = TRUE ) {
echo $this -> getAdminPage ( $html , $show_header , $show_footer );
}
/**
*
* get the admin page
*
*/
public function getAdminPage ( $html = '' , $show_header = TRUE , $show_footer = TRUE ) {
//this is a single call function
if ( ! $this -> isFirstCall ( __FUNCTION__ ))
return ;
$status_message = '' ;
$refresh = false ;
//check if this is a post for this particular page
if ( $_SERVER [ 'REQUEST_METHOD' ] == 'POST' &&
! empty ( $_POST [ 'syc-account-form' ])) {
$this -> setConfigValue ( 'appKey' , $_POST [ 'app_key' ]);
$this -> setConfigValue ( 'clientId' , $_POST [ 'client_id' ]);
//it is vital that we call the activation API here, to make sure, that the account is ACTIVE
//call the account status function
$message = '' ;
if ( $this -> activate ( $message ) == true ) {
$status_message = SyC :: t ( 'sdk' , 'Account settings successfully saved' );
} else {
//the account did not activate, so show the error
$status_message = $message ;
}
//since we might have changed the status, REFRESH
$refresh = true ;
}
//the user decided to disable the API
else if ( $_SERVER [ 'REQUEST_METHOD' ] == 'POST' &&
! empty ( $_POST [ 'disable-API' ])){
$this -> deactivate ( $status_message );
//since we might have changed the status, REFRESH
$refresh = true ;
}
//the user decided to activate the API
else if ( $_SERVER [ 'REQUEST_METHOD' ] == 'POST' &&
! empty ( $_POST [ 'enable-API' ])){
$this -> activate ( $status_message );
//since we might have changed the status, REFRESH
$refresh = true ;
}
//check if the user want's to recover his account
else if ( @ $_REQUEST [ 'syc-account' ] === 'recover' ){
//by default, show the form if we are here
$show_form = true ;
if ( $_SERVER [ 'REQUEST_METHOD' ] == 'POST' &&
! empty ( $_POST [ 'syc-recover-account' ]))
{
//try to recover if the user posted the form
$show_form = ! $this -> recover ( $this -> getSecretKey (), @ $_REQUEST [ 'domain' ], @ $_REQUEST [ 'email' ], $status_message );
}
//if we need to show the form
if ( $show_form )
{
//if there is a message, put the form on a new line
if ( ! empty ( $status_message ))
$status_message .= " <br /><br /> " ;
ob_start ();
include ( dirname ( __FILE__ ) . '/views/account-recover-partial.php' );
$status_message .= ob_get_clean ();
}
else
{
//Refresh in order to get rid of the GET parameter
$refresh = true ;
}
}
else if ( @ $_REQUEST [ 'syc-account' ] === 'create' ){
//by default, show the form if we are here
$show_form = true ;
if ( $_SERVER [ 'REQUEST_METHOD' ] == 'POST' &&
! empty ( $_POST [ 'syc-create-account' ]))
{
//first, check if the user has agreed to the terms and conditions
if ( isset ( $_POST [ 'syc-terms-agreement' ]))
{
//try to create the account if the user posted the form
if ( ! (( $register = $this -> register ( $this -> getSecretKey (), @ $_REQUEST [ 'domain' ], @ $_REQUEST [ 'email' ], $status_message )) === false ))
{
$this -> setConfigValue ( 'appKey' , @ $register [ 'app_key' ]);
$this -> setConfigValue ( 'clientId' , @ $register [ 'client_id' ]);
$this -> setConfigValue ( " account_status " , " active " );
$show_form = false ; //no need to show the register form anymore
//since we might have changed the status, REFRESH
$refresh = true ;
}
}
else
{
$status_message = SyC :: t ( 'sdk' , " Error. You must agree with the terms and conditions bellow " );
}
}
//if we need to show the form
if ( $show_form )
{
//if there is a message, put the form on a new line
if ( ! empty ( $status_message ))
$status_message .= " <br /><br /> " ;
ob_start ();
include ( dirname ( __FILE__ ) . '/views/account-create-partial.php' );
$status_message .= ob_get_clean ();
}
}
//make sure there is a session variable setup
2012-04-30 19:50:35 +00:00
session_start ();
2012-04-28 17:28:18 +00:00
//since switching the API status has a great impact on how the UI looks, refresh the page
//just to make sure the UI is using the latest value
if ( $refresh )
{
//first, save the status message
$_SESSION [ '_syc_status_message' ] = $status_message ;
//recreate the url ( but before that make sure there is no syc-account parameter in it )
unset ( $_GET [ 'syc-account' ]);
$url = '?' . http_build_query ( $_GET , '' , '&' );
@ header ( " HTTP/1.1 302 Found " );
@ header ( " Location: $url " );
echo " <meta http-equiv= \" refresh \" content= \" 0; url= $url\ " > " ; //it can happen that the headers have allready been sent, so use the html version as well
exit ;
}
//if there is a status message
if ( ! empty ( $_SESSION [ '_syc_status_message' ]))
{
$status_message = $_SESSION [ '_syc_status_message' ];
unset ( $_SESSION [ '_syc_status_message' ]);
}
// Display the view
ob_start ();
include ( dirname ( __FILE__ ) . '/views/admin-page.php' );
return ob_get_clean ();
}
/**
*
* show page to customize the button
*
*/
public function showButtonCustomizationPage ( $html = '' , $show_header = TRUE , $show_footer = TRUE ) {
echo $this -> getButtonCustomizationPage ( $html , $show_header , $show_footer );
}
/**
*
* get the page to customize the button
*
*/
public function getButtonCustomizationPage ( $html = '' , $show_header = TRUE , $show_footer = TRUE ){
//if visual settings are submitted
if ( $_SERVER [ 'REQUEST_METHOD' ] == 'POST' &&
! empty ( $_POST [ 'syc-visual-form' ])) {
//set the button declaration
$this -> setConfigValue ( " button_type " , $_POST [ 'button_type' ]);
//set the button skin
$this -> setConfigValue ( " button_skin " , $_POST [ 'button_skin' ]);
//set the button position
$this -> setConfigValue ( " button_position " , $_POST [ 'button_position' ]);
//set the button height
$this -> setConfigValue ( " dont_set_height " , empty ( $_POST [ 'show_on_single_row' ]));
//set the button html
$this -> setConfigValue ( " button_html " , rawurldecode ( $_POST [ 'button_html' ]));
//set the show
$this -> setConfigValue ( " hide_on_product " , empty ( $_POST [ 'show_on_product' ]));
//set the show'
$this -> setConfigValue ( " hide_on_checkout " , empty ( $_POST [ 'show_on_checkout' ]));
if ( $_FILES [ " button-img " ][ " name " ] != '' ) {
2012-04-30 19:50:35 +00:00
$target_path = dirname ( __FILE__ ) . " /img/ " ;
2012-04-28 17:28:18 +00:00
$target_path = $target_path . 'button-img.png' ;
if ( file_exists ( $target_path )) unlink ( $target_path );
list ( $width , $height , $type , $attr ) = getimagesize ( $_FILES [ 'button-img' ][ 'tmp_name' ]);
if ( move_uploaded_file ( $_FILES [ 'button-img' ][ 'tmp_name' ], $target_path ))
{
//set the button img
$this -> setConfigValue ( " btn-img " , $this -> createUrl ( $target_path ));
$this -> setConfigValue ( " btn-img-width " , $width );
$this -> setConfigValue ( " btn-img-height " , $height );
}
}
if ( $_FILES [ " button-img-hover " ][ " name " ] != '' ) {
2012-04-30 19:50:35 +00:00
$target_path = dirname ( __FILE__ ) . " /img/ " ;
2012-04-28 17:28:18 +00:00
$target_path = $target_path . 'btn-img-hover.png' ;
if ( file_exists ( $target_path )) unlink ( $target_path );
list ( $width , $height , $type , $attr ) = getimagesize ( $_FILES [ 'button-img-hover' ][ 'tmp_name' ]);
if ( move_uploaded_file ( $_FILES [ 'button-img-hover' ][ 'tmp_name' ], $target_path ))
{
//set the show'
$this -> setConfigValue ( " btn-img-h " , $this -> createUrl ( $target_path ));
$this -> setConfigValue ( " btn-img-h-width " , $width );
$this -> setConfigValue ( " btn-img-h-height " , $height );
}
}
$status_message = SyC :: t ( 'sdk' , 'Button settings successfully updated.' );
}
$current_button_type = $this -> getConfigValue ( " button_type " );
$current_skin = $this -> getConfigValue ( " button_skin " );
$current_position = $this -> getConfigValue ( " button_position " );
$show_on_checkout = ! $this -> getConfigValue ( " hide_on_checkout " );
$show_on_product = ! $this -> getConfigValue ( " hide_on_product " );
$show_on_single_row = ! $this -> getConfigValue ( " dont_set_height " );
$button_html = $this -> getConfigValue ( " button_html " );
$button_img = $this -> getConfigValue ( " btn-img " );
$button_img_hover = $this -> getConfigValue ( " btn-img-h " );
//render the view
ob_start ();
include ( dirname ( __FILE__ ) . '/views/button-settings-page.php' );
return ob_get_clean ();
}
/**
* showDocumentation
* @ param null
* @ return boolean
*/
public function showDocumentationPage ( $html = '' , $show_header = TRUE , $show_footer = TRUE ) {
echo $this -> getDocumentationPage ( $html , $show_header , $show_footer );
}
/**
* get the documentation page
* @ param null
* @ return boolean
*/
public function getDocumentationPage ( $html = '' , $show_header = TRUE , $show_footer = TRUE ) {
//this is a single call function
if ( ! $this -> isFirstCall ( __FUNCTION__ ))
return ;
$action_url = $this -> getButtonCallbackURL ();
//render the view
ob_start ();
include ( dirname ( __FILE__ ) . '/views/documentation.php' );
return ob_get_clean ();
}
/**
* show the update notification
* @ param null
*/
public function showUpdateNotification (){
echo $this -> getUpdateNotification ();
}
/**
* get the update notification
* @ param null
*/
public function getUpdateNotification (){
//render the view
ob_start ();
include ( dirname ( __FILE__ ) . '/views/update-notification-partial.php' );
return ob_get_clean ();
}
/*
*
* Called when a new coupon is generated
*
*/
public function couponCallback () {
try {
/* * ********* Check input parameters ******************************* */
if ( ! isset ( $_POST [ 'token' ], $_POST [ 'coupon_code' ], $_POST [ 'coupon_value' ], $_POST [ 'coupon_type' ])) {
throw new Exception ( SyC :: t ( 'sdk' , 'At least one of the parameters is missing. Received: {data}' , array ( '{data}' => print_r ( $_POST , true ))));
}
//make sure the coupon is valid
$this -> assertCouponIsValid ( $_POST [ 'token' ], $_POST [ 'coupon_code' ], $_POST [ 'coupon_value' ], $_POST [ 'coupon_type' ]);
//save the coupon
$this -> saveCoupon ( $_POST [ 'token' ], $_POST [ 'coupon_code' ], $_POST [ 'coupon_value' ], $_POST [ 'coupon_type' ]);
//check if the coupon is intended to be applied to the current cart
if ( empty ( $_POST [ 'save_only' ])) {
$this -> applyCoupon ( $_POST [ 'coupon_code' ]);
}
} catch ( Exception $e ) {
header ( " HTTP/1.0 403 " );
echo $e -> getMessage ();
}
}
/**
* Save the coupon
* @ param null
* @ return boolean
*/
protected function saveCoupon ( $token , $coupon_code , $coupon_value , $coupon_type ) {
//add the coupon id in shareyourcart coupons table
$data = array (
'token' => $token ,
'coupon_id' => $coupon_code ,
);
$this -> insertRow ( $this -> getTableName ( 'shareyourcart_coupons' ), $data );
}
/**
*
* Based on the token , get the session_id
*
*/
protected function getSessionId ( $token ) {
$result = $this -> getRow ( " SELECT session_id FROM " . $this -> getTableName ( 'shareyourcart_tokens' ) . " WHERE token=' $token ' " );
return isset ( $result ) ? $result [ 'session_id' ] : null ;
}
/**
*
* createTable
* @ param table
* @ param array columns
* @ param string @ option
*/
protected function createTable ( $tableName , $columns , $primaryKey , $options = NULL ) {
$sql = " CREATE TABLE IF NOT EXISTS $tableName ( \n " ;
foreach ( $columns as $name => $type ) {
$sql .= " $name $type " ;
if ( $name == $primaryKey ) {
$sql .= " NOT NULL AUTO_INCREMENT " ;
}
$sql .= " , \n " ;
}
$sql .= " PRIMARY KEY ( $primaryKey )); " ;
$this -> executeNonQuery ( $sql );
//we can't relly on the fact that the table has been properly created, so check it!
if ( ! $this -> existsTable ( $tableName ))
2012-04-30 19:50:35 +00:00
throw new Exception ( SyC :: t ( 'sdk' , 'Cannot create table "{table_name}". Check your database permissions.' , array ( '{table_name}' => $tableName )));
2012-04-28 17:28:18 +00:00
}
/**
*
* existsTable
* @ return TRUE if the table exists , otherwise false
*/
protected function existsTable ( $tableName ){
$table_details = $this -> getRow ( " show tables like ' $tableName ' " );
//if there are table details, it means the table exists
return ! empty ( $table_details );
}
/**
* Drop the specified table
*
* @ param string tableName
*/
protected function dropTable ( $tableName ) {
2012-04-30 19:50:35 +00:00
$this -> executeNonQuery ( " DROP TABLE $tableName " );
2012-04-28 17:28:18 +00:00
//we can't relly on the fact that the table has been properly droped, so check it!
2012-04-30 19:50:35 +00:00
if ( ! $this -> existsTable ( $tableName ))
throw new Exception ( SyC :: t ( 'sdk' , 'Cannot drop table "{table_name}". Check your database permissions.' , array ( '{table_name}' => $tableName )));
2012-04-28 17:28:18 +00:00
}
/**
*
* Check the SDK status
* @ param $force . TRUE to check , no matter how soon the previous check was . This can have a great impact on the experience of the admin
*
*/
protected function checkSDKStatus ( $force = false ) {
//call the API at most only once every 5 minutes, not sooner
if ( ! $force && ( time () - $this -> getConfigValue ( 'api_last_check' )) < 5 * 60 )
return ;
//set the latest check time
$this -> setConfigValue ( 'api_last_check' , time ());
//get an update from the API
$message = '' ;
if ( is_array ( $result = $this -> getSDKStatus ( $this -> getSecretKey (), $this -> getClientId (), $this -> getAppKey (), $message )))
{
//save the data
$this -> setConfigValue ( 'api_version' , @ $result [ 'api_version' ]);
$this -> setConfigValue ( 'latest_version' , @ $result [ 'plugin_latest_version' ]);
$this -> setConfigValue ( 'download_url' , @ $result [ 'plugin_download_url' ]);
//set the current language the SDK should be displayed in
if ( isset ( $result [ 'lang' ])){
$this -> setConfigValue ( 'lang' , $result [ 'lang' ]);
SyC :: setLanguage ( $result [ 'lang' ]);
}
} else {
//simply log the error, for now!
error_log ( print_r ( $message , true ));
}
}
/*
*
* Call to see if the function was called once , or not
*
*/
protected static function isFirstCall ( $functionName ) {
if ( array_key_exists ( $functionName , self :: $_SINGLE_FUNCTIONS_CALLS ))
return false ;
self :: $_SINGLE_FUNCTIONS_CALLS [ $functionName ] = true ;
return true ;
}
/**
*
* User to catch any unhandled exceptions and print them nicelly
*
*/
public function UncaughtExceptionHandler ( Exception $e ) {
//@header("HTTP/1.0 403");
echo $e -> getMessage ();
}
}
} //END IF
?>