Add inifile support
git-svn-id: https://svn.fournier38.fr/svn/ProgSVN/trunk@2409 bf3deb0d-5f1a-0410-827f-c0cc1f45334c
This commit is contained in:
165
inifile.php
Normal file
165
inifile.php
Normal file
@@ -0,0 +1,165 @@
|
||||
<?php
|
||||
/** DomFramework
|
||||
@package domframework
|
||||
@author Dominique Fournier <dominique@fournier38.fr> */
|
||||
|
||||
/** Manage .ini files like in php.ini
|
||||
Support the sections (or not) */
|
||||
class inifile
|
||||
{
|
||||
/** Return an array with the .ini file content
|
||||
If the sections are true, the sections are analyzed too
|
||||
This function is the same as parse_ini_file PHP internal */
|
||||
public function getFile ($file, $sections=false)
|
||||
{
|
||||
if (! file_exists ($file))
|
||||
throw new \Exception (sprintf (_("File '%s' not found"), $file), 404);
|
||||
if (! is_readable ($file))
|
||||
throw new \Exception (sprintf (_("File '%s' not readable"), $file), 500);
|
||||
$res = parse_ini_file ($file, $sections);
|
||||
// The DomFramework is PHP 5.3 compatible. I need to overwrite the bools and
|
||||
// null values. The INI_SCANNER_TYPED is available as PHP 5.6.1
|
||||
foreach ($res as $key=>$val)
|
||||
{
|
||||
if ($val === "null")
|
||||
$res[$key] = null;
|
||||
elseif ($val === "true")
|
||||
$res[$key] = true;
|
||||
elseif ($val === "false")
|
||||
$res[$key] = false;
|
||||
elseif (is_array ($val))
|
||||
{
|
||||
foreach ($val as $k=>$v)
|
||||
{
|
||||
if ($v === "null")
|
||||
$res[$key][$k] = null;
|
||||
elseif ($v === "true")
|
||||
$res[$key][$k] = true;
|
||||
elseif ($v === "false")
|
||||
$res[$key][$k] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
/** Return an array with the .ini string content
|
||||
If the sections are true, the sections are analyzed too
|
||||
This function is the same as parse_ini_string PHP internal */
|
||||
public function getString ($string, $sections=false)
|
||||
{
|
||||
$res = parse_ini_string ($string, $sections);
|
||||
// The DomFramework is PHP 5.3 compatible. I need to overwrite the bools and
|
||||
// null values. The INI_SCANNER_TYPED is available as PHP 5.6.1
|
||||
foreach ($res as $key=>$val)
|
||||
{
|
||||
if ($val === "null")
|
||||
$res[$key] = null;
|
||||
elseif ($val === "true")
|
||||
$res[$key] = true;
|
||||
elseif ($val === "false")
|
||||
$res[$key] = false;
|
||||
elseif (is_array ($val))
|
||||
{
|
||||
foreach ($val as $k=>$v)
|
||||
{
|
||||
if ($v === "null")
|
||||
$res[$key][$k] = null;
|
||||
elseif ($v === "true")
|
||||
$res[$key][$k] = true;
|
||||
elseif ($v === "false")
|
||||
$res[$key][$k] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
/** Return a string containing a .ini content from the provided array.
|
||||
If the sections are true, define the first child of the array as sections
|
||||
*/
|
||||
public function setString ($array, $sections=false)
|
||||
{
|
||||
if (! is_array ($array))
|
||||
throw new \Exception (
|
||||
_("inifile::setString : provided data is not an array"),
|
||||
500);
|
||||
$content = "";
|
||||
if ($sections !== false)
|
||||
{
|
||||
foreach ($array as $section=>$sub)
|
||||
{
|
||||
if (! is_array ($sub))
|
||||
throw new \Exception (
|
||||
_("inifile::setString : provided data is not an array"),
|
||||
500);
|
||||
$content .= "[$section]\n";
|
||||
foreach ($sub as $key=>$val)
|
||||
{
|
||||
if (is_array ($val))
|
||||
{
|
||||
foreach ($val as $k=>$v)
|
||||
{
|
||||
if (!is_scalar ($v) && ! is_null ($v))
|
||||
throw new \Exception (sprintf (
|
||||
_("Provided value for '%s' is not scalar"),
|
||||
$key), 500);
|
||||
if ($v === null) $v = "null";
|
||||
$content .= $key."[$k] = \"$v\"\n";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($val === null) $val = "null";
|
||||
$content .= "$key = \"$val\"\n";
|
||||
}
|
||||
}
|
||||
$content .= "\n";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach ($array as $key=>$val)
|
||||
{
|
||||
if (is_array ($val))
|
||||
{
|
||||
foreach ($val as $k=>$v)
|
||||
{
|
||||
if (!is_scalar ($v) && ! is_null ($v))
|
||||
throw new \Exception (sprintf (
|
||||
_("Provided value for '%s' is not scalar"),
|
||||
$key), 500);
|
||||
if ($v === null) $v = "null";
|
||||
$content .= $key."[$k] = \"$v\"\n";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($val === null) $val = "null";
|
||||
$content .= "$key = \"$val\"\n";
|
||||
}
|
||||
}
|
||||
$content .= "\n";
|
||||
|
||||
}
|
||||
return $content;
|
||||
}
|
||||
|
||||
/** Save a file containing a .ini content from the provided array.
|
||||
Don't create the directory if it doesn't exists
|
||||
If the sections are true, define the first child of the array as sections
|
||||
*/
|
||||
public function setFile ($file, $array, $sections=false)
|
||||
{
|
||||
$dir = basename ($file);
|
||||
if (! file_exists ($dir) || ! is_readable ($dir) || ! is_writeable ($dir))
|
||||
throw new \Exception (sprintf (
|
||||
_("Directory '%s' available or not readable or not writeable"),
|
||||
$dir), 500);
|
||||
if (file_exists ($file) && ! is_writeable ($file))
|
||||
throw new \Exception (sprintf (_("File '%s' is not writeable"), $file),
|
||||
500);
|
||||
$content = $this->setString ($array, $sections);
|
||||
return file_put_contents ($file, $content);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user