1

我正在尝试使用 CodeIgniter 构建一个小型 CMS,并且我需要能够动态更新 application/config.php 中的一些变量

到目前为止,我做了:

private function update_file ($file, $var, $var_name) {
    $start_tag = "<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\n";
    if (file_exists($file)) {
        require_once ($file);
        $updated_array = array_merge($$var_name, $var);         
        $data = $start_tag."\$".$var_name." = ".var_export($updated_array, true).";";
        file_put_contents($file, $data);
    } else {
        return false;
    }
}

一切正常!config.php 文件中的结果将是:

<?php ...;
$config = array (
'base_url' => '',
...
...
);

但是,如果我想使用注释、空格和
分隔声明的 $config['key'] = 'value' ... 来维护原始 config.php 文件格式怎么办?

那可能吗 ?


编辑:

谢谢你的回答,非常珍贵。我找到了一个稍微不同的解决方案来满足我的需求,在 file_get_contents() 返回时执行 preg_replace,然后在文件上写回新的结果字符串。文件保持准确的原始干净格式。

private function update_file ($file, $var, $var_name) {
    if (file_exists($file)) {
        require_once ($file);

        $contents = file_get_contents($file);
        $updated_array = array_merge($$var_name, $var);
        $search = array();
        $replace = array();

        foreach($$var_name as $key => $val) {
            $pattern = '/\$'.$var_name.'\[\\\''.$key.'\\\'\]\s+=\s+[^\;]+/';
            $replace_string = "\$".$var_name."['".$key."'] = ".var_export($updated_array[$key], true);      
            array_push($search, $pattern);
            array_push($replace, $replace_string);
        }

        $new_contents = preg_replace($search, $replace, $contents);
        write_file($file, $new_contents);
}

也许它需要一些轻微的性能改进。但这是我的基本想法。

4

2 回答 2

1

创建具有空值的键

$config['base_url'] = '';

然后将它们设置在您的任何控制器中。如果您将值存储在 db 中,并在 MY_Controller 中对其进行初始化,则此方法效果最佳。

$this->config->set_item('base_url', 'value');
于 2012-05-01T21:53:55.743 回答
0

有可能的。我找不到代码,但是一旦我写了类似的东西。整个想法是基于标记模板文件和替换数组中的值,保留模板中的键顺序、行号和注释。

[+] 找到了。它的目的是从看起来像这样的模板中填充值(当然它要大得多):

<?php

$_CFG = array(

    // DB section
    'db_host' => 'localhost',
    'db_user' => 'root',
    'db_pass' => '',
    'db_name' => 'test',

    // Site specific
    'lang' => array('pl','en'),
    'admin' => 'admin@example.com',
);

以及发挥所有魔力的代码:

$tokens = token_get_all(file_get_contents('tpl/config.php'));

$level = -1;
$buffer = '';
$last_key = 0;
$iteration = 0;

foreach($tokens as $t){
    if($t === ')'){
        $iteration = 0;
        $last_key = 0;
        $level--;
    }

    if(is_array($t)){
        if($t[0] == T_ARRAY && strtolower($t[1]) === 'array')
            $level++;

        if($t[0] == T_CONSTANT_ENCAPSED_STRING){
            if($last_key){
                if($level){
                    if(isset($new_config[$last_key][$iteration])){
                        $buffer .= var_export($new_config[$last_key][$iteration], TRUE);
                    }
                    else
                        $buffer .= 'null';

                    $iteration++;
                }
                else{
                    if(isset($new_config[$last_key]))
                        $buffer .= var_export($new_config[$last_key], TRUE);
                    else
                        $buffer .= 'null';

                    $last_key = 0;
                }
            }
            else{
                $buffer .= $t[1];
                $last_key = trim($t[1],"'");
            }
        }
        else
            $buffer .= $t[1];
    }
    else
        $buffer .= $t;
}

file_put_contents('config.php',$buffer);
于 2012-05-01T21:31:59.417 回答