Skip to content

Commit

Permalink
Merge pull request #4 from fsevestre/allow-custom-values
Browse files Browse the repository at this point in the history
Allow custom options
  • Loading branch information
fsevestre authored Oct 4, 2017
2 parents 6207a57 + e683233 commit aabb0a7
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 23 deletions.
17 changes: 15 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,21 @@ Usage
$builder->add('enabled', BooleanType::class);
```

The form type use a data transformer which will transform the value to `true` (`1`, `'1'`, `true` or `'true'`)
or `false` (`0`, `'0'`, `false` or `'false'`).
By default, the form type use a data transformer which will transform the value to `true` (`1`, `'1'`, `true` and
`'true'`) or `false` (`0`, `'0'`, `false` and `'false'`).

If you want to support more values, you can override the `true_values` and `false_values` form type options:

```php
$builder
->add('enabled', BooleanType::class,
array(
'true_values' => array(1, '1', true, 'true', 'on', 'yes'),
'false_values' => array(0, '0', false, 'false', 'off', 'no'),
)
)
;
```

> **Note:** The form type is not intended to be displayed on a browser: use the built-in `CheckboxType` form type
> provided by Symfony instead.
Expand Down
14 changes: 11 additions & 3 deletions src/Form/DataTransformer/BooleanTypeToBooleanTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

namespace FSevestre\BooleanFormType\Form\DataTransformer;

use FSevestre\BooleanFormType\Form\Type\BooleanType;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

Expand All @@ -11,6 +10,15 @@
*/
final class BooleanTypeToBooleanTransformer implements DataTransformerInterface
{
private $trueValues;
private $falseValues;

public function __construct(array $trueValues, array $falseValues)
{
$this->trueValues = $trueValues;
$this->falseValues = $falseValues;
}

public function transform($value)
{
if (null === $value) {
Expand All @@ -30,9 +38,9 @@ public function reverseTransform($value)
return false; // `false` and empty values are converted to `null` during form submission.
}

if (in_array($value, BooleanType::$TRUE_VALUES, true)) {
if (in_array($value, $this->trueValues, true)) {
return true;
} elseif (in_array($value, BooleanType::$FALSE_VALUES, true)) {
} elseif (in_array($value, $this->falseValues, true)) {
return false;
}

Expand Down
7 changes: 3 additions & 4 deletions src/Form/Type/BooleanType.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,17 @@
*/
final class BooleanType extends AbstractType
{
public static $FALSE_VALUES = array(0, '0', false, 'false');
public static $TRUE_VALUES = array(1, '1', true, 'true');

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addModelTransformer(new BooleanTypeToBooleanTransformer());
$builder->addModelTransformer(new BooleanTypeToBooleanTransformer($options['true_values'], $options['false_values']));
}

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'compound' => false,
'true_values' => array(1, '1', true, 'true'),
'false_values' => array(0, '0', false, 'false'),
));
}
}
21 changes: 10 additions & 11 deletions tests/Form/DataTransformer/BooleanTypeToBooleanTransformerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace FSevestre\BooleanFormTypeTest\Form\DataTransformer;

use FSevestre\BooleanFormType\Form\DataTransformer\BooleanTypeToBooleanTransformer;
use FSevestre\BooleanFormType\Form\Type\BooleanType;

/**
* @author Florent SEVESTRE
Expand All @@ -12,21 +11,21 @@ class BooleanTypeToBooleanTransformerTest extends \PHPUnit_Framework_TestCase
{
public function testTransformNull()
{
$transformer = new BooleanTypeToBooleanTransformer();
$transformer = new BooleanTypeToBooleanTransformer(array(1, '1', true, 'true'), array(0, '0', false, 'false'));

static::assertFalse($transformer->transform(null));
}

public function testTransformTrue()
{
$transformer = new BooleanTypeToBooleanTransformer();
$transformer = new BooleanTypeToBooleanTransformer(array(1, '1', true, 'true'), array(0, '0', false, 'false'));

static::assertTrue($transformer->transform(true));
}

public function testTransformFalse()
{
$transformer = new BooleanTypeToBooleanTransformer();
$transformer = new BooleanTypeToBooleanTransformer(array(1, '1', true, 'true'), array(0, '0', false, 'false'));

static::assertFalse($transformer->transform(false));
}
Expand All @@ -38,7 +37,7 @@ public function testTransformFailed($value)
{
$this->setExpectedException('Symfony\Component\Form\Exception\TransformationFailedException');

$transformer = new BooleanTypeToBooleanTransformer();
$transformer = new BooleanTypeToBooleanTransformer(array(1, '1', true, 'true'), array(0, '0', false, 'false'));
$transformer->transform($value);
}

Expand All @@ -58,7 +57,7 @@ public function getTransformFailedData()

public function testReverseTransformNull()
{
$transformer = new BooleanTypeToBooleanTransformer();
$transformer = new BooleanTypeToBooleanTransformer(array(1, '1', true, 'true'), array(0, '0', false, 'false'));

static::assertFalse($transformer->reverseTransform(null));
}
Expand All @@ -68,7 +67,7 @@ public function testReverseTransformNull()
*/
public function testReverseTransformTrue($value)
{
$transformer = new BooleanTypeToBooleanTransformer();
$transformer = new BooleanTypeToBooleanTransformer(array(1, '1', true, 'true'), array(0, '0', false, 'false'));

static::assertTrue($transformer->reverseTransform($value));
}
Expand All @@ -77,15 +76,15 @@ public function getReverseTransformTrueData()
{
return array_map(function($value) {
return array($value);
}, BooleanType::$TRUE_VALUES);
}, array(1, '1', true, 'true'));
}

/**
* @dataProvider getReverseTransformFalseData
*/
public function testReverseTransformFalse($value)
{
$transformer = new BooleanTypeToBooleanTransformer();
$transformer = new BooleanTypeToBooleanTransformer(array(1, '1', true, 'true'), array(0, '0', false, 'false'));

static::assertFalse($transformer->reverseTransform($value));
}
Expand All @@ -94,14 +93,14 @@ public function getReverseTransformFalseData()
{
return array_map(function($value) {
return array($value);
}, BooleanType::$FALSE_VALUES);
}, array(0, '0', false, 'false'));
}

public function testReverseTransformFailed()
{
$this->setExpectedException('Symfony\Component\Form\Exception\TransformationFailedException');

$transformer = new BooleanTypeToBooleanTransformer();
$transformer = new BooleanTypeToBooleanTransformer(array(1, '1', true, 'true'), array(0, '0', false, 'false'));
$transformer->transform('');
}
}
5 changes: 2 additions & 3 deletions tests/Form/Type/BooleanTypeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

namespace FSevestre\BooleanFormTypeTest\Form\Type;

use FSevestre\BooleanFormType\Form\Type\BooleanType;
use Symfony\Component\Form\Test\TypeTestCase;

/**
Expand All @@ -27,7 +26,7 @@ public function getFormTypeTrueData()
{
return array_map(function($value) {
return array($value);
}, BooleanType::$TRUE_VALUES);
}, array(1, '1', true, 'true'));
}

/**
Expand All @@ -48,7 +47,7 @@ public function getFormTypeFalseData()
return array_merge(
array_map(function($value) {
return array($value);
}, BooleanType::$FALSE_VALUES),
}, array(0, '0', false, 'false')),
array(array(null), array(''))
);
}
Expand Down

0 comments on commit aabb0a7

Please # to comment.