Допустим, вы хотите создать файл конфигурации базы данных. Вот как я это делаю:
Создайте «фиктивный» файл конфигурации, скопировав реальный, и используйте значения, которые выглядят примерно так:
$db['default']['hostname'] = '__HOSTNAME__';
$db['default']['username'] = '__USERNAME__';
$db['default']['password'] = '__PASSWORD__';
$db['default']['database'] = '__DATABASE__';
Попросите пользователя заполнить форму установки и проверить все данные, протестировав соединение с базой данных. Затем, используйте file_get_contents()
, чтобы получить содержимое файла конфигурации "dummy", используйте простой str_replace()
, чтобы переписать значения с теми, которые предоставил пользователь, а затем записать новое содержимое в ваш реальный файл конфигурации, перезаписав все это.
Вот часть реального кода, который я использую для создания файла, просто чтобы понять. Имейте в виду, что я запускаю это на совершенно отдельной установке CI («установщик»), и это не пример копирования / вставки:
// Write the database configuration file
$config = array(
'hostname',
'username',
'password',
'database',
);
$data = file_get_contents(APPPATH.'config/dummy_database.php');
$file = '../private/config/database.php';
// Oops! Just caught this after posting: str_replace() accepts arrays.
// TODO: Use the array method instead of a loop!
foreach ($config as $item)
{
$data = str_replace('____'.strtoupper($item).'____', mysql_escape_string($this->data[$item]), $data);
}
if (write_file($file, $data))
{
$this->message('Database configuration file was written!', 'success');
@chmod($file, 0644);
{
if (is_really_writable($file))
{
$this->message('The database configuration is still writable, make sure to set permissions to <code>0644</code>!', 'notice');
}
}
}
else
{
$this->message('Could not write the database configuration file!');
redirect('step_4');
}
При этом сохраняется оригинальная копия "фиктивного" файла конфигурации. Вы можете использовать ту же логику для редактирования, просто прочитать текущие значения конфигурации для всего, что пользователь не изменил, и выполнить ту же технику замены строк.