Skip to content

Commit

Permalink
feature #19480 [Config] Fix (Yaml|Xml)ReferenceDumper for nested prot…
Browse files Browse the repository at this point in the history
…otypes (ogizanagi)

This PR was merged into the 3.2-dev branch.

Discussion
----------

[Config] Fix (Yaml|Xml)ReferenceDumper for nested prototypes

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | -
| License       | MIT
| Doc PR        | -

This tries to fix the nested prototypes case for the `YamlReferenceDumper` and `XmlReferenceDumper`.

### Before
```yml
cms_pages:

    # Prototype
    page:                 []
```

### After

```yml
cms_pages:

    # Prototype
    page:

        # Prototype
        locale:
            title:                ~ # Required
            path:                 ~ # Required
```

~~However, the `YamlReferenceDumperTest::testDumper` is marked as skipped, due to another unsupported prototype usage, but that's another issue (the `connections` key). Thus, the bug fix must be tested manually :/ (I'd recommend to merge #19570 first)~~

Commits
-------

1e80510 [Config] Fix YamlReferenceDumper for nested prototypes
  • Loading branch information
fabpot committed Sep 16, 2016
2 parents f532322 + 1e80510 commit c21bed7
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 2 deletions.
Expand Up @@ -96,7 +96,10 @@ private function writeNode(NodeInterface $node, $depth = 0, $root = false, $name
$rootAttributes[$key] = str_replace('-', ' ', $rootName).' '.$key;
}

if ($prototype instanceof ArrayNode) {
if ($prototype instanceof PrototypedArrayNode) {
$prototype->setName($key);
$children = array($key => $prototype);
} elseif ($prototype instanceof ArrayNode) {
$children = $prototype->getChildren();
} else {
if ($prototype->hasDefaultValue()) {
Expand Down
Expand Up @@ -199,8 +199,14 @@ private function getPrototypeChildren(PrototypedArrayNode $node)

if ($prototype instanceof ArrayNode) {
$keyNode = new ArrayNode($key, $node);
$children = $prototype->getChildren();

if ($prototype instanceof PrototypedArrayNode) {
$children = $this->getPrototypeChildren($prototype);
}

// add children
foreach ($prototype->getChildren() as $childNode) {
foreach ($children as $childNode) {
$keyNode->addChild($childNode);
}
} else {
Expand Down
Expand Up @@ -78,6 +78,20 @@ enum=""
pass=""
/>
<!-- prototype -->
<cms-page page="cms page page">
<!-- prototype -->
<!-- title: Required -->
<!-- path: Required -->
<page
locale="page locale"
title=""
path=""
/>
</cms-page>
</config>
EOL
Expand Down
Expand Up @@ -65,6 +65,15 @@ enum: ~ # One of "this"; "that"
-
user: ~
pass: ~
cms_pages:
# Prototype
page:
# Prototype
locale:
title: ~ # Required
path: ~ # Required
EOL;
}
Expand Down
Expand Up @@ -24,6 +24,7 @@ public function getConfigTreeBuilder()
$rootNode
->fixXmlConfig('parameter')
->fixXmlConfig('connection')
->fixXmlConfig('cms_page')
->children()
->booleanNode('boolean')->defaultTrue()->end()
->scalarNode('scalar_empty')->end()
Expand Down Expand Up @@ -67,6 +68,18 @@ public function getConfigTreeBuilder()
->end()
->end()
->end()
->arrayNode('cms_pages')
->useAttributeAsKey('page')
->prototype('array')
->useAttributeAsKey('locale')
->prototype('array')
->children()
->scalarNode('title')->isRequired()->end()
->scalarNode('path')->isRequired()->end()
->end()
->end()
->end()
->end()
->end()
;

Expand Down

0 comments on commit c21bed7

Please sign in to comment.