Skip to content

Commit

Permalink
merged branch bschussek/form-debugger (PR #9082)
Browse files Browse the repository at this point in the history
This PR was merged into the master branch.

Discussion
----------

[Form] Implemented form debugger

Same as #9021 (kudos to @digitalkaoz!), with some added caramel.

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

**Note:** Please keep in mind that this is a first version only. Not all features (especially UX/UI-wise) that I'd like to see are in there, but it's good enough for a first merge.

Commits
-------

89509d9 [Form] Improved form debugger
f56c577 [HttpKernel] Extracted value exporting logic of DataCollector into a separate ValueExporter class
56d78ed [Form] Decoupled methods of ResolvedFormType so that they can be overridden individually by decorators
a994a5d [Form] Merged subsriber/collector, also collect valid forms
1972a91 [Form] Added form debug collector
  • Loading branch information
fabpot committed Sep 25, 2013
2 parents 98c0d38 + 89509d9 commit 55de9d9
Show file tree
Hide file tree
Showing 28 changed files with 2,733 additions and 209 deletions.
Expand Up @@ -218,6 +218,7 @@ private function registerProfilerConfiguration(array $config, ContainerBuilder $
return;
}

$loader->load('form_debug.xml');
$loader->load('profiling.xml');
$loader->load('collectors.xml');

Expand Down
10 changes: 10 additions & 0 deletions src/Symfony/Bundle/FrameworkBundle/Resources/config/collectors.xml
Expand Up @@ -13,6 +13,8 @@
<parameter key="data_collector.time.class">Symfony\Component\HttpKernel\DataCollector\TimeDataCollector</parameter>
<parameter key="data_collector.memory.class">Symfony\Component\HttpKernel\DataCollector\MemoryDataCollector</parameter>
<parameter key="data_collector.router.class">Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector</parameter>
<parameter key="data_collector.form.class">Symfony\Component\Form\Extension\DataCollector\FormDataCollector</parameter>
<parameter key="data_collector.form.extractor.class">Symfony\Component\Form\Extension\DataCollector\FormDataExtractor</parameter>
</parameters>

<services>
Expand Down Expand Up @@ -53,5 +55,13 @@
<tag name="kernel.event_listener" event="kernel.controller" method="onKernelController"/>
<tag name="data_collector" template="@WebProfiler/Collector/router.html.twig" id="router" priority="255" />
</service>

<service id="data_collector.form.extractor" class="%data_collector.form.extractor.class%" />

<service id="data_collector.form" class="%data_collector.form.class%">
<tag name="data_collector" template="@WebProfiler/Collector/form.html.twig" id="form" priority="255" />
<argument type="service" id="data_collector.form.extractor" />
</service>

</services>
</container>
26 changes: 26 additions & 0 deletions src/Symfony/Bundle/FrameworkBundle/Resources/config/form_debug.xml
@@ -0,0 +1,26 @@
<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

<parameters>
<parameter key="form.resolved_type_factory.data_collector_proxy.class">Symfony\Component\Form\Extension\DataCollector\Proxy\ResolvedTypeFactoryDataCollectorProxy</parameter>
<parameter key="form.type_extension.form.data_collector.class">Symfony\Component\Form\Extension\DataCollector\Type\DataCollectorTypeExtension</parameter>
</parameters>

<services>
<service id="form.resolved_type_factory" class="%form.resolved_type_factory.data_collector_proxy.class%">
<argument type="service">
<service class="%form.resolved_type_factory.class%" />
</argument>
<argument type="service" id="data_collector.form" />
</service>

<!-- DataCollectorTypeExtension -->
<service id="form.type_extension.form.data_collector" class="%form.type_extension.form.data_collector.class%">
<tag name="form.type_extension" alias="form" />
<argument type="service" id="data_collector.form" />
</service>
</services>
</container>

Large diffs are not rendered by default.

Expand Up @@ -63,13 +63,19 @@ table th, table td {
font-size: 12px;
padding: 8px 10px;
}
table td em {
color: #aaa;
}
fieldset {
border: none;
}
abbr {
border-bottom: 1px dotted #000;
cursor: help;
}
pre, code {
font-size: 0.9em;
}
.clear {
clear: both;
height: 0;
Expand Down
11 changes: 10 additions & 1 deletion src/Symfony/Component/Form/Button.php
Expand Up @@ -412,7 +412,16 @@ public function createView(FormView $parent = null)
$parent = $this->parent->createView();
}

return $this->config->getType()->createView($this, $parent);

$type = $this->config->getType();
$options = $this->config->getOptions();

$view = $type->createView($this, $parent);

$type->buildView($view, $this, $options);
$type->finishView($view, $this, $options);

return $view;
}

/**
Expand Down
@@ -0,0 +1,45 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\Form\Extension\DataCollector;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\AbstractExtension;

/**
* Extension for collecting data of the forms on a page.
*
* @since 2.4
* @author Robert Schönthal <robert.schoenthal@gmail.com>
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class DataCollectorExtension extends AbstractExtension
{
/**
* @var EventSubscriberInterface
*/
private $dataCollector;

public function __construct(FormDataCollectorInterface $dataCollector)
{
$this->dataCollector = $dataCollector;
}

/**
* {@inheritDoc}
*/
protected function loadTypeExtensions()
{
return array(
new Type\DataCollectorTypeExtension($this->dataCollector)
);
}
}
@@ -0,0 +1,85 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\Form\Extension\DataCollector\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Extension\DataCollector\FormDataCollectorInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

/**
* Listener that invokes a data collector for the {@link FormEvents::POST_SET_DATA}
* and {@link FormEvents::POST_SUBMIT} events.
*
* @since 2.4
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class DataCollectorListener implements EventSubscriberInterface
{
/**
* @var FormDataCollectorInterface
*/
private $dataCollector;

public function __construct(FormDataCollectorInterface $dataCollector)
{
$this->dataCollector = $dataCollector;
}

/**
* {@inheritDoc}
*/
public static function getSubscribedEvents()
{
return array(
// High priority in order to be called as soon as possible
FormEvents::POST_SET_DATA => array('postSetData', 255),
// Low priority in order to be called as late as possible
FormEvents::POST_SUBMIT => array('postSubmit', -255),
);
}

/**
* Listener for the {@link FormEvents::POST_SET_DATA} event.
*
* @param FormEvent $event The event object
*/
public function postSetData(FormEvent $event)
{
if ($event->getForm()->isRoot()) {
// Collect basic information about each form
$this->dataCollector->collectConfiguration($event->getForm());

// Collect the default data
$this->dataCollector->collectDefaultData($event->getForm());
}
}

/**
* Listener for the {@link FormEvents::POST_SUBMIT} event.
*
* @param FormEvent $event The event object
*/
public function postSubmit(FormEvent $event)
{
if ($event->getForm()->isRoot()) {
// Collect the submitted data of each form
$this->dataCollector->collectSubmittedData($event->getForm());

// Assemble a form tree
// This is done again in collectViewVariables(), but that method
// is not guaranteed to be called (i.e. when no view is created)
$this->dataCollector->buildPreliminaryFormTree($event->getForm());
}
}

}

0 comments on commit 55de9d9

Please sign in to comment.