<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<sect1 id="zend.config.writer.introduction">
    <title>Zend_Config_Writer</title>
    <para>
        <classname>Zend_Config_Writer</classname> позволяет создавать конфигурационные
        файлы из объектов <classname>Zend_Config</classname>.
        Он работает и без использования адаптеров и, таким образом, очень прост
        в использовании.
        По умолчанию <classname>Zend_Config_Writer</classname> поставляется с тремя
        адаптерами, которые используются одинаково. Вы инстанцируете класс для
        записи с опциями, которыми могут быть <emphasis>filename</emphasis>
        (имя файла) и <emphasis>config</emphasis> (конфигурационные данные).
        Затем вы вызываете метод <methodname>write()</methodname> объекта, и он
        создает конфигурационный файл. Вы можете также передавать
        <varname>$filename</varname> и <varname>$config</varname> непосредственно
        методу <methodname>write()</methodname>. В настоящее время вместе с
        <classname>Zend_Config_Writer</classname> поставляются следующие адаптеры:
    </para>

    <itemizedlist>
        <listitem>
            <para>
                <classname>Zend_Config_Writer_Array</classname>
            </para>
        </listitem>
        <listitem>
            <para>
                <classname>Zend_Config_Writer_Ini</classname>
            </para>
        </listitem>
        <listitem>
            <para>
                <classname>Zend_Config_Writer_Xml</classname>
            </para>
        </listitem>
    </itemizedlist>

    <para>
        В качестве исключения <classname>Zend_Config_Writer_Ini</classname> имеет
        еще один опциональный параметр <emphasis>nestSeparator</emphasis>, через
        который указывается символ-разделитель для узлов.
        По умолчанию это точка, как и в <classname>Zend_Config_Ini</classname>.
    </para>

    <para>
        При изменении или создании объекта <classname>Zend_Config</classname>
        следует знать следующее.
        Для того, чтобы создать или изменить значение, устанавливайте
        параметр объекта <classname>Zend_Config</classname> через аксессор
        (<emphasis>-&gt;</emphasis>). Для того, чтобы создать раздел в корне или
        ветку, создавайте новый массив
        ("<command>$config-&gt;branch = array()</command>"). Для того, чтобы
        указать, от какого раздела наследует другой, вызывайте метод
        <methodname>setExtend()</methodname> в корне объекта
        <classname>Zend_Config</classname>.
    </para>

    <example id="zend.config.writer.example.using">
        <title>Использование Zend_Config_Writer</title>
        <para>
            Этот пример демонстрирует использование
            <classname>Zend_Config_Writer_Xml</classname> для создания нового
            конфигурационного файла:
        </para>
        <programlisting language="php"><![CDATA[
// Создание объекта конфигурации
$config = new Zend_Config(array(), true);
$config->production = array();
$config->staging    = array();

$config->setExtend('staging', 'production');

$config->production->db = array();
$config->production->db->hostname = 'localhost';
$config->production->db->username = 'production';

$config->staging->db = array();
$config->staging->db->username = 'staging';

// Вы можете записать конфигурационный файл одним из следующих способов:
// а)
$writer = new Zend_Config_Writer_Xml(array('config'   => $config,
                                           'filename' => 'config.xml'));
$writer->write();

// б)
$writer = new Zend_Config_Writer_Xml();
$writer->setConfig($config)
       ->setFilename('config.xml')
       ->write();

// в)
$writer = new Zend_Config_Writer_Xml();
$writer->write('config.xml', $config);
]]></programlisting>
        <para>
            В этом примере создается конфигурационный
            <acronym>XML</acronym>-файл с "промежуточным" (staging) и
            "производственным" (production) разделами, в котором первый
            раздел наследует от второго.
        </para>
    </example>

    <example id="zend.config.writer.modifying">
        <title>Изменение существующего конфигурационного файла</title>
        <para>
            Этот пример демонстрирует редактирование существующего
            конфигурационного файла.
        </para>
        <programlisting language="php"><![CDATA[
// Загрузка всех разделов из существующего конфигурационного файла с
// пропуском "расширений"
$config = new Zend_Config_Ini('config.ini',
                              null,
                              array('skipExtends'        => true,
                                    'allowModifications' => true));

// Изменение значения
$config->production->hostname = 'foobar';

// Сохранение
$writer = new Zend_Config_Writer_Ini(array('config'   => $config,
                                           'filename' => 'config.ini'));
$writer->write();
]]></programlisting>
    </example>

    <note>
        <title>Загрузка конфигурационного файла</title>
        <para>
            При загрузке существующего файла для последующих изменений
            важно загрузить все
            разделы с пропуском расширений с тем, чтобы значения не
            объединялись. Это достигается путем передачи опции
            <emphasis>skipExtends</emphasis> конструктору.
        </para>
    </note>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
