Files
bio-concept-pharma/web/modules/magic360/magictoolbox.params.class.php
2019-11-17 19:14:07 +01:00

1091 lines
35 KiB
PHP

<?php
/**
* 2005-2017 Magic Toolbox
*
* NOTICE OF LICENSE
*
* This file is licenced under the Software License Agreement.
* With the purchase or the installation of the software in your application
* you accept the licence agreement.
*
* You must not modify, adapt or create derivative works of this source code
*
* @author Magic Toolbox <support@magictoolbox.com>
* @copyright Copyright (c) 2017 Magic Toolbox <support@magictoolbox.com>. All rights reserved
* @license https://www.magictoolbox.com/license/
*/
@ini_set('memory_limit', '512M');
if (!function_exists('lcfirst')) {
function lcfirst($str)
{
$str[0] = Tools::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['&#039;'] = '\'';
}
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('MAGICTOOLBOX_PARAMS_CLASS_LOADED')) {
define('MAGICTOOLBOX_PARAMS_CLASS_LOADED', true);
/**
* MagicToolboxParamsClass
*
*/
class MagicToolboxParamsClass
{
/**
* Options
*
* @var array
*
*/
public $params = array();
/**
* General profile
*
* @var string
*
*/
public $generalProfile = 'default';
/**
* Current profile
*
* @var string
*
*/
public $currentProfile = '';
/**
* Scope
*
* @var string
*
*/
public $scope = 'default';
/**
* Mapping array
*
* @var array
*
*/
public $mapping = array();
/**
* Constructor
*
* @return void
*/
public function __construct()
{
$this->params = array($this->generalProfile => array());
$this->currentProfile = $this->generalProfile;
}
/**
* Method to set scope
*
* @param string $scope Scope
*
* @return void
*/
public function setScope($scope)
{
$this->scope = $scope;
}
/**
* Method to get current profile name
*
* @return string
*/
public function getProfile()
{
return $this->currentProfile;
}
/**
* Method to get all profile names
*
* @return array
*/
public function getProfiles()
{
return array_keys($this->params);
}
/**
* Method to set current profile name
*
* @param string $profile Profile name
*
* @return boolean
*/
public 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
*/
public 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
*/
public function resetProfile()
{
$this->currentProfile = $this->generalProfile;
}
/**
* Method to delete profile
*
* @param string $profile Profile name
*
* @return boolean
*/
public 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
*/
public function profileExists($profile)
{
return isset($this->params[$profile]);
}
/**
* Method to get profile's params
*
* @param string $profile Profile name
*
* @return array|null
*/
public 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
*/
public 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
*/
public 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
*/
public 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
*/
public 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
*/
public 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
*/
public 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
*/
public function setValue($id, $value, $profile = '')
{
if (!$profile) {
$profile = $this->currentProfile;
}
if (isset($this->params[$profile][$id])) {
$this->params[$profile][$id]['value'] = $value;
} elseif (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
*/
public function setMobileValue($id, $value, $profile = '')
{
if (!$profile) {
$profile = $this->currentProfile;
}
if (isset($this->params[$profile][$id])) {
$this->params[$profile][$id]['mobile-value'] = $value;
} elseif (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
*/
public 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
*/
public 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
*/
public 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
*/
public 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
*/
public 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
*/
public function setValues($id, $values, $profile = '')
{
if (!$profile) {
$profile = $this->currentProfile;
}
if (isset($this->params[$profile][$id])) {
$this->params[$profile][$id]['values'] = $values;
} elseif (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
*/
public function checkValue($id, $value, $profile = '', $strict = false)
{
if (!$profile) {
$profile = $this->currentProfile;
}
if (!is_array($value)) {
$value = array($value);
}
return in_array(Tools::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
*/
public function checkMobileValue($id, $value, $profile = '', $strict = false)
{
if (!$profile) {
$profile = $this->currentProfile;
}
if (!is_array($value)) {
$value = array($value);
}
return in_array(Tools::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
*/
public 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(Tools::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
*/
public 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
*/
public 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
*/
public 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
*/
public 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
*/
public 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
*/
public 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
*/
public 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
*/
public function setSubType($id, $subType, $profile = '')
{
if (!$profile) {
$profile = $this->currentProfile;
}
if (isset($this->params[$profile][$id])) {
$this->params[$profile][$id]['subType'] = $subType;
} elseif (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
*/
public 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
*/
public 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(Tools::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
*/
public 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(Tools::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
*/
public function setMapping($mapping = array())
{
$this->mapping = $mapping;
}
/**
* Method to get mapping
*
* @return array
*/
public function getMapping()
{
return $this->mapping;
}
/**
* Method to add mapping
*
* @param string $key Param ID
* @param array $mapping Mapping
*
* @return void
*/
public function addMapping($key, $mapping = array())
{
$this->mapping[$key] = $mapping;
}
/**
* Method to remove mapping
*
* @param string $key Param ID
*
* @return void
*/
public 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
*/
public 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;
}
}
} elseif ($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
*/
public 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;
}
}
}