%PDF- %PDF-
| Direktori : /home1/lightco1/www/plugins/system/magic360/magic360_classes/ |
| Current File : //home1/lightco1/www/plugins/system/magic360/magic360_classes/magictoolbox.params.class.php |
<?php
/*------------------------------------------------------------------------
# plg_system_magic360 - Magic 360 for Joomla
# ------------------------------------------------------------------------
# Magic Toolbox
# Copyright 2011 MagicToolbox.com. All Rights Reserved.
# @license - http://www.opensource.org/licenses/artistic-license-2.0 Artistic License 2.0 (GPL compatible)
# Website: http://www.magictoolbox.com/magic360/modules/joomla/
# Technical Support: http://www.magictoolbox.com/contact/
/*-------------------------------------------------------------------------*/
// no direct access
defined('_JEXEC') or die('Restricted access.');
@ini_set('memory_limit', '512M');
if(!function_exists('lcfirst')) {
function lcfirst($str) {
$str[0] = strtolower($str[0]);
return $str;
}
}
if(!function_exists('htmlspecialchars_decode')) {
function htmlspecialchars_decode($string, $style = ENT_COMPAT) {
$translation = array_flip(get_html_translation_table(HTML_SPECIALCHARS, $style));
if($style === ENT_QUOTES) {
$translation['''] = '\'';
}
return strtr($string, $translation);
}
}
if(!function_exists('array_combine')) {
function array_combine($arr1, $arr2) {
$out = array();
$arr1 = array_values($arr1);
$arr2 = array_values($arr2);
foreach($arr1 as $key1 => $value1) {
$out[(string)$value1] = $arr2[$key1];
}
return $out;
}
}
if(!function_exists('file_put_contents')) {
function file_put_contents($filename, $data) {
$fp = fopen($filename, 'w+');
if($fp) {
fwrite($fp, $data);
fclose($fp);
}
}
}
if(!defined('MagicToolboxParamsClassLoaded')) {
define('MagicToolboxParamsClassLoaded', true);
/**
* MagicToolboxParamsClass
*
*/
class MagicToolboxParamsClass {
/**
* Options
*
* @var array
*
*/
var $params = array();
/**
* General profile
*
* @var string
*
*/
var $generalProfile = 'default';
/**
* Current profile
*
* @var string
*
*/
var $currentProfile = '';
/**
* Scope
*
* @var string
*
*/
var $scope = 'default';
/**
* Mapping array
*
* @var array
*
*/
var $mapping = array();
/**
* Constructor
*
* @return void
*/
function __construct() {
$this->params = array($this->generalProfile => array());
$this->currentProfile = $this->generalProfile;
}
/**
* Method to set scope
*
* @param string $scope Scope
*
* @return void
*/
function setScope($scope) {
$this->scope = $scope;
}
/**
* Method to get current profile name
*
* @return string
*/
function getProfile() {
return $this->currentProfile;
}
/**
* Method to get all profile names
*
* @return array
*/
function getProfiles() {
return array_keys($this->params);
}
/**
* Method to set current profile name
*
* @param string $profile Profile name
*
* @return boolean
*/
function setProfile($profile) {
/*if(!$profile) return false;
if(!isset($this->params[$profile])) {
$this->params[$profile] = array();
}*/
$this->currentProfile = $profile;
return true;
}
/**
* Method to rename general profile
*
* @param string $profile Profile name
*
* @return boolean
*/
function renameGeneralProfile($profile) {
if(!$profile) {
return false;
}
if($this->generalProfile != $profile) {
$this->params[$profile] = $this->params[$this->generalProfile];
if($this->currentProfile == $this->generalProfile) {
$this->currentProfile = $profile;
}
unset($this->params[$this->generalProfile]);
$this->generalProfile = $profile;
}
return true;
}
/**
* Method to reset to general profile
*
* @return void
*/
function resetProfile() {
$this->currentProfile = $this->generalProfile;
}
/**
* Method to delete profile
*
* @param string $profile Profile name
*
* @return boolean
*/
function deleteProfile($profile) {
if(isset($this->params[$profile]) && $profile != $this->generalProfile) {
if($profile == $this->currentProfile) {
$this->currentProfile = $this->generalProfile;
}
unset($this->params[$profile]);
return true;
}
return false;
}
/**
* Method to check if profile exists
*
* @param string $profile Profile name
*
* @return boolean
*/
function profileExists($profile) {
return isset($this->params[$profile]);
}
/**
* Method to get profile's params
*
* @param string $profile Profile name
*
* @return array|null
*/
function getParams($profile = '') {
if(!$profile) {
$profile = $this->currentProfile;
}
return isset($this->params[$profile]) ? $this->params[$profile] : null;
}
/**
* Method to set profile's params
*
* @param array $params Params to set
* @param string $profile Profile name
*
* @return void
*/
function setParams($params, $profile = '') {
if(!$profile) {
$profile = $this->currentProfile;
}
//if(!isset($this->params[$profile])) {
// $this->params[$profile] = array();
//}
//NOTICE: this method rewrite all params
$this->params[$profile] = $params;
}
/**
* Method to get param names
*
* @param string $profile Profile name
*
* @return array|null
*/
function getNames($profile = '') {
if(!$profile) {
$profile = $this->currentProfile;
}
return isset($this->params[$profile]) ? array_keys($this->params[$profile]) : null;
}
/**
* Method to append params
*
* @param array $params Params to append
* @param string $profile Profile name
*
* @return array
*/
function appendParams($params, $profile = '') {
if(!$profile) {
$profile = $this->currentProfile;
}
if(!isset($this->params[$profile])) {
$this->params[$profile] = array();
}
//NOTE: we can't use array_merge because it overwrites the subarrays, and not merge them
//$this->params[$profile] = array_merge($this->params[$profile], $params);
foreach($params as $key => $value) {
if(array_key_exists($key, $this->params[$profile]) && is_array($this->params[$profile][$key])) {
$this->params[$profile][$key] = array_merge($this->params[$profile][$key], $value);
} else {
$this->params[$profile][$key] = $value;
}
}
return $this->params[$profile];
}
/**
* Method to check if param exists
*
* @param string $id Param ID
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return boolean
*/
function paramExists($id, $profile = '', $strict = true) {
if(!$profile) {
$profile = $this->currentProfile;
}
return isset($this->params[$profile][$id]) || !$strict && isset($this->params[$this->generalProfile][$id]);
}
/**
* Method to remove param
*
* @param string $id Param ID
* @param string $profile Profile name
*
* @return void
*/
function removeParam($id, $profile = '') {
if(!$profile) {
$profile = $this->currentProfile;
}
if(isset($this->params[$profile][$id])) {
unset($this->params[$profile][$id]);
}
}
/**
* Method to get param's data
*
* @param string $id Param ID
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return mixed|null
*/
function getParam($id, $profile = '', $strict = true) {
if(!$profile) {
$profile = $this->currentProfile;
}
return isset($this->params[$profile][$id]) ? $this->params[$profile][$id] : ((!$strict && isset($this->params[$this->generalProfile][$id])) ? $this->params[$this->generalProfile][$id] : null);
}
/**
* Method to set param's value
*
* @param string $id Param ID
* @param mixed $value Param value
* @param string $profile Profile name
*
* @return void
*/
function setValue($id, $value, $profile = '') {
if(!$profile) {
$profile = $this->currentProfile;
}
if(isset($this->params[$profile][$id])) {
$this->params[$profile][$id]['value'] = $value;
} else if(isset($this->params[$this->generalProfile][$id])) {
$this->params[$profile][$id] = $this->params[$this->generalProfile][$id];
$this->params[$profile][$id]['value'] = $value;
} else {
$this->params[$profile][$id] = array(
'id' => $id,
'group' => '',
'order' => '',
'default' => $value,
'label' => '',
'description' => '',
'type' => 'text',
'value' => $value,
'scope' => ''
);
}
}
/**
* Method to set param's value (for mobile)
*
* @param string $id Param ID
* @param mixed $value Param value
* @param string $profile Profile name
*
* @return void
*/
function setMobileValue($id, $value, $profile = '') {
if(!$profile) {
$profile = $this->currentProfile;
}
if(isset($this->params[$profile][$id])) {
$this->params[$profile][$id]['mobile-value'] = $value;
} else if(isset($this->params[$this->generalProfile][$id])) {
$this->params[$profile][$id] = $this->params[$this->generalProfile][$id];
$this->params[$profile][$id]['mobile-value'] = $value;
} else {
$this->params[$profile][$id] = array(
'id' => $id,
'group' => '',
'order' => '',
'default' => $value,
'label' => '',
'description' => '',
'type' => 'text',
'mobile-value' => $value,
'scope' => ''
);
}
}
/**
* Method to get param's value
*
* @param string $id Param ID
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return mixed|null
*/
function getValue($id, $profile = '', $strict = false) {
if(!$profile) {
$profile = $this->currentProfile;
}
$param = $this->getParam($id, $profile, $strict);
if($param) {
return isset($param['value']) ? $param['value'] : $param['default'];
}
return null;
}
/**
* Method to get param's value (for mobile)
*
* @param string $id Param ID
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return mixed|null
*/
function getMobileValue($id, $profile = '', $strict = false) {
if(!$profile) {
$profile = $this->currentProfile;
}
$param = $this->getParam($id, $profile, $strict);
if($param) {
return isset($param['mobile-value']) ? $param['mobile-value'] : null;
}
return null;
}
/**
* Method to get param's default value
*
* @param string $id Param ID
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return mixed|null
*/
function getDefaultValue($id, $profile = '', $strict = false) {
if(!$profile) {
$profile = $this->currentProfile;
}
$param = $this->getParam($id, $profile, $strict);
return $param ? $param['default'] : null;
}
/**
* Method to get param's values
*
* @param string $id Param ID
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return array|null
*/
function getValues($id, $profile = '', $strict = false) {
if(!$profile) {
$profile = $this->currentProfile;
}
$param = $this->getParam($id, $profile, $strict);
if($param) {
return isset($param['values']) ? $param['values'] : array($param['default']);
} else {
return null;
}
}
/**
* Method to check if values exists
*
* @param string $id Param ID
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return boolean
*/
function valuesExists($id, $profile = '', $strict = true) {
if(!$profile) {
$profile = $this->currentProfile;
}
$param = $this->getParam($id, $profile, $strict);
return $param ? isset($param['values']) : false;
}
/**
* Method to set values
*
* @param string $id Param ID
* @param array $values Param values
* @param string $profile Profile name
*
* @return void
*/
function setValues($id, $values, $profile = '') {
if(!$profile) {
$profile = $this->currentProfile;
}
if(isset($this->params[$profile][$id])) {
$this->params[$profile][$id]['values'] = $values;
} else if(isset($this->params[$this->generalProfile][$id])) {
$this->params[$profile][$id] = $this->params[$this->generalProfile][$id];
$this->params[$profile][$id]['values'] = $values;
} //else param not exists
}
/**
* Method to check param's value
*
* @param string $id Param ID
* @param mixed $value Param values
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return boolean
*/
function checkValue($id, $value, $profile = '', $strict = false) {
if(!$profile) {
$profile = $this->currentProfile;
}
if(!is_array($value)) {
$value = array($value);
}
return in_array(strtolower($this->getValue($id, $profile, $strict)), array_map('strtolower', $value));
}
/**
* Method to check param's value (for mobile)
*
* @param string $id Param ID
* @param mixed $value Param values
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return boolean
*/
function checkMobileValue($id, $value, $profile = '', $strict = false) {
if(!$profile) {
$profile = $this->currentProfile;
}
if(!is_array($value)) {
$value = array($value);
}
return in_array(strtolower($this->getMobileValue($id, $profile, $strict)), array_map('strtolower', $value));
}
/**
* Method to check group
*
* @param string $id Param ID
* @param string $group Group name
*
* @return boolean
*/
function checkGroup($id, $group/*, $profile = ''*/) {
/*
if(!$profile) {
$profile = $this->currentProfile;
}
*/
if(!isset($this->params[$this->generalProfile][$id]['group']) || empty($this->params[$this->generalProfile][$id]['group'])) {
return false;
}
if(!is_array($group)) {
$group = array($group);
}
return in_array(strtolower($this->params[$this->generalProfile][$id]['group']), array_map('strtolower', $group));
}
/**
* Method to get param's group
*
* @param string $id Param ID
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return string|null
*/
function getGroup($id, $profile = '', $strict = false) {
if(!$profile) {
$profile = $this->currentProfile;
}
$param = $this->getParam($id, $profile, $strict);
return $param ? $param['group'] : null;
}
/**
* Method to get param's label
*
* @param string $id Param ID
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return string|null
*/
function getLabel($id, $profile = '', $strict = false) {
if(!$profile) {
$profile = $this->currentProfile;
}
$param = $this->getParam($id, $profile, $strict);
return $param ? $param['label'] : null;
}
/**
* Method to get param's description
*
* @param string $id Param ID
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return string|null
*/
function getDescription($id, $profile = '', $strict = false) {
if(!$profile) {
$profile = $this->currentProfile;
}
$param = $this->getParam($id, $profile, $strict);
if($param) {
return isset($param['description']) ? $param['description'] : '';
} else {
return null;
}
}
/**
* Method to get param's type
*
* @param string $id Param ID
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return string|null
*/
function getType($id, $profile = '', $strict = false) {
if(!$profile) {
$profile = $this->currentProfile;
}
$param = $this->getParam($id, $profile, $strict);
return $param ? $param['type'] : null;
}
/**
* Method to get param's subtype
*
* @param string $id Param ID
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return string|null
*/
function getSubType($id, $profile = '', $strict = false) {
if(!$profile) {
$profile = $this->currentProfile;
}
$param = $this->getParam($id, $profile, $strict);
return $param ? (isset($param['subType']) ? $param['subType'] : null) : null;
}
/**
* Method to check if param is advanced
*
* @param string $id Param ID
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return boolean
*/
function isAdvanced($id, $profile = '', $strict = false) {
if(!$profile) {
$profile = $this->currentProfile;
}
$param = $this->getParam($id, $profile, $strict);
return isset($param, $param['advanced']) ? true : false;
}
/**
* Method to check if param (or some values) is not used for mobile
*
* @param string $id Param ID
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return boolean|array
*/
function isForDesktopOnly($id, $profile = '', $strict = false) {
if(!$profile) {
$profile = $this->currentProfile;
}
$param = $this->getParam($id, $profile, $strict);
$result = false;
if($param) {
if(isset($param['desktop-only'])) {
$result = empty($param['desktop-only']) ? true : explode('|', $param['desktop-only']);
}
}
return $result;
}
/**
* Method to set param's subtype
*
* @param string $id Param ID
* @param string $subType Param subtype
* @param string $profile Profile name
*
* @return void
*/
function setSubType($id, $subType, $profile = '') {
if(!$profile) {
$profile = $this->currentProfile;
}
if(isset($this->params[$profile][$id])) {
$this->params[$profile][$id]['subType'] = $subType;
} else if(isset($this->params[$this->generalProfile][$id])) {
$this->params[$profile][$id] = $this->params[$this->generalProfile][$id];
$this->params[$profile][$id]['subType'] = $subType;
} //else param not exists
}
/**
* Method to get scope or param's scope
*
* @param string $id Param ID
* @param string $profile Profile name
* @param boolean $strict Flag; whether to check the general profile or no
*
* @return string|null
*/
function getScope($id = null, $profile = '', $strict = false) {
if($id == null) {
return $this->scope;
}
if(!$profile) {
$profile = $this->currentProfile;
}
$param = $this->getParam($id, $profile, $strict);
return $param ? $param['scope'] : null;
}
/**
* Method to load params from INI file
*
* @param string $file Path to INI file
* @param string $profile Profile name
*
* @return boolean
*/
function loadINI($file, $profile = '') {
if(!$profile) {
$profile = $this->currentProfile;
}
if(!file_exists($file)) {
return false;
}
$ini = file($file);
foreach($ini as $num => $line) {
$line = trim($line);
if(empty($line) || in_array(substr($line, 0, 1), array(';','#'))) {
continue;
}
$cur = explode('=', $line, 2);
if(count($cur) != 2) {
error_log("WARNING: You have errors in you INI file ({$file}) on line ".($num + 1).'!');
continue;
}
$this->setValue(trim($cur[0]), trim($cur[1]), $profile);
}
return true;
}
/**
* Method to update INI file
*
* @param string $file Path to INI file
* @param array $params Params
* @param string $profile Profile name
*
* @return boolean
*/
function updateINI($file, $params = null, $profile = '') {
if(!$profile) {
$profile = $this->currentProfile;
}
if(!file_exists($file)) {
return false;
}
$iniLines = file($file);
$iniParams = array();
foreach($iniLines as $num => $line) {
$line = trim($line);
if(empty($line) || in_array(substr($line, 0, 1), array(';','#'))) {
continue;
}
list($id, $value) = explode('=', $line, 2);
$id = trim($id);
$iniParams[$id] = $num;
}
if($params === null) {
$params = array_keys($this->params[$profile]);
}
foreach($params as $id) {
if(isset($iniParams[$id])) {
$iniLines[$iniParams[$id]] = $id.' = '.$this->getValue($id, $profile)."\n";
} else {
$line = "\n";
if(isset($this->params[$profile][$id]['label'])) {
$line .= '# '.$this->params[$profile][$id]['label']."\n";
}
if(isset($this->params[$profile][$id]['description'])) {
$line .= '# '.$this->params[$profile][$id]['description']."\n";
}
if(isset($this->params[$profile][$id]['values'])) {
$line .= '# allowed values: ';
for($i = 0, $l = count($this->params[$profile][$id]['values']); $i < $l; $i++) {
$line .= $this->params[$profile][$id]['values'][$i];
if($i < $l - 1) {
$line .= ', ';
}
}
$line .= "\n";
}
$iniLines[] = $line.$id.' = '.$this->getValue($id, $profile)."\n";
}
}
file_put_contents($file, implode('', $iniLines));
return true;
}
/**
* Method to set mapping
*
* @param array $mapping Mapping
*
* @return void
*/
function setMapping($mapping = array()) {
$this->mapping = $mapping;
}
/**
* Method to get mapping
*
* @return array
*/
function getMapping() {
return $this->mapping;
}
/**
* Method to add mapping
*
* @param string $key Param ID
* @param array $mapping Mapping
*
* @return void
*/
function addMapping($key, $mapping = array()) {
$this->mapping[$key] = $mapping;
}
/**
* Method to remove mapping
*
* @param string $key Param ID
*
* @return void
*/
function removeMapping($key) {
if(isset($this->mapping[$key])) {
unset($this->mapping[$key]);
}
}
/**
* Method to serialize params
*
* @param boolean $script Flag; serialize for script or for attribute
* @param string $delimiter Delimiter
* @param string $profile Profile name
*
* @return string
*/
function serialize($script = false, $delimiter = '', $profile = '', $mobile = false) {
if(!$profile) {
$profile = $this->currentProfile;
}
$serializeAll = $profile == $this->generalProfile;
$str = array();
foreach($this->getParams($this->generalProfile) as $param) {
if(!isset($param['scope']) || ($param['scope'] != $this->scope)) {
continue;
}
if($serializeAll) {
if($mobile && $this->checkMobileValue($param['id'], $this->getValue($param['id'], $this->generalProfile), $profile, true)) {
continue;
}
} else {
if(!$this->paramExists($param['id'], $profile)) {
continue;
}
if($mobile) {
if($this->checkMobileValue($param['id'], $this->getMobileValue($param['id'], $this->generalProfile, true), $profile, true)) {
//NOTE: if data-mobile-options value is equal to mzMobileOptions value
// we need to display it if it is different from data-options value
if($this->checkMobileValue($param['id'], $this->getValue($param['id'], $profile, true), $profile, true)) {
continue;
}
}
} else if($this->checkValue($param['id'], $this->getValue($param['id'], $this->generalProfile), $profile)) {
continue;
}
}
if($mobile) {
$value = $this->getMobileValue($param['id'], $profile, true);
if($value == null) {
continue;
}
} else {
$value = $this->getValue($param['id'], $profile);
}
if(isset($this->mapping[$param['id']])) {
if(is_array($this->mapping[$param['id']])) {
if(array_key_exists($value, $this->mapping[$param['id']])) {
$value = $this->mapping[$param['id']][$value];
}
} else {
// lambda-style function
$value = $this->mapping[$param['id']]($this);
}
//add possibility to skip some parameters with a specific value
if($value === null) {
continue;
}
}
if($script) {
switch($param['type']) {
case 'num':
//TODO: spike for the parameters that can be numeric or string
//if(strpos($value, '%') !== false) {
// $value = '\''.$value.'\'';
// break;
//}
// no break
case 'float':
//NOTE: numeric and float values without quotes
if($value != 'auto') {
break;
}
// no break
case 'text':
// NOTE: for magicscroll 'items' param: value can be an array
if($param['id'] == 'items' && strpos($value, '[') !== false) {
break;
}
//NOTE: escape single quotes
$value = '\''.str_replace('\'', '\\\'', $value).'\'';//preg_replace('/(?<!\\\\)\'/s', '\\\'', $value)
break;
case 'array':
if(/*$param['id'] != 'right-click' && */in_array($value, array('false', 'true'))) {
break;
}
// no break
default:
$value = '\''.$value.'\'';
}
$str[] = '\''.$param['id'].'\':'.$value;
} else {
// rel
$str[] = $param['id'].':'.$value;
}
}
if(empty($str)) {
$str = '';
} else {
if(!$delimiter) {
$delimiter = $script ? ',' : ';';
}
$str = implode($delimiter, $str);
if(!$script) {
$str .= $delimiter;
}
}
return $str;
}
/**
* Method to unserialize params
*
* @param string $str Params string
* @param string $profile Profile name
*
* @return boolean
*/
function unserialize($str, $profile = '') {
if(!$profile) {
$profile = $this->currentProfile;
}
//script version
//preg_match_all("/'([a-z_\-]+)':'?([^;']*)'?/ui", $str, $matches);
//rel version
preg_match_all("/([a-z_\-]+):([^;']*)/ui", $str, $matches);
if(count($matches[1]) > 0) {
$options = array_combine($matches[1], $matches[2]);
foreach($options as $name => $value) {
$this->setValue($name, $value, $profile);
}
return true;
}
return false;
}
}
}
?>