对于应用程序,我想创建某种设置步骤。在其中一个步骤中,数据库配置将写入application.ini文件。这一切都有效,但发生了一些非常奇怪的事情:目录的所有路径(库,布局......)都是用带有APPLICATION_PATH的路径改变的。到完整的路径。可以想象,这不是非常系统友好的。知道如何防止这种情况吗?
我使用以下代码更新application.ini:
# read existing configuration
$config = new Zend_Config_Ini(
$location,
null,
array('skipExtends' => true,
'allowModifications' => true));
# add new values
$config->production->doctrine->connection = array();
$config->production->doctrine->connection->host = $data['server'];
$config->production->doctrine->connection->user = $data['username'];
$config->production->doctrine->connection->password = $data['password'];
$config->production->doctrine->connection->database = $data['database'];
# write new configuration
$writer = new Zend_Config_Writer_Ini(
array(
'config' => $config,
'filename' => $location));
$writer->write();
答案 0 :(得分:1)
由于Zend_Config_Ini使用默认的ini扫描模式(INI_SCANNER_NORMAL),它将解析所有选项并用它们各自的值替换常量。您可以做的是使用INI_SCANNER_RAW模式直接调用parse_ini_file,因此不会解析选项。
即。使用
$config = parse_ini_file('/path/to/your.ini', TRUE, INI_SCANNER_RAW);
您将获得一个可以根据需要进行操作的关联数组,之后您可以使用以下代码段(从注释中)将其写回:
function write_ini_file($assoc_arr, $path, $has_sections=FALSE) {
$content = "";
if ($has_sections) {
foreach ($assoc_arr as $key=>$elem) {
$content .= "[".$key."]\n";
foreach ($elem as $key2=>$elem2) {
if(is_array($elem2))
{
for($i=0;$i<count($elem2);$i++)
{
$content .= $key2."[] = ".$elem2[$i]."\n";
}
}
else if($elem2=="") $content .= $key2." = \n";
else $content .= $key2." = ".$elem2."\n";
}
}
}
else {
foreach ($assoc_arr as $key=>$elem) {
if(is_array($elem))
{
for($i=0;$i<count($elem);$i++)
{
$content .= $key2."[] = ".$elem[$i]."\n";
}
}
else if($elem=="") $content .= $key2." = \n";
else $content .= $key2." = ".$elem."\n";
}
}
if (!$handle = fopen($path, 'w')) {
return false;
}
if (!fwrite($handle, $content)) {
return false;
}
fclose($handle);
return true;
}
即。称之为:
write_ini_file($config, '/path/to/your.ini', TRUE);
操作$ config数组后。只需确保在需要的地方为选项值添加双引号......
或者替代使用 - 而不是使用该函数 - 您可以尝试使用Zend_Config_Writer_Ini将其写回来,将数组转换回Zend_Config对象后,我想这应该也可以...
答案 1 :(得分:0)
我猜您可以迭代这些值,检查APPLICATION_PATH
的值之间的匹配,并将其替换为字符串 literal {{ 1}}。
如果您知道APPLICATION_PATH
包含字符串APPLICATION_PATH
并且您找到配置值'/home/david/apps/myapp/application'
,那么您可以替换前导字符串'/home/david/apps/myapp/application/views/helpers'
使用字符串'/home/david/apps/myapp/application'
,最后是'APPLICATION_PATH'
。
有点像kludge,但这样的东西可能有用。
答案 2 :(得分:0)
这是一个很长的镜头 - 但您是否尝试在Zend_Config_Writer_Ini
常量 定义的情况下运行APPLICATION_PATH
代码?它应该将其解释为文字字符串'APPLICATION_PATH'并且可能有效。