Quellcode durchsuchen

Finished first version of PhpTheme, added huge functional test.

Benjamin Eberlei vor 14 Jahren
Ursprung
Commit
44e85ae2f2

+ 1 - 0
src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/collection_row.html.php

@@ -0,0 +1 @@
+<?php echo $renderer->getTheme()->render('form', 'widget', $renderer->getVars()); ?>

+ 1 - 1
src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/date_widget.html.php

@@ -12,5 +12,5 @@
         $fields['year']->getWidget(),
         $fields['month']->getWidget(),
         $fields['day']->getWidget(),
-    ), $pattern) ?>
+    ), $date_pattern) ?>
 <?php endif ?>

+ 1 - 1
src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/date_time_widget.html.php

@@ -1,3 +1,3 @@
 <?php echo $fields['date']->getWidget() ?>
-<!-- keep space -->
+<?php /* keep space */ ?>
 <?php echo $fields['time']->getWidget() ?>

+ 0 - 5
src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/field_row.html.php

@@ -1,5 +0,0 @@
-<div>
-    <?php echo $field->getLabel() ?>
-    <?php echo $field->getErrors() ?>
-    <?php echo $field->getWidget() ?>
-</div>

+ 0 - 10
src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/file_field.html.php

@@ -1,10 +0,0 @@
-<input type="file"
-    id="<?php echo $field['file']->getVar('id') ?>"
-    name="<?php echo $field['file']->getVar('name') ?>"
-    <?php if ($field['file']->getVar('disabled')): ?>disabled="disabled"<?php endif ?>
-    <?php if ($field['file']->getVar('required')): ?>required="required"<?php endif ?>
-    <?php if ($field['file']->getVar('class')): ?>class="<?php echo $field['file']->getVar('class') ?>"<?php endif ?>
-/>
-
-<?php echo $fields['token']->getWidget() ?>
-<?php echo $fields['original_name']->getWidget() ?>

+ 10 - 0
src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/file_widget.html.php

@@ -0,0 +1,10 @@
+<input type="file"
+    id="<?php echo $fields['file']->getVar('id') ?>"
+    name="<?php echo $fields['file']->getVar('name') ?>"
+    <?php if ($fields['file']->getVar('disabled')): ?>disabled="disabled"<?php endif ?>
+    <?php if ($fields['file']->getVar('required')): ?>required="required"<?php endif ?>
+    <?php if ($fields['file']->getVar('class')): ?>class="<?php echo $fields['file']->getVar('class') ?>"<?php endif ?>
+/>
+
+<?php echo $fields['token']->getWidget() ?>
+<?php echo $fields['name']->getWidget() ?>

+ 0 - 6
src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form.html.php

@@ -1,6 +0,0 @@
-<div>
-    <?php echo $field->getErrors() ?>
-    <?php echo $field->getRows() ?>
-    <?php echo $field->getRest() ?>
-</div>
-

+ 8 - 0
src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/form_widget.html.php

@@ -0,0 +1,8 @@
+<div>
+    <?php echo $renderer->getErrors() ?>
+    <?php foreach ($fields as $field): ?>
+        <?php echo $field->getRow(); ?>
+    <?php endforeach; ?>
+    <?php echo $renderer->getRest() ?>
+</div>
+

+ 1 - 0
src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/integer_widget.html.php

@@ -0,0 +1 @@
+<?php $renderer->getTheme()->render('number', 'widget', $renderer->getVars()); ?>

+ 2 - 2
src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/money_widget.html.php

@@ -1,4 +1,4 @@
 <?php echo str_replace('{{ widget }}',
-    $view['form']->render($field, array(), array(), 'FrameworkBundle:Form:number_field.html.php'),!
-    $pattern
+    $renderer->getTheme()->render('number', 'widget', $renderer->getVars()),
+    $money_pattern
 ) ?>

+ 1 - 1
src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/percent_widget.html.php

@@ -1 +1 @@
-<?php echo $view['form']->render($field, array(), array(), 'FrameworkBundle:Form:number_field.html.php') ?> %
+<?php echo $renderer->getTheme()->render('number', 'widget', $renderer->getVars()) ?> %

