TimeFieldConfig.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien.potencier@symfony-project.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\Component\Form\Config;
  11. use Symfony\Component\Form\FieldBuilder;
  12. use Symfony\Component\Form\ChoiceList\PaddedChoiceList;
  13. use Symfony\Component\Form\ValueTransformer\ReversedTransformer;
  14. use Symfony\Component\Form\ValueTransformer\DateTimeToStringTransformer;
  15. use Symfony\Component\Form\ValueTransformer\DateTimeToTimestampTransformer;
  16. use Symfony\Component\Form\ValueTransformer\DateTimeToArrayTransformer;
  17. class TimeFieldConfig extends AbstractFieldConfig
  18. {
  19. public function configure(FieldBuilder $builder, array $options)
  20. {
  21. $hourOptions = $minuteOptions = $secondOptions = array();
  22. $child = $options['widget'] === 'text' ? 'text' : 'choice';
  23. $parts = array('hour', 'minute');
  24. if ($options['widget'] === 'choice') {
  25. $hourOptions['choice_list'] = new PaddedChoiceList(
  26. $options['hours'], 2, '0', STR_PAD_LEFT
  27. );
  28. $minuteOptions['choice_list'] = new PaddedChoiceList(
  29. $options['minutes'], 2, '0', STR_PAD_LEFT
  30. );
  31. if ($options['with_seconds']) {
  32. $secondOptions['choice_list'] = new PaddedChoiceList(
  33. $options['seconds'], 2, '0', STR_PAD_LEFT
  34. );
  35. }
  36. }
  37. $builder->add($options['widget'], 'hour', $hourOptions)
  38. ->add($options['widget'], 'minute', $minuteOptions);
  39. if ($options['with_seconds']) {
  40. $parts[] = 'second';
  41. $builder->add($options['widget'], 'second', $secondOptions);
  42. }
  43. if ($options['type'] == 'string') {
  44. $builder->setNormalizationTransformer(new ReversedTransformer(
  45. new DateTimeToStringTransformer(array(
  46. 'format' => 'H:i:s',
  47. 'input_timezone' => $options['data_timezone'],
  48. 'output_timezone' => $options['data_timezone'],
  49. ))
  50. ));
  51. } else if ($options['type'] == 'timestamp') {
  52. $builder->setNormalizationTransformer(new ReversedTransformer(
  53. new DateTimeToTimestampTransformer(array(
  54. 'input_timezone' => $options['data_timezone'],
  55. 'output_timezone' => $options['data_timezone'],
  56. ))
  57. ));
  58. } else if ($options['type'] === 'array') {
  59. $builder->setNormalizationTransformer(new ReversedTransformer(
  60. new DateTimeToArrayTransformer(array(
  61. 'input_timezone' => $options['data_timezone'],
  62. 'output_timezone' => $options['data_timezone'],
  63. 'fields' => $parts,
  64. ))
  65. ));
  66. }
  67. $builder
  68. ->setValueTransformer(new DateTimeToArrayTransformer(array(
  69. 'input_timezone' => $options['data_timezone'],
  70. 'output_timezone' => $options['user_timezone'],
  71. // if the field is rendered as choice field, the values should be trimmed
  72. // of trailing zeros to render the selected choices correctly
  73. 'pad' => $options['widget'] === 'text',
  74. 'fields' => $parts,
  75. )))
  76. ->setRendererVar('widget', $options['widget'])
  77. ->setRendererVar('with_seconds', $options['with_seconds']);
  78. }
  79. public function getDefaultOptions(array $options)
  80. {
  81. return array(
  82. 'template' => 'time',
  83. 'hours' => range(0, 23),
  84. 'minutes' => range(0, 59),
  85. 'seconds' => range(0, 59),
  86. 'widget' => 'choice',
  87. 'type' => 'datetime',
  88. 'with_seconds' => false,
  89. 'pattern' => null,
  90. 'data_timezone' => date_default_timezone_get(),
  91. 'user_timezone' => date_default_timezone_get(),
  92. 'csrf_protection' => false,
  93. // Don't modify \DateTime classes by reference, we treat
  94. // them like immutable value objects
  95. 'by_reference' => false,
  96. );
  97. }
  98. public function getParent(array $options)
  99. {
  100. return 'form';
  101. }
  102. public function getIdentifier()
  103. {
  104. return 'time';
  105. }
  106. }