PhpThemeFunctionalTest.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Bundle\FrameworkBundle\Tests\Form;
  11. use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
  12. use Symfony\Bundle\FrameworkBundle\Form\PhpEngineTheme;
  13. use Symfony\Component\Form\Type\AbstractFieldType;
  14. use Symfony\Component\Form\FieldBuilder;
  15. use Symfony\Component\Form\CsrfProvider\DefaultCsrfProvider;
  16. use Symfony\Component\Form\Type\Loader\DefaultTypeLoader;
  17. use Symfony\Component\Form\FormFactory;
  18. /**
  19. * Test theme template files shipped with framework bundle.
  20. */
  21. class PhpThemeFunctionalTest extends TestCase
  22. {
  23. private $engine;
  24. private $theme;
  25. /** @var FormFactory */
  26. private $factory;
  27. public function setUp()
  28. {
  29. $parser = new \Symfony\Component\Templating\TemplateNameParser();
  30. $loader = new \Symfony\Component\Templating\Loader\FilesystemLoader(__DIR__ . '/../../Resources/views/Form/%name%');
  31. $this->engine = new \Symfony\Component\Templating\PhpEngine($parser, $loader, array());
  32. $this->engine->addHelpers(array(
  33. new \Symfony\Bundle\FrameworkBundle\Templating\Helper\TranslatorHelper(
  34. new \Symfony\Component\Translation\IdentityTranslator(
  35. new \Symfony\Component\Translation\MessageSelector()
  36. )
  37. )
  38. ));
  39. $this->theme = new PhpEngineTheme($this->engine);
  40. $csrfProvider = new DefaultCsrfProvider('foo');
  41. $validator = $this->getMock('Symfony\Component\Validator\ValidatorInterface');
  42. $storage = new \Symfony\Component\HttpFoundation\File\TemporaryStorage('foo', 1, \sys_get_temp_dir());
  43. // ok more than 2 lines, see DefaultFormFactory.php for proposed simplication
  44. $typeLoader = new DefaultTypeLoader();
  45. $this->factory = new FormFactory($typeLoader);
  46. $typeLoader->initialize($this->factory, $this->theme, $csrfProvider, $validator , $storage);
  47. // this is the relevant bit about your own forms:
  48. $typeLoader->addType(new MyTestFormConfig());
  49. $typeLoader->addType(new MyTestSubFormConfig());
  50. }
  51. public function testFullFormRendering()
  52. {
  53. $form = $this->factory->create('my.form');
  54. $html = $form->getRenderer()->getWidget();
  55. $dom = new \DomDocument('UTF-8');
  56. $dom->loadXml($html);
  57. $xpath = new \DomXpath($dom);
  58. $ids = array();
  59. foreach ($xpath->evaluate('//*[@id]') as $node) {
  60. $ids[] = $node->tagName . "#" . $node->getAttribute('id');
  61. }
  62. $this->assertEquals(array (
  63. 'input#my.form_field0_subfield0',
  64. 'input#my.form_field1',
  65. 'select#my.form_field2_month',
  66. 'select#my.form_field2_day',
  67. 'select#my.form_field2_year',
  68. 'select#my.form_field5_hour',
  69. 'select#my.form_field5_minute',
  70. 'input#my.form_field3_active',
  71. 'input#my.form_field3_inactive',
  72. 'select#my.form_field21',
  73. 'select#my.form_field22',
  74. 'select#my.form_field4_date_month',
  75. 'select#my.form_field4_date_day',
  76. 'select#my.form_field4_date_year',
  77. 'select#my.form_field4_time_hour',
  78. 'select#my.form_field4_time_minute',
  79. 'select#my.form_field6_month',
  80. 'select#my.form_field6_day',
  81. 'select#my.form_field6_year',
  82. 'input#my.form_field7',
  83. 'input#my.form_field8_file',
  84. 'input#my.form_field8_token',
  85. 'input#my.form_field8_name',
  86. 'select#my.form_field11',
  87. 'select#my.form_field12',
  88. 'input#my.form_field13',
  89. 'input#my.form_field14',
  90. 'input#my.form_field15',
  91. 'input#my.form_field16',
  92. 'input#my.form_field17',
  93. 'input#my.form_field18_first',
  94. 'input#my.form_field18_second',
  95. 'select#my.form_field19',
  96. 'input#my.form_field20',
  97. ), $ids);
  98. }
  99. }
  100. class MyTestFormConfig extends AbstractFieldType
  101. {
  102. public function configure(FieldBuilder $builder, array $options)
  103. {
  104. $builder->setDataClass('Symfony\Bundle\FrameworkBundle\Tests\Form\MyTestObject');
  105. $builder->add('my.sub_form', 'field0');
  106. $builder->add('text', 'field1', array('max_length' => 127, 'id' => 'foo'));
  107. $builder->add('date', 'field2');
  108. $builder->add('time', 'field5');
  109. $builder->add('choice', 'field3', array(
  110. 'expanded' => true,
  111. 'multiple' => false,
  112. 'choices' => array('active' => 'Active', 'inactive' => 'Inactive'),
  113. ));
  114. $builder->add('choice', 'field21', array(
  115. 'expanded' => false,
  116. 'multiple' => false,
  117. 'choices' => array('active' => 'Active', 'inactive' => 'Inactive'),
  118. ));
  119. $builder->add('choice', 'field22', array(
  120. 'expanded' => false,
  121. 'multiple' => false,
  122. 'choices' => array('active' => 'Active', 'inactive' => 'Inactive'),
  123. 'preferred_choices' => array('active')
  124. ));
  125. $builder->add('datetime', 'field4');
  126. $builder->add('birthday', 'field6');
  127. $builder->add('checkbox', 'field7');
  128. $builder->add('file', 'field8');
  129. $builder->add('hidden', 'field9');
  130. $builder->add('integer', 'field10');
  131. $builder->add('language', 'field11');
  132. $builder->add('locale', 'field12');
  133. $builder->add('money', 'field13');
  134. $builder->add('number', 'field14');
  135. $builder->add('password', 'field15');
  136. $builder->add('percent', 'field16');
  137. $builder->add('radio', 'field17');
  138. $builder->add('repeated', 'field18', array('identifier' => 'password'));
  139. $builder->add('collection', 'emails', array(
  140. 'prototype' => 'text',
  141. ));
  142. $builder->add('timezone', 'field19');
  143. $builder->add('url', 'field20');
  144. }
  145. public function getName()
  146. {
  147. return 'my.form';
  148. }
  149. public function getParent(array $options) {
  150. return 'form';
  151. }
  152. }
  153. class MyTestObject
  154. {
  155. private $emails = 'test,foo,bar';
  156. }
  157. class MyTestSubFormConfig extends AbstractFieldType
  158. {
  159. public function configure(FieldBuilder $builder, array $options)
  160. {
  161. $builder->add('text', 'subfield0');
  162. }
  163. public function getName()
  164. {
  165. return 'my.sub_form';
  166. }
  167. public function getParent(array $options) {
  168. return 'form';
  169. }
  170. }