786 lines
28 KiB
PHP
786 lines
28 KiB
PHP
<?php
|
||
/**
|
||
* TNT OFFICIAL MODULE FOR PRESTASHOP.
|
||
*
|
||
* @author GFI Informatique <www.gfi.world>
|
||
* @copyright 2016-2019 GFI Informatique, 2016-2019 TNT
|
||
* @license https://opensource.org/licenses/MIT MIT License
|
||
*/
|
||
|
||
require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_ClassLoader.php';
|
||
|
||
class TNTOfficiel_Tools
|
||
{
|
||
/**
|
||
* Prevent Construct.
|
||
*/
|
||
final private function __construct()
|
||
{
|
||
trigger_error(sprintf('%s() %s is static.', __FUNCTION__, get_class($this)), E_USER_ERROR);
|
||
}
|
||
|
||
/**
|
||
* Get Bootstrap HTML alert.
|
||
*
|
||
* @param type $arrArgAlert
|
||
*
|
||
* @return string
|
||
*/
|
||
public static function getAlertHTML($arrArgAlert)
|
||
{
|
||
TNTOfficiel_Logstack::log();
|
||
|
||
// Define message sort.
|
||
$arrAlertHTML = array(
|
||
'info' => null,
|
||
'warning' => null,
|
||
'success' => null,
|
||
'error' => null
|
||
);
|
||
|
||
foreach ($arrArgAlert as $strAlertType => $arrAlertMsg) {
|
||
if (count($arrAlertMsg) > 0) {
|
||
|
||
foreach ($arrAlertMsg as $k => $a) {
|
||
if (is_array($a)) {
|
||
$arrAlertMsg[$k] = $k.": ".implode("\n ", $a);
|
||
}
|
||
}
|
||
|
||
$arrAlertMsg = array_map('htmlentities', $arrAlertMsg);
|
||
if ($strAlertType == 'info') {
|
||
$arrAlertHTML[$strAlertType] = '<div class="alert alert-info">'
|
||
.(count($arrAlertMsg) === 1 ?
|
||
array_shift($arrAlertMsg) : ('<ul><li>'.implode('</li><li>', $arrAlertMsg).'</li></ul>'))
|
||
.'</div>';
|
||
} elseif ($strAlertType == 'warning') {
|
||
$arrAlertHTML[$strAlertType] = '<div class="alert alert-warning">'
|
||
.(count($arrAlertMsg) === 1 ?
|
||
array_shift($arrAlertMsg) : ('<ul><li>'.implode('</li><li>', $arrAlertMsg).'</li></ul>'))
|
||
.'</div>';
|
||
} elseif ($strAlertType == 'success') {
|
||
$arrAlertHTML[$strAlertType] = '<div class="alert alert-success">'
|
||
.(count($arrAlertMsg) === 1 ?
|
||
array_shift($arrAlertMsg) : ('<ul><li>'.implode('</li><li>', $arrAlertMsg).'</li></ul>'))
|
||
.'</div>';
|
||
} elseif ($strAlertType == 'error') {
|
||
$arrAlertHTML[$strAlertType] = '<div class="alert alert-danger">'
|
||
.(count($arrAlertMsg) === 1 ?
|
||
array_shift($arrAlertMsg) : ('<ul><li>'.implode('</li><li>', $arrAlertMsg).'</li></ul>'))
|
||
.'</div>';
|
||
}
|
||
}
|
||
|
||
if (array_key_exists($strAlertType, $arrAlertHTML) && !$arrAlertHTML[$strAlertType]) {
|
||
unset($arrAlertHTML[$strAlertType]);
|
||
}
|
||
}
|
||
|
||
return $arrAlertHTML;
|
||
}
|
||
|
||
/**
|
||
* Validate a Fixed Phone (FR,MC only).
|
||
*
|
||
* @param string $strArgISOCode The ISO Country Code.
|
||
* @param string $strArgPhoneFixed The Fixed Phone Number.
|
||
*
|
||
* @return bool|string The Formated Fixed Phone String if valid, else false.
|
||
*/
|
||
public static function validateFixedPhone($strArgISOCode, $strArgPhoneFixed)
|
||
{
|
||
TNTOfficiel_Logstack::log();
|
||
|
||
if (!is_string($strArgISOCode)) {
|
||
return false;
|
||
}
|
||
if (!is_string($strArgPhoneFixed)) {
|
||
return false;
|
||
}
|
||
|
||
// Format par pays.
|
||
$arrPhoneFormatCountry = array(
|
||
'FR' => array(
|
||
'strCoutryCode' => '33',
|
||
'strTrunkp' => '0',
|
||
'strFixed' => '([1234589])([0-9]{8})'
|
||
),
|
||
'MC' => array(
|
||
'strCoutryCode' => '377',
|
||
'strTrunkp' => '',
|
||
'strFixed' => '([89])([0-9]{7})'
|
||
)
|
||
);
|
||
|
||
$strISOCode = Tools::strtoupper($strArgISOCode);
|
||
if (!array_key_exists($strISOCode, $arrPhoneFormatCountry)) {
|
||
return false;
|
||
}
|
||
|
||
// Check allowed character.
|
||
if (!Validate::isPhoneNumber($strArgPhoneFixed)) {
|
||
return false;
|
||
}
|
||
|
||
// Get Country Data.
|
||
$arrPhoneFormat = $arrPhoneFormatCountry[ $strISOCode ];
|
||
// Cleaning Phone Input.
|
||
$strPhoneFixedClean = preg_replace('/[^+0-9()]/ui', '', $strArgPhoneFixed);
|
||
// Root.
|
||
$strRoot = '(?:(?:(?:\+|00)'.$arrPhoneFormat['strCoutryCode']
|
||
.'(?:\('.$arrPhoneFormat['strTrunkp'].'\))?)|'.$arrPhoneFormat['strTrunkp'].')';
|
||
|
||
if (preg_match('/^'.$strRoot.'('.$arrPhoneFormat['strFixed'].')$/ui', $strPhoneFixedClean, $matches)) {
|
||
$strPhoneFixedID = $arrPhoneFormat['strTrunkp'].$matches[1];
|
||
$strPhoneFixedIDLength = Tools::strlen($strPhoneFixedID);
|
||
|
||
if ($strPhoneFixedIDLength < 1 || $strPhoneFixedIDLength > 63) {
|
||
return false;
|
||
}
|
||
|
||
return $strPhoneFixedID;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* Validate a Mobile Phone (FR,MC only).
|
||
*
|
||
* @param string $strArgISOCode The ISO Country Code.
|
||
* @param string $strArgPhoneMobile The Mobile Phone Number.
|
||
*
|
||
* @return bool|string The Formated Mobile Phone String if valid, else false.
|
||
*/
|
||
public static function validateMobilePhone($strArgISOCode, $strArgPhoneMobile)
|
||
{
|
||
TNTOfficiel_Logstack::log();
|
||
|
||
if (!is_string($strArgISOCode)) {
|
||
return false;
|
||
}
|
||
if (!is_string($strArgPhoneMobile)) {
|
||
return false;
|
||
}
|
||
|
||
// Format apr pays.
|
||
$arrPhoneFormatCountry = array(
|
||
'FR' => array(
|
||
'strCoutryCode' => '33',
|
||
'strTrunkp' => '0',
|
||
'strMobile' => '([67])([0-9]{8})'
|
||
),
|
||
'MC' => array(
|
||
'strCoutryCode' => '377',
|
||
'strTrunkp' => '',
|
||
'strMobile' => '(?:([34])([0-9]{7})|([6])([0-9]{8}))'
|
||
)
|
||
);
|
||
|
||
$strISOCode = Tools::strtoupper($strArgISOCode);
|
||
if (!array_key_exists($strISOCode, $arrPhoneFormatCountry)) {
|
||
return false;
|
||
}
|
||
|
||
// Check allowed character.
|
||
if (!Validate::isPhoneNumber($strArgPhoneMobile)) {
|
||
return false;
|
||
}
|
||
|
||
// Get Country Data.
|
||
$arrPhoneFormat = $arrPhoneFormatCountry[ $strISOCode ];
|
||
// Cleaning Phone Input.
|
||
$strPhoneMobileClean = preg_replace('/[^+0-9()]/ui', '', $strArgPhoneMobile);
|
||
// Root.
|
||
$strRoot = '(?:(?:(?:\+|00)'.$arrPhoneFormat['strCoutryCode']
|
||
.'(?:\('.$arrPhoneFormat['strTrunkp'].'\))?)|'.$arrPhoneFormat['strTrunkp'].')';
|
||
|
||
if (preg_match('/^'.$strRoot.'('.$arrPhoneFormat['strMobile'].')$/ui', $strPhoneMobileClean, $matches)) {
|
||
$strPhoneMobileID = $arrPhoneFormat['strTrunkp'].$matches[1];
|
||
$strPhoneMobileIDLength = Tools::strlen($strPhoneMobileID);
|
||
|
||
if ($strPhoneMobileIDLength < 1 || $strPhoneMobileIDLength > 63) {
|
||
return false;
|
||
}
|
||
|
||
return $strPhoneMobileID;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* Create a new directory with default index.php file.
|
||
* Don't do log here.
|
||
*
|
||
* @param array $arrArgDirectoryList an array of directories.
|
||
*
|
||
* @return bool
|
||
*/
|
||
public static function makeDirectory($arrArgDirectoryList, $strRoot = '')
|
||
{
|
||
$strIndexFileContent = <<<PHP
|
||
<?php
|
||
/**
|
||
* TNT OFFICIAL MODULE FOR PRESTASHOP.
|
||
*
|
||
* @author GFI Informatique <www.gfi.world>
|
||
* @copyright 2016-2019 GFI Informatique, 2016-2019 TNT
|
||
* @license https://opensource.org/licenses/MIT MIT License
|
||
*/
|
||
|
||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
|
||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||
header("Cache-Control: post-check=0, pre-check=0", false);
|
||
header("Pragma: no-cache");
|
||
header("Location: ../");
|
||
exit;
|
||
PHP;
|
||
|
||
$arrDirectoryList = (array)$arrArgDirectoryList;
|
||
|
||
foreach ($arrDirectoryList as $strDirectory) {
|
||
// If directory do not exist, create it.
|
||
$boolSuccess = true;
|
||
|
||
if (!is_string($strDirectory)) {
|
||
continue;
|
||
}
|
||
|
||
// If directory do not exist, create it.
|
||
if (!is_dir($strRoot.$strDirectory)) {
|
||
$intUMask = umask(0);
|
||
$boolSuccess = mkdir($strRoot.$strDirectory, 0770, true) && $boolSuccess;
|
||
umask($intUMask);
|
||
|
||
if (!$boolSuccess) {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
$strFileName = $strRoot.$strDirectory.'index.php';
|
||
// If index file does not exist, create it.
|
||
if (!file_exists($strFileName)) {
|
||
touch($strFileName);
|
||
chmod($strFileName, 0660);
|
||
|
||
$rscFile = fopen($strFileName, 'w');
|
||
if ($rscFile === false) {
|
||
return false;
|
||
}
|
||
fwrite($rscFile, $strIndexFileContent);
|
||
fclose($rscFile);
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Remove a list of files or directories.
|
||
*
|
||
* @param $strModuleDirSrc
|
||
* @param array $arrRemoveFileList
|
||
* @param array $arrRemoveDirList
|
||
*
|
||
* @return bool
|
||
*/
|
||
public static function removeFiles($strModuleDirSrc, $arrRemoveFileList = array(), $arrRemoveDirList = array())
|
||
{
|
||
foreach ($arrRemoveFileList as $strFile) {
|
||
$strFQFile = $strModuleDirSrc.$strFile;
|
||
|
||
try {
|
||
// Delete file if exist.
|
||
if (file_exists($strFQFile)) {
|
||
Tools::deleteFile($strFQFile);
|
||
}
|
||
} catch (Exception $objException) {
|
||
TNTOfficiel_Logger::logException($objException);
|
||
|
||
return false;
|
||
}
|
||
}
|
||
|
||
foreach ($arrRemoveDirList as $strDir) {
|
||
$strFQDir = $strModuleDirSrc.$strDir;
|
||
|
||
try {
|
||
// Delete dir if exist.
|
||
if (file_exists($strFQDir)) {
|
||
Tools::deleteDirectory($strFQDir);
|
||
}
|
||
} catch (Exception $objException) {
|
||
TNTOfficiel_Logger::logException($objException);
|
||
|
||
return false;
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Split a string un array of strings with a maximum of chars.
|
||
* @param string $strArgSubject
|
||
* @param int $intArgLength
|
||
*
|
||
* @return array
|
||
*/
|
||
public static function strSplitter($strArgSubject, $intArgLength = 32)
|
||
{
|
||
$intLength = (int)$intArgLength;
|
||
$strSubject = trim((string)$strArgSubject);
|
||
|
||
if (!($intLength > 0) || Tools::strlen($strSubject) <= $intLength) {
|
||
return array(
|
||
$strSubject
|
||
);
|
||
}
|
||
|
||
$arrResult = array();
|
||
|
||
while (Tools::strlen($strSubject) > 0) {
|
||
$rxpSplitter = '/^\s*+([^\n]{0,'.$intLength.'})(:?\s+([^\n]*?))?\s*$/ui';
|
||
if (preg_match($rxpSplitter, $strSubject, $arrBackRefList) === 1) {
|
||
// warp line.
|
||
$arrResult[] = $arrBackRefList[1];
|
||
if (array_key_exists(3, $arrBackRefList)){
|
||
$strSubject = $arrBackRefList[3];
|
||
} else {
|
||
$strSubject = '';
|
||
}
|
||
} else {
|
||
// cut word.
|
||
$arrResult[] = Tools::substr($strSubject, 0, $intLength);
|
||
$strSubject = Tools::substr($strSubject, $intLength);
|
||
}
|
||
|
||
}
|
||
|
||
return $arrResult;
|
||
}
|
||
|
||
/**
|
||
* Convert input string for compatibility with webservice.
|
||
* Input:
|
||
* a-z0-9àâäéèêëîïôöùûüñ²&"#'{}()[]|_\/ç^@°=+-£$¤%µ*<>?,.;:§!
|
||
* Â’€ê^²ç#~&まa-z0-9âéïùñ
|
||
* `²'|"/°-£¤µ*,.;:§()[]
|
||
* Output:
|
||
* a-z0-9aaaeeeeiioouuun²&"#'{}()[]|_\/c^@°=+-£$¤%µ*<>?,.;:§! A'Ee^²c#-&maa-z0-9aeiun '²'|"/°-£¤µ*,.;:§()[]
|
||
*
|
||
* @param $strArgInput
|
||
* @return mixed
|
||
*/
|
||
public static function translitASCII($strArgInput, $intLength = 0)
|
||
{
|
||
$strRegExp = <<<'SQL'
|
||
/[^a-z0-9àâäéèêëîïôöùûüñ£$¤%µ*<>?,.;:§!²&"#'|_\\\/ç^@°=+{}()[\]\-]++/ui
|
||
SQL;
|
||
|
||
$strNoControlChars = preg_replace('/[\p{Cn}]++/u', '?', $strArgInput);
|
||
|
||
// PHP 7+
|
||
$boolExistTransliterator = function_exists('transliterator_transliterate');
|
||
if ($boolExistTransliterator) {
|
||
$stASCII = transliterator_transliterate('Any-Latin; Latin-ASCII;', $strNoControlChars);
|
||
} else {
|
||
$arrRegExTranslitMap = array (
|
||
'/[ ]/u' => ' ',
|
||
'/[©]/u' => '(C)',
|
||
'/[«≪]/u' => '<<',
|
||
'/[˗‐‑‒–—―−﹘﹣-]/u' => '-',
|
||
'/[®]/u' => '(R)',
|
||
'/[»≫]/u' => '>>',
|
||
'/[¼]/u' => ' 1/4',
|
||
'/[½]/u' => ' 1/2',
|
||
'/[¾]/u' => ' 3/4',
|
||
'/[ÀÁÂÃÄÅĀĂĄǍǞǠǺȀȂȦȺΆΑḀẠẢẤẦẨẪẬẮẰẲẴẶÅA]/u' => 'A',
|
||
'/[ÆǢǼ]/u' => 'AE',
|
||
'/[ÇĆĈĊČƇȻḈℂℭⅭC]/u' => 'C',
|
||
'/[ÈÉÊËĒĔĖĘĚƐȄȆȨɆΈΉΕΗḔḖḘḚḜẸẺẼẾỀỂỄỆℰE]/u' => 'E',
|
||
'/[ÌÍÎÏĨĪĬĮİƖƗǏȈȊɪΊΙΪḬḮỈỊℐℑⅠI]/u' => 'I',
|
||
'/[ÐĎĐƉƊƋΔḊḌḎḐḒⅅⅮD]/u' => 'D',
|
||
'/[ÑŃŅŇŊƝǸɴΝṄṆṈṊℕN]/u' => 'N',
|
||
'/[ÒÓÔÕÖØŌŎŐƠǑǪǬǾȌȎȪȬȮȰΌΏΟΩṌṎṐṒỌỎỐỒỔỖỘỚỜỞỠỢΩO]/u' => 'O',
|
||
'/[×⁎﹡*]/u' => '*',
|
||
'/[ÙÚÛÜŨŪŬŮŰŲƯǓǕǗǙǛȔȖɄṲṴṶṸṺỤỦỨỪỬỮỰU]/u' => 'U',
|
||
'/[ÝŶŸƳȲɎʏΎΥΫϒϓϔẎỲỴỶỸỾY]/u' => 'Y',
|
||
'/[ÞΘϴ]/u' => 'TH',
|
||
'/[ß]/u' => 'ss',
|
||
'/[àáâãäåāăąǎǟǡǻȁȃȧάαḁẚạảấầẩẫậắằẳẵặa]/u' => 'a',
|
||
'/[æǣǽ]/u' => 'ae',
|
||
'/[çćĉċčƈȼɕḉⅽc]/u' => 'c',
|
||
'/[èéêëēĕėęěȅȇȩɇɛέήεηϵḕḗḙḛḝẹẻẽếềểễệℯⅇe]/u' => 'e',
|
||
'/[ìíîïĩīĭįıǐȉȋɨͺΐίιϊḭḯỉịℹⅈⅰi]/u' => 'i',
|
||
'/[ðďđƌȡɖɗδḋḍḏḑḓⅆⅾd]/u' => 'd',
|
||
'/[ñńņňŋƞǹȵɲɳνṅṇṉṋn]/u' => 'n',
|
||
'/[òóôõöøōŏőơǒǫǭǿȍȏȫȭȯȱοωόώṍṏṑṓọỏốồổỗộớờởỡợℴo]/u' => 'o',
|
||
'/[÷⁄∕/]/u' => '/',
|
||
'/[ùúûüũūŭůűųưǔǖǘǚǜȕȗʉṳṵṷṹṻụủứừửữựu]/u' => 'u',
|
||
'/[ýÿŷƴȳɏΰυϋύẏẙỳỵỷỹỿy]/u' => 'y',
|
||
'/[þθϑ]/u' => 'th',
|
||
'/[ĜĞĠĢƓǤǦǴɢʛΓḠG]/u' => 'G',
|
||
'/[ĝğġģǥǧǵɠɡγḡℊg]/u' => 'g',
|
||
'/[ĤĦȞʜḢḤḦḨḪℋℍH]/u' => 'H',
|
||
'/[ĥħȟɦɧḣḥḧḩḫẖℎh]/u' => 'h',
|
||
'/[IJ]/u' => 'IJ',
|
||
'/[ij]/u' => 'ij',
|
||
'/[ĴɈJ]/u' => 'J',
|
||
'/[ĵǰȷɉɟʝϳⅉj]/u' => 'j',
|
||
'/[ĶƘǨΚḰḲḴKK]/u' => 'K',
|
||
'/[ķƙǩκϰḱḳḵk]/u' => 'k',
|
||
'/[ĸʠq]/u' => 'q',
|
||
'/[ĹĻĽĿŁȽʟΛḶḸḺḼℒⅬL]/u' => 'L',
|
||
'/[ĺļľŀłƚȴɫɬɭλḷḹḻḽℓⅼl]/u' => 'l',
|
||
'/[ʼn]/u' => '\'n',
|
||
'/[Œɶ]/u' => 'OE',
|
||
'/[œ]/u' => 'oe',
|
||
'/[ŔŖŘȐȒɌʀΡṘṚṜṞℛℜℝR]/u' => 'R',
|
||
'/[ŕŗřȑȓɍɼɽɾρϱṙṛṝṟr]/u' => 'r',
|
||
'/[ŚŜŞŠȘΣϷϹϺṠṢṤṦṨS]/u' => 'S',
|
||
'/[śŝşšſșȿʂςσϲϸϻṡṣṥṧṩẛẜẝs]/u' => 's',
|
||
'/[ŢŤŦƬƮȚȾΤṪṬṮṰT]/u' => 'T',
|
||
'/[ţťŧƫƭțȶʈτṫṭṯṱẗt]/u' => 't',
|
||
'/[ŴẀẂẄẆẈW]/u' => 'W',
|
||
'/[ŵẁẃẅẇẉẘw]/u' => 'w',
|
||
'/[ŹŻŽƵȤΖẐẒẔℤℨZ]/u' => 'Z',
|
||
'/[źżžƶȥɀʐʑζẑẓẕz]/u' => 'z',
|
||
'/[ƀƃɓβϐḃḅḇb]/u' => 'b',
|
||
'/[ƁƂɃʙΒḂḄḆℬB]/u' => 'B',
|
||
'/[ƑḞℱF]/u' => 'F',
|
||
'/[ƒḟf]/u' => 'f',
|
||
'/[ƕ]/u' => 'hv',
|
||
'/[Ƣ]/u' => 'OI',
|
||
'/[ƣ]/u' => 'oi',
|
||
'/[ƤΠṔṖℙP]/u' => 'P',
|
||
'/[ƥπϖṕṗp]/u' => 'p',
|
||
'/[ƲṼṾỼⅤV]/u' => 'V',
|
||
'/[DŽDZ]/u' => 'DZ',
|
||
'/[DžDz]/u' => 'Dz',
|
||
'/[dždzʣʥ]/u' => 'dz',
|
||
'/[LJ]/u' => 'LJ',
|
||
'/[Lj]/u' => 'Lj',
|
||
'/[lj]/u' => 'lj',
|
||
'/[NJ]/u' => 'NJ',
|
||
'/[Nj]/u' => 'Nj',
|
||
'/[nj]/u' => 'nj',
|
||
'/[Ǯ]/u' => 'Ʒ',
|
||
'/[ǯ]/u' => 'ʒ',
|
||
'/[ȸ]/u' => 'db',
|
||
'/[ȹ]/u' => 'qp',
|
||
'/[ɱμḿṁṃⅿm]/u' => 'm',
|
||
'/[ʋṽṿỽⅴv]/u' => 'v',
|
||
'/[ʦ]/u' => 'ts',
|
||
'/[ʪ]/u' => 'ls',
|
||
'/[ʫ]/u' => 'lz',
|
||
'/[ʹʻʼʽˈʹ‘’‛′']/u' => '\'',
|
||
'/[ʺ“”‟″"]/u' => '"',
|
||
'/[˂‹﹤<]/u' => '<',
|
||
'/[˃›﹥>]/u' => '>',
|
||
'/[˄ˆ^]/u' => '^',
|
||
'/[ˋ`]/u' => '`',
|
||
'/[ː﹕:]/u' => ':',
|
||
'/[˖﹢+]/u' => '+',
|
||
'/[˜~]/u' => '~',
|
||
'/[̀]/u' => '̀',
|
||
'/[́]/u' => '́',
|
||
'/[̓]/u' => '̓',
|
||
'/[̈́]/u' => '̈́',
|
||
'/[;﹔;]/u' => ';',
|
||
'/[·]/u' => '·',
|
||
'/[ΜḾṀṂℳⅯM]/u' => 'M',
|
||
'/[ΞẊẌⅩX]/u' => 'X',
|
||
'/[Φ]/u' => 'PH',
|
||
'/[Χ]/u' => 'CH',
|
||
'/[Ψ]/u' => 'PS',
|
||
'/[ξẋẍℌⅹx]/u' => 'x',
|
||
'/[φϕ]/u' => 'ph',
|
||
'/[χ]/u' => 'ch',
|
||
'/[ψ]/u' => 'ps',
|
||
'/[ẞ]/u' => 'SS',
|
||
'/[Ỻ]/u' => 'LL',
|
||
'/[ỻ]/u' => 'll',
|
||
'/[‖∥]/u' => '||',
|
||
'/[‚﹐﹑,]/u' => ',',
|
||
'/[„]/u' => ',,',
|
||
'/[․﹒.]/u' => '.',
|
||
'/[‥]/u' => '..',
|
||
'/[…]/u' => '...',
|
||
'/[‼]/u' => '!!',
|
||
'/[⁅﹝[]/u' => '[',
|
||
'/[⁆﹞]]/u' => ']',
|
||
'/[⁇]/u' => '??',
|
||
'/[⁈]/u' => '?!',
|
||
'/[⁉]/u' => '!?',
|
||
'/[₠]/u' => 'CE',
|
||
'/[₢]/u' => 'Cr',
|
||
'/[₣]/u' => 'Fr.',
|
||
'/[₤]/u' => 'L.',
|
||
'/[₧]/u' => 'Pts',
|
||
'/[₹]/u' => 'Rs',
|
||
'/[₺]/u' => 'TL',
|
||
'/[℀]/u' => 'a/c',
|
||
'/[℁]/u' => 'a/s',
|
||
'/[℅]/u' => 'c/o',
|
||
'/[℆]/u' => 'c/u',
|
||
'/[№]/u' => 'No',
|
||
'/[ℚQ]/u' => 'Q',
|
||
'/[℞]/u' => 'Rx',
|
||
'/[℡]/u' => 'TEL',
|
||
'/[℻]/u' => 'FAX',
|
||
'/[⅓]/u' => ' 1/3',
|
||
'/[⅔]/u' => ' 2/3',
|
||
'/[⅕]/u' => ' 1/5',
|
||
'/[⅖]/u' => ' 2/5',
|
||
'/[⅗]/u' => ' 3/5',
|
||
'/[⅘]/u' => ' 4/5',
|
||
'/[⅙]/u' => ' 1/6',
|
||
'/[⅚]/u' => ' 5/6',
|
||
'/[⅛]/u' => ' 1/8',
|
||
'/[⅜]/u' => ' 3/8',
|
||
'/[⅝]/u' => ' 5/8',
|
||
'/[⅞]/u' => ' 7/8',
|
||
'/[⅟]/u' => ' 1/',
|
||
'/[Ⅱ]/u' => 'II',
|
||
'/[Ⅲ]/u' => 'III',
|
||
'/[Ⅳ]/u' => 'IV',
|
||
'/[Ⅵ]/u' => 'VI',
|
||
'/[Ⅶ]/u' => 'VII',
|
||
'/[Ⅷ]/u' => 'VIII',
|
||
'/[Ⅸ]/u' => 'IX',
|
||
'/[Ⅺ]/u' => 'XI',
|
||
'/[Ⅻ]/u' => 'XII',
|
||
'/[ⅱ]/u' => 'ii',
|
||
'/[ⅲ]/u' => 'iii',
|
||
'/[ⅳ]/u' => 'iv',
|
||
'/[ⅵ]/u' => 'vi',
|
||
'/[ⅶ]/u' => 'vii',
|
||
'/[ⅷ]/u' => 'viii',
|
||
'/[ⅸ]/u' => 'ix',
|
||
'/[ⅺ]/u' => 'xi',
|
||
'/[ⅻ]/u' => 'xii',
|
||
'/[∖﹨\]/u' => '\\',
|
||
'/[∣|]/u' => '|',
|
||
'/[﹖?]/u' => '?',
|
||
'/[﹗!]/u' => '!',
|
||
'/[﹙(]/u' => '(',
|
||
'/[﹚)]/u' => ')',
|
||
'/[﹛{]/u' => '{',
|
||
'/[﹜}]/u' => '}',
|
||
'/[﹟#]/u' => '#',
|
||
'/[﹠&]/u' => '&',
|
||
'/[﹦=]/u' => '=',
|
||
'/[﹩$]/u' => '$',
|
||
'/[﹪%]/u' => '%',
|
||
'/[﹫@]/u' => '@',
|
||
'/[0]/u' => '0',
|
||
'/[1]/u' => '1',
|
||
'/[2]/u' => '2',
|
||
'/[3]/u' => '3',
|
||
'/[4]/u' => '4',
|
||
'/[5]/u' => '5',
|
||
'/[6]/u' => '6',
|
||
'/[7]/u' => '7',
|
||
'/[8]/u' => '8',
|
||
'/[9]/u' => '9',
|
||
'/[_]/u' => '_',
|
||
'/[⦅]/u' => '((',
|
||
'/[⦆]/u' => '))',
|
||
);
|
||
|
||
$stASCII = preg_replace(array_keys($arrRegExTranslitMap), $arrRegExTranslitMap, $strNoControlChars);
|
||
}
|
||
|
||
$arrRegExMap = array(
|
||
'/[~]/u' => '-',
|
||
'/[’`]/u' => '\'',
|
||
'/[€]/u' => 'E'
|
||
);
|
||
|
||
$stASCIICompat = preg_replace(array_keys($arrRegExMap), $arrRegExMap, $stASCII);
|
||
|
||
$stASCIIFilter = preg_replace($strRegExp, ' ', $stASCIICompat);
|
||
$stASCIIFilterTrim = trim($stASCIIFilter);
|
||
|
||
$stASCIIFilterFinal = $stASCIIFilterTrim;
|
||
if ($intLength > 0) {
|
||
$stASCIIFilterFinal = Tools::substr($stASCIIFilterTrim, 0, $intLength);
|
||
}
|
||
|
||
return $stASCIIFilterFinal;
|
||
}
|
||
|
||
/**
|
||
* @param $strArgValue
|
||
* @return string
|
||
*/
|
||
public static function encodeBase64($strArgValue)
|
||
{
|
||
return (string)base64_encode($strArgValue);
|
||
}
|
||
|
||
/**
|
||
* @param $strArgValue
|
||
* @return string
|
||
*/
|
||
public static function decodeBase64($strArgValue)
|
||
{
|
||
return (string)base64_decode($strArgValue);
|
||
}
|
||
|
||
/**
|
||
* @param $strArgInflateValue
|
||
* @return string
|
||
*/
|
||
public static function deflate($strArgInflateValue)
|
||
{
|
||
return (string)base64_encode(gzdeflate($strArgInflateValue));
|
||
}
|
||
/**
|
||
* @param $strArgDeflateValue
|
||
* @return string
|
||
*/
|
||
public static function inflate($strArgDeflateValue)
|
||
{
|
||
return (string)gzinflate(base64_decode($strArgDeflateValue));
|
||
}
|
||
|
||
/**
|
||
* Donwload an existing file or content.
|
||
*
|
||
* @param string $strFileLocation
|
||
* @param string|null $strContent
|
||
* @param string $strContentType
|
||
*
|
||
* @return bool false if error.
|
||
*/
|
||
public static function download($strFileLocation, $strContent = null, $strContentType = 'application/octet-stream')
|
||
{
|
||
// File location must be a string.
|
||
if (!is_string($strFileLocation)) {
|
||
return false;
|
||
}
|
||
// If content, must be a string.
|
||
if ($strContent !== null && !is_string($strContent)) {
|
||
return false;
|
||
}
|
||
// If no content, file must exist.
|
||
if ($strContent === null && !file_exists($strFileLocation)) {
|
||
return false;
|
||
}
|
||
|
||
// End output buffer.
|
||
if (ob_get_length() > 0) {
|
||
ob_end_clean();
|
||
}
|
||
// Set header.
|
||
ob_start();
|
||
header('Pragma: public');
|
||
header('Expires: 0');
|
||
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
|
||
header('Cache-Control: public');
|
||
header('Content-Description: File Transfer');
|
||
header('Content-type: '.$strContentType);
|
||
header('Content-Disposition: attachment; filename="'.basename($strFileLocation).'"');
|
||
header('Content-Transfer-Encoding: binary');
|
||
ob_end_flush();
|
||
|
||
// Output content.
|
||
if ($strContent !== null) {
|
||
echo $strContent;
|
||
} else {
|
||
readfile($strFileLocation);
|
||
}
|
||
|
||
// We want to be sure that download content is the last thing this controller will do.
|
||
exit;
|
||
}
|
||
|
||
/**
|
||
* @param $strArgURL
|
||
* @param null $arrArgOptions
|
||
*
|
||
* @return array
|
||
*
|
||
* @throws Exception
|
||
*/
|
||
public static function cURLRequest($strArgURL, $arrArgOptions = null)
|
||
{
|
||
TNTOfficiel_Logstack::log();
|
||
|
||
// Check extension.
|
||
if (!extension_loaded('curl')) {
|
||
throw new Exception(sprintf('PHP cURL extension is required'));
|
||
}
|
||
|
||
$strURL = trim($strArgURL);
|
||
|
||
$arrResult = array(
|
||
'options' => array(
|
||
// Check server certificate's name against host.
|
||
// 0: disable, 2: enable.
|
||
CURLOPT_SSL_VERIFYHOST => 0,
|
||
// Check server peer's certificate authenticity through certification authority (CA) for SSL/TLS.
|
||
CURLOPT_SSL_VERIFYPEER => true,
|
||
// Path to Certificate Authority (CA) bundle.
|
||
// https://curl.haxx.se/docs/caextract.html
|
||
// https://curl.haxx.se/ca/cacert.pem
|
||
CURLOPT_CAINFO => _PS_CACHE_CA_CERT_FILE_,
|
||
// Start a new cookie session (ignore all previous cookies session)
|
||
CURLOPT_COOKIESESSION => true,
|
||
// Follow HTTP 3xx redirects.
|
||
CURLOPT_FOLLOWLOCATION => true,
|
||
// Max redirects allowed.
|
||
CURLOPT_MAXREDIRS => 8,
|
||
// curl_exec return response string instead of true (no direct output).
|
||
CURLOPT_RETURNTRANSFER => true,
|
||
// Include response header in output.
|
||
//CURLOPT_HEADER => false,
|
||
// Include request header ?
|
||
//CURLINFO_HEADER_OUT => false,
|
||
// HTTP code >= 400 considered as error. Use curl_error (curl_exec return false ?).
|
||
//CURLOPT_FAILONERROR => true,
|
||
// Proxy.
|
||
//CURLOPT_PROXY => $strProxy
|
||
//CURLOPT_PROXYUSERPWD => 'user:password',
|
||
//CURLOPT_PROXYAUTH => 1,
|
||
//CURLOPT_PROXYPORT => 80,
|
||
//CURLOPT_PROXYTYPE => CURLPROXY_HTTP,
|
||
// Timeout for connection to the server.
|
||
CURLOPT_CONNECTTIMEOUT => TNTOfficiel::REQUEST_CONNECTTIMEOUT,
|
||
// Timeout global.
|
||
CURLOPT_TIMEOUT => TNTOfficiel::REQUEST_TIMEOUT
|
||
)
|
||
);
|
||
|
||
if (is_array($arrArgOptions)) {
|
||
$arrResult['options'] = $arrArgOptions + $arrResult['options'];
|
||
}
|
||
|
||
$rscCURLHandler = curl_init();
|
||
|
||
foreach ($arrResult['options'] as $intCURLConst => $mxdValue) {
|
||
// May warn if open_basedir or deprecated safe_mode set.
|
||
if ((ini_get('safe_mode') || ini_get('open_basedir'))
|
||
&& $intCURLConst === CURLOPT_FOLLOWLOCATION
|
||
) {
|
||
continue;
|
||
}
|
||
curl_setopt($rscCURLHandler, $intCURLConst, $mxdValue);
|
||
}
|
||
|
||
curl_setopt($rscCURLHandler, CURLOPT_URL, $strURL);
|
||
|
||
// curl_exec return false on error.
|
||
$arrResult['response'] = curl_exec($rscCURLHandler);
|
||
$arrResult['info'] = curl_getinfo($rscCURLHandler);
|
||
$arrResult['error'] = curl_error($rscCURLHandler);
|
||
|
||
curl_close($rscCURLHandler);
|
||
|
||
return $arrResult;
|
||
}
|
||
} |