bug #9394 [Form] Fixed form debugger to work even when no view variables are logged (bschussek)

This PR was merged into the master branch.

Discussion
----------

[Form] Fixed form debugger to work even when no view variables are logged

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

Commits
-------

99a4b7e [Form] Fixed form debugger to work even when no view variables are logged  (e.g. upon redirects)
This commit is contained in:
Fabien Potencier 2013-10-28 14:27:05 +01:00
commit 53315562f2
3 changed files with 61 additions and 2 deletions

View File

@ -173,7 +173,7 @@
{% macro form_tree_entry(name, data) %}
<li>
<a href="#details_{{ data.view_vars.id|default("") }}">{{ name }}</a>
<a href="#details_{{ data.id }}">{{ name }}</a>
{% if data.children is not empty %}
<ul>
@ -186,7 +186,7 @@
{% endmacro %}
{% macro form_tree_details(name, data) %}
<div class="tree-details" id="details_{{ data.view_vars.id|default("") }}">
<div class="tree-details" id="details_{{ data.id }}">
<h2>
{{ name }}
{% if data.type_class is defined %}
@ -323,6 +323,7 @@
</table>
{% endif %}
{% if data.view_vars is defined %}
<h3>View Variables</h3>
<table>
@ -337,6 +338,7 @@
</tr>
{% endfor %}
</table>
{% endif %}
</div>
{% for childName, childData in data.children %}

View File

@ -42,6 +42,7 @@ class FormDataExtractor implements FormDataExtractorInterface
public function extractConfiguration(FormInterface $form)
{
$data = array(
'id' => $this->buildId($form),
'type' => $form->getConfig()->getType()->getName(),
'type_class' => get_class($form->getConfig()->getType()->getInnerType()),
'synchronized' => $this->valueExporter->exportValue($form->isSynchronized()),
@ -132,4 +133,22 @@ class FormDataExtractor implements FormDataExtractorInterface
return $data;
}
/**
* Recursively builds an HTML ID for a form.
*
* @param FormInterface $form The form
*
* @return string The HTML ID
*/
private function buildId(FormInterface $form)
{
$id = $form->getName();
if (null !== $form->getParent()) {
$id = $this->buildId($form->getParent()).'_'.$id;
}
return $id;
}
}

View File

@ -79,6 +79,7 @@ class FormDataExtractorTest extends \PHPUnit_Framework_TestCase
->getForm();
$this->assertSame(array(
'id' => 'name',
'type' => 'type_name',
'type_class' => 'stdClass',
'synchronized' => 'true',
@ -111,6 +112,7 @@ class FormDataExtractorTest extends \PHPUnit_Framework_TestCase
->getForm();
$this->assertSame(array(
'id' => 'name',
'type' => 'type_name',
'type_class' => 'stdClass',
'synchronized' => 'true',
@ -144,6 +146,7 @@ class FormDataExtractorTest extends \PHPUnit_Framework_TestCase
->getForm();
$this->assertSame(array(
'id' => 'name',
'type' => 'type_name',
'type_class' => 'stdClass',
'synchronized' => 'true',
@ -156,6 +159,41 @@ class FormDataExtractorTest extends \PHPUnit_Framework_TestCase
), $this->dataExtractor->extractConfiguration($form));
}
public function testExtractConfigurationBuildsIdRecursively()
{
$type = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');
$type->expects($this->any())
->method('getName')
->will($this->returnValue('type_name'));
$type->expects($this->any())
->method('getInnerType')
->will($this->returnValue(new \stdClass()));
$grandParent = $this->createBuilder('grandParent')
->setCompound(true)
->setDataMapper($this->getMock('Symfony\Component\Form\DataMapperInterface'))
->getForm();
$parent = $this->createBuilder('parent')
->setCompound(true)
->setDataMapper($this->getMock('Symfony\Component\Form\DataMapperInterface'))
->getForm();
$form = $this->createBuilder('name')
->setType($type)
->getForm();
$grandParent->add($parent);
$parent->add($form);
$this->assertSame(array(
'id' => 'grandParent_parent_name',
'type' => 'type_name',
'type_class' => 'stdClass',
'synchronized' => 'true',
'passed_options' => array(),
'resolved_options' => array(),
), $this->dataExtractor->extractConfiguration($form));
}
public function testExtractDefaultData()
{
$form = $this->createBuilder('name')->getForm();