+ 3 - 0
src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/repeated_row.html.php

@@ -0,0 +1,3 @@
+<?php foreach ($fields AS $field): ?>
+    <?php echo $field->getRow(); ?>
+<?php endforeach; ?>

+ 5 - 0
src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/rest.html.php

@@ -0,0 +1,5 @@
+<?php foreach ($fields as $field): ?>
+    <?php if (!$field->isRendered()): ?>
+        <?php echo $field->getWidget() ?>
+    <?php endif; ?>
+<?php endforeach; ?>

+ 5 - 0
src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/row.html.php

@@ -0,0 +1,5 @@
+<div>
+    <?php echo $renderer->getLabel() ?>
+    <?php echo $renderer->getErrors() ?>
+    <?php echo $renderer->getWidget() ?>
+</div>

+ 9 - 0
src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/widget.html.php

@@ -0,0 +1,9 @@
+<input id="<?php echo $id ?>" type="<?php echo $type ?>"
+    name="<?php echo $name ?>"
+    value="<?php echo $value ?>"
+    <?php if ($class): ?>class="<?php echo $class; ?>"<?php endif; ?>
+    <?php if ($disabled): ?>disabled="disabled"<?php endif ?>
+    <?php if ($required): ?>required="required"<?php endif ?>
+    <?php if ($max_length && $max_length > 0): ?>maxlength="<?php echo $max_length ?>"<?php endif; ?>
+    <?php if ($size && $size > 0): ?>size="<?php echo $size ?>"<?php endif; ?>
+/>

+ 185 - 0
src/Symfony/Bundle/FrameworkBundle/Tests/Form/PhpThemeFunctionalTest.php

@@ -0,0 +1,185 @@
+<?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\Bundle\FrameworkBundle\Tests\Form;
+
+use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
+use Symfony\Component\Form\Type\AbstractFieldType;
+use Symfony\Component\Form\FieldBuilder;
+use Symfony\Component\Form\CsrfProvider\DefaultCsrfProvider;
+use Symfony\Component\Form\Type\Loader\DefaultTypeLoader;
+use Symfony\Component\Form\FormFactory;
+
+/**
+ * Test theme template files shipped with framework bundle.
+ */
+class PhpThemeFunctionalTest extends TestCase
+{
+    private $engine;
+    private $theme;
+    /** @var FormFactory */
+    private $factory;
+
+    public function setUp()
+    {
+        $parser = new \Symfony\Component\Templating\TemplateNameParser();
+        $loader = new \Symfony\Component\Templating\Loader\FilesystemLoader(__DIR__ . '/../../Resources/views/Form/%name%');
+        $this->engine = new \Symfony\Component\Templating\PhpEngine($parser, $loader, array());
+        $this->engine->addHelpers(array(
+            new \Symfony\Bundle\FrameworkBundle\Templating\Helper\TranslatorHelper(
+                new \Symfony\Component\Translation\IdentityTranslator(
+                    new \Symfony\Component\Translation\MessageSelector()
+                )
+            )
+        ));
+        $this->theme = new \Symfony\Component\Form\Renderer\Theme\PhpTheme($this->engine);
+        $csrfProvider = new DefaultCsrfProvider('foo');
+        $validator = $this->getMock('Symfony\Component\Validator\ValidatorInterface');
+        $storage = new \Symfony\Component\HttpFoundation\File\TemporaryStorage('foo', 1, \sys_get_temp_dir());
+
+        // ok more than 2 lines, see DefaultFormFactory.php for proposed simplication
+        $typeLoader = new DefaultTypeLoader();
+        $this->factory = new FormFactory($typeLoader);
+        $typeLoader->initialize($this->factory, $this->theme, $csrfProvider, $validator , $storage);
+        // this is the relevant bit about your own forms:
+        $typeLoader->addType(new MyTestFormConfig());
+        $typeLoader->addType(new MyTestSubFormConfig());
+    }
+
+    public function testFullFormRendering()
+    {
+        $form = $this->factory->create('my.form');
+        $html = $form->getRenderer()->getWidget();
+
+        $dom = new \DomDocument('UTF-8');
+        $dom->loadXml($html);
+
+        $xpath = new \DomXpath($dom);
+        $ids = array();
+        foreach ($xpath->evaluate('//*[@id]') as $node) {
+            $ids[] = $node->tagName . "#" . $node->getAttribute('id');
+        }
+        $this->assertEquals(array (
+            'input#my.form_field0_subfield0',
+            'input#my.form_field1',
+            'select#my.form_field2_month',
+            'select#my.form_field2_day',
+            'select#my.form_field2_year',
+            'select#my.form_field5_hour',
+            'select#my.form_field5_minute',
+            'input#my.form_field3_active',
+            'input#my.form_field3_inactive',
+            'select#my.form_field21',
+            'select#my.form_field22',
+            'select#my.form_field4_date_month',
+            'select#my.form_field4_date_day',
+            'select#my.form_field4_date_year',
+            'select#my.form_field4_time_hour',
+            'select#my.form_field4_time_minute',
+            'select#my.form_field6_month',
+            'select#my.form_field6_day',
+            'select#my.form_field6_year',
+            'input#my.form_field7',
+            'input#my.form_field8_file',
+            'input#my.form_field8_token',
+            'input#my.form_field8_name',
+            'select#my.form_field11',
+            'select#my.form_field12',
+            'input#my.form_field13',
+            'input#my.form_field14',
+            'input#my.form_field15',
+            'input#my.form_field16',
+            'input#my.form_field17',
+            'input#my.form_field18_first',
+            'input#my.form_field18_second',
+            'select#my.form_field19',
+            'input#my.form_field20',
+            ), $ids);
+    }
+}
+
+class MyTestFormConfig extends AbstractFieldType
+{
+    public function configure(FieldBuilder $builder, array $options)
+    {
+        $builder->setDataClass('Symfony\Bundle\FrameworkBundle\Tests\Form\MyTestObject');
+        $builder->add('my.sub_form', 'field0');
+        $builder->add('text', 'field1', array('max_length' => 127, 'id' => 'foo'));
+        $builder->add('date', 'field2');
+        $builder->add('time', 'field5');
+        $builder->add('choice', 'field3', array(
+            'expanded' => true,
+            'multiple' => false,
+            'choices' => array('active' => 'Active', 'inactive' => 'Inactive'),
+        ));
+        $builder->add('choice', 'field21', array(
+            'expanded' => false,
+            'multiple' => false,
+            'choices' => array('active' => 'Active', 'inactive' => 'Inactive'),
+        ));
+        $builder->add('choice', 'field22', array(
+            'expanded' => false,
+            'multiple' => false,
+            'choices' => array('active' => 'Active', 'inactive' => 'Inactive'),
+            'preferred_choices' => array('active')
+        ));
+        $builder->add('datetime', 'field4');
+        $builder->add('birthday', 'field6');
+        $builder->add('checkbox', 'field7');
+        $builder->add('file', 'field8');
+        $builder->add('hidden', 'field9');
+        $builder->add('integer', 'field10');
+        $builder->add('language', 'field11');
+        $builder->add('locale', 'field12');
+        $builder->add('money', 'field13');
+        $builder->add('number', 'field14');
+        $builder->add('password', 'field15');
+        $builder->add('percent', 'field16');
+        $builder->add('radio', 'field17');
+        $builder->add('repeated', 'field18', array('identifier' => 'password'));
+        $builder->add('collection', 'emails', array(
+            'prototype' => 'text',
+        ));
+        $builder->add('timezone', 'field19');
+        $builder->add('url', 'field20');
+    }
+
+    public function getName()
+    {
+        return 'my.form';
+    }
+
+    public function getParent(array $options) {
+        return 'form';
+    }
+}
+
+class MyTestObject
+{
+    private $emails = 'test,foo,bar';
+}
+
+class MyTestSubFormConfig extends AbstractFieldType
+{
+    public function configure(FieldBuilder $builder, array $options)
+    {
+        $builder->add('text', 'subfield0');
+    }
+
+    public function getName()
+    {
+        return 'my.sub_form';
+    }
+
+    public function getParent(array $options) {
+        return 'form';
+    }
+}