vendor/symfony/src/Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.php
author ymh <ymh.work@gmail.com>
Sat, 24 Sep 2011 15:40:41 +0200
changeset 0 7f95f8617b0b
permissions -rwxr-xr-x
first commit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * This file is part of the Symfony package.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * (c) Fabien Potencier <fabien@symfony.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * For the full copyright and license information, please view the LICENSE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * file that was distributed with this source code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
namespace Symfony\Component\Config\Definition\Builder;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
use Symfony\Component\Config\Definition\ArrayNode;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
use Symfony\Component\Config\Definition\PrototypedArrayNode;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
use Symfony\Component\Config\Definition\NodeInterface;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
 * This class provides a fluent interface for defining an array node.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinitionInterface
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    protected $performDeepMerging;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    protected $ignoreExtraKeys;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    protected $children;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    protected $prototype;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    protected $atLeastOne;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    protected $allowNewKeys;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    protected $key;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    protected $removeKeyItem;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
    protected $addDefaults;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    protected $nodeBuilder;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
     * {@inheritDoc}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    public function __construct($name, NodeParentInterface $parent = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
        parent::__construct($name, $parent);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
        $this->children = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
        $this->addDefaults = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
        $this->allowNewKeys = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
        $this->atLeastOne = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
        $this->allowEmptyValue = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
        $this->performDeepMerging = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
        $this->nullEquivalent = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
        $this->trueEquivalent = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
     * Set a custom children builder
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
     * @param NodeBuilder $builder A custom NodeBuilder
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
    public function setBuilder(NodeBuilder $builder)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        $this->nodeBuilder = $builder;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
     * Returns a builder to add children nodes
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
     * @return NodeBuilder
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
    public function children()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
        return $this->getNodeBuilder();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
     * Sets a prototype for child nodes.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
     * @param string $type the type of node
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
     * @return NodeDefinition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    public function prototype($type)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
        $builder = $this->getNodeBuilder();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
        $this->prototype = $builder->node(null, $type);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
        $this->prototype->parent = $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
        return $this->prototype;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
     * Adds the default value if the node is not set in the configuration.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
     * @return ArrayNodeDefinition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
    public function addDefaultsIfNotSet()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
        $this->addDefaults = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
     * Requires the node to have at least one element.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
     * @return ArrayNodeDefinition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
    public function requiresAtLeastOneElement()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
        $this->atLeastOne = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
     * Disallows adding news keys in a subsequent configuration.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
     * If used all keys have to be defined in the same configuration file.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
     * @return ArrayNodeDefinition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
    public function disallowNewKeysInSubsequentConfigs()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
        $this->allowNewKeys = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
     * Sets a normalization rule for XML configurations.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
     * @param string $singular The key to remap
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
     * @param string $plural   The plural of the key for irregular plurals
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
     * @return ArrayNodeDefinition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
    public function fixXmlConfig($singular, $plural = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
        $this->normalization()->remap($singular, $plural);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
     * Set the attribute which value is to be used as key.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
     * This is useful when you have an indexed array that should be an
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
     * associative array. You can select an item from within the array
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
     * to be the key of the particular item. For example, if "id" is the
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
     * "key", then:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
     *     array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
     *         array('id' => 'my_name', 'foo' => 'bar'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
     *     )
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
     * becomes
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
     *     array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
     *         'my_name' => array('foo' => 'bar'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
     *     )
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
     * If you'd like "'id' => 'my_name'" to still be present in the resulting
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
     * array, then you can set the second argument of this method to false.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
     * @param string  $name          The name of the key
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
     * @param Boolean $removeKeyItem Whether or not the key item should be removed.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
     * @return ArrayNodeDefinition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
    public function useAttributeAsKey($name, $removeKeyItem = true)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
        $this->key = $name;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
        $this->removeKeyItem = $removeKeyItem;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
     * Sets whether the node can be unset.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
     * @param Boolean $allow
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
     * @return ArrayNodeDefinition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
    public function canBeUnset($allow = true)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
        $this->merge()->allowUnset($allow);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
     * Disables the deep merging of the node.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
     * @return ArrayNodeDefinition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
    public function performNoDeepMerging()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
        $this->performDeepMerging = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
     * Allows extra config keys to be specified under an array without
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
     * throwing an exception.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
     * Those config values are simply ignored. This should be used only
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
     * in special cases where you want to send an entire configuration
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
     * array through a special tree that processes only part of the array.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
     * @return ArrayNodeDefinition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
    public function ignoreExtraKeys()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
        $this->ignoreExtraKeys = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
     * Append a node definition.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
     *     $node = new ArrayNodeDefinition()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
     *         ->children()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
     *             ->scalarNode('foo')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
     *             ->scalarNode('baz')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
     *         ->end()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
     *         ->append($this->getBarNodeDefinition())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
     *     ;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
     * @return ArrayNodeDefinition This node
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
    public function append(NodeDefinition $node)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
        $this->children[$node->name] = $node->setParent($this);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
        return $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
     * Returns a node builder to be used to add children and prototype
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
     * @return NodeBuilder The node builder
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
    protected function getNodeBuilder()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
        if (null === $this->nodeBuilder) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
            $this->nodeBuilder = new NodeBuilder();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
        return $this->nodeBuilder->setParent($this);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
     * {@inheritDoc}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
    protected function createNode()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
        if (null == $this->prototype) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
            $node = new ArrayNode($this->name, $this->parent);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
            $node = new PrototypedArrayNode($this->name, $this->parent);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
        $node->setAddIfNotSet($this->addDefaults);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
        $node->setAllowNewKeys($this->allowNewKeys);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
        $node->addEquivalentValue(null, $this->nullEquivalent);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
        $node->addEquivalentValue(true, $this->trueEquivalent);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
        $node->addEquivalentValue(false, $this->falseEquivalent);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
        $node->setPerformDeepMerging($this->performDeepMerging);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
        $node->setRequired($this->required);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
        $node->setIgnoreExtraKeys($this->ignoreExtraKeys);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
        if (null !== $this->normalization) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
            $node->setNormalizationClosures($this->normalization->before);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
            $node->setXmlRemappings($this->normalization->remappings);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
        if (null !== $this->merge) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
            $node->setAllowOverwrite($this->merge->allowOverwrite);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
            $node->setAllowFalse($this->merge->allowFalse);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
        if (null !== $this->validation) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
            $node->setFinalValidationClosures($this->validation->rules);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
        if (null == $this->prototype) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
            foreach ($this->children as $child) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
                $child->parent = $node;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
                $node->addChild($child->getNode());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
            if (null !== $this->key) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
                $node->setKeyAttribute($this->key, $this->removeKeyItem);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
            if (true === $this->atLeastOne) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
                $node->setMinNumberOfElements(1);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
            if (null !== $this->defaultValue) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
                $node->setDefaultValue($this->defaultValue);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
            $this->prototype->parent = $node;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
            $node->setPrototype($this->prototype->getNode());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
        return $node;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
}