From 3230659a4ba77b394928aff3209cd08d4d1fc0bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 10 Dec 2015 17:16:59 +0100 Subject: [PATCH] add a required field to custom fields type ref Chill-project/Chill-CustomFields#17 --- CustomFields/CustomFieldChoice.php | 2 +- Entity/CustomField.php | 34 +++++++++++++ Form/CustomFieldType.php | 5 ++ Form/Type/CustomFieldType.php | 2 + Resources/config/doctrine/CustomField.orm.yml | 2 + .../migrations/Version20151210155904.php | 35 ++++++++++++++ Resources/translations/messages.fr.yml | 3 ++ Resources/views/CustomField/edit.html.twig | 1 + Resources/views/CustomField/new.html.twig | 1 + .../CustomFieldsGroupControllerTest.php | 5 +- Tests/CustomFields/CustomFieldsNumberTest.php | 48 +++++++++++++++++++ 11 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 Resources/migrations/Version20151210155904.php diff --git a/CustomFields/CustomFieldChoice.php b/CustomFields/CustomFieldChoice.php index 9bad639d6..6f23b6339 100644 --- a/CustomFields/CustomFieldChoice.php +++ b/CustomFields/CustomFieldChoice.php @@ -94,7 +94,7 @@ class CustomFieldChoice implements CustomFieldInterface $options = array( 'multiple' => $customFieldOptions[self::MULTIPLE], 'choices' => $choices, - 'required' => false, + 'required' => $customField->isRequired(), 'label' => $this->translatableStringHelper->localize($customField->getName())); //if allow_other = true diff --git a/Entity/CustomField.php b/Entity/CustomField.php index 2b45b498c..fe1a3bc89 100644 --- a/Entity/CustomField.php +++ b/Entity/CustomField.php @@ -60,6 +60,12 @@ class CustomField */ private $ordering; + /** + * + * @var bolean + */ + private $required = FALSE; + const ONE_TO_ONE = 1; const ONE_TO_MANY = 2; @@ -246,6 +252,34 @@ class CustomField $this->slug = $slug; return $this; } + + /** + * alias for isRequired + * + * @return boolean + */ + public function getRequired() + { + return $this->isRequired(); + } + + /** + * return true if the field required + * + * @return boolean + */ + public function isRequired() + { + return $this->required; + } + + public function setRequired($required) + { + $this->required = $required; + return $this; + } + + } diff --git a/Form/CustomFieldType.php b/Form/CustomFieldType.php index 9638cefca..1d3594718 100644 --- a/Form/CustomFieldType.php +++ b/Form/CustomFieldType.php @@ -66,6 +66,11 @@ class CustomFieldType extends AbstractType $builder ->add('ordering', 'number') + ->add('required', 'checkbox', array( + 'required' => false, + //'expanded' => TRUE, + 'label' => 'Required field' + )) ->add('type', 'hidden', array('data' => $options['type'])) ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { diff --git a/Form/Type/CustomFieldType.php b/Form/Type/CustomFieldType.php index 8a202e369..5e6ad0379 100644 --- a/Form/Type/CustomFieldType.php +++ b/Form/Type/CustomFieldType.php @@ -20,6 +20,7 @@ use Chill\CustomFieldsBundle\Service\CustomFieldProvider; use Chill\CustomFieldsBundle\Form\DataTransformer\CustomFieldDataTransformer; use Chill\CustomFieldsBundle\Entity\CustomFieldsGroup; use Symfony\Component\OptionsResolver\OptionsResolver; +use Chill\CustomFieldsBundle\CustomFields\CustomFieldTitle; class CustomFieldType extends AbstractType { @@ -50,6 +51,7 @@ class CustomFieldType extends AbstractType $this->customFieldCompiler ->getCustomFieldByType($cf->getType()) ->buildForm($builder, $cf); + $builder->get($cf->getSlug())->setRequired($cf->isRequired()); } } diff --git a/Resources/config/doctrine/CustomField.orm.yml b/Resources/config/doctrine/CustomField.orm.yml index 595e96db5..5e6651158 100644 --- a/Resources/config/doctrine/CustomField.orm.yml +++ b/Resources/config/doctrine/CustomField.orm.yml @@ -22,6 +22,8 @@ Chill\CustomFieldsBundle\Entity\CustomField: type: float options: type: json_array + required: + type: boolean lifecycleCallbacks: { } manyToOne: customFieldGroup: diff --git a/Resources/migrations/Version20151210155904.php b/Resources/migrations/Version20151210155904.php new file mode 100644 index 000000000..f3d9eadf3 --- /dev/null +++ b/Resources/migrations/Version20151210155904.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() != 'postgresql', 'Migration can only be executed safely on \'postgresql\'.'); + + $this->addSql('ALTER TABLE customfield ADD required BOOLEAN DEFAULT FALSE'); + } + + /** + * @param Schema $schema + */ + public function down(Schema $schema) + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() != 'postgresql', 'Migration can only be executed safely on \'postgresql\'.'); + + $this->addSql('ALTER TABLE CustomField DROP required'); + + } +} diff --git a/Resources/translations/messages.fr.yml b/Resources/translations/messages.fr.yml index 2f4f55746..0c5965eb8 100644 --- a/Resources/translations/messages.fr.yml +++ b/Resources/translations/messages.fr.yml @@ -39,6 +39,9 @@ General informations: Informations générales Options: Options Custom fields group: Groupe de champ personnalisé Ordering: Ordre d'apparition +Required field: Champs requis +An answer is required: Une réponse est requise +Any answer is required: Aucune réponse n'est requise Back to the group: Retour au groupe de champs personnalisé Slug: Identifiant textuel The custom field has been created: Le champ personnalisé est créé diff --git a/Resources/views/CustomField/edit.html.twig b/Resources/views/CustomField/edit.html.twig index 08fbed2ce..019a02d95 100644 --- a/Resources/views/CustomField/edit.html.twig +++ b/Resources/views/CustomField/edit.html.twig @@ -29,6 +29,7 @@ {{ form_row(edit_form.customFieldsGroup) }} {% endif %} {{ form_row(edit_form.ordering) }} + {{ form_row(edit_form.required) }} {% if edit_form.options is not empty %}

{{ 'Options'|trans }}

{% for option in edit_form.options %} diff --git a/Resources/views/CustomField/new.html.twig b/Resources/views/CustomField/new.html.twig index 783cbb1d6..d06ee0cc3 100644 --- a/Resources/views/CustomField/new.html.twig +++ b/Resources/views/CustomField/new.html.twig @@ -30,6 +30,7 @@ {{ form_row(form.customFieldsGroup) }} {% endif %} {{ form_row(form.ordering) }} + {{ form_row(form.required) }} {% if form.options is not empty %}

{{ 'Options'|trans }}

{% for option in form.options %} diff --git a/Tests/Controller/CustomFieldsGroupControllerTest.php b/Tests/Controller/CustomFieldsGroupControllerTest.php index b6bc3bbee..420c4bf4c 100644 --- a/Tests/Controller/CustomFieldsGroupControllerTest.php +++ b/Tests/Controller/CustomFieldsGroupControllerTest.php @@ -51,7 +51,10 @@ class CustomFieldsGroupControllerTest extends WebTestCase private function editCustomFieldsGroup(Client $client) { $crawler = $client->request('GET', '/fr/admin/customfieldsgroup/'); - $crawler = $client->click($crawler->selectLink('modifier')->link()); + $links = $crawler->selectLink('modifier'); + $crawler = $client->click($links->last()->link()); + + $this->assertEquals(200, $client->getResponse()->getStatusCode()); $form = $crawler->selectButton('Update')->form(array( 'custom_fields_group[name][fr]' => 'Foo', diff --git a/Tests/CustomFields/CustomFieldsNumberTest.php b/Tests/CustomFields/CustomFieldsNumberTest.php index 466e03ab4..fb4d44a26 100644 --- a/Tests/CustomFields/CustomFieldsNumberTest.php +++ b/Tests/CustomFields/CustomFieldsNumberTest.php @@ -22,6 +22,8 @@ namespace Chill\CustomFieldsBundle\Tests; use Chill\CustomFieldsBundle\CustomFields\CustomFieldNumber; use Symfony\Component\Form\FormBuilderInterface; use Chill\CustomFieldsBundle\Entity\CustomField; +use Chill\CustomFieldsBundle\Entity\CustomFieldsGroup; +use Chill\CustomFieldsBundle\Form\CustomFieldsGroupType; /** * Test CustomFieldsNumber @@ -139,5 +141,51 @@ class CustomFieldsNumberTest extends \Symfony\Bundle\FrameworkBundle\Test\WebTes $this->assertEquals(1, count($form['default']->getErrors())); } + public function testRequiredFieldIsFalse() + { + $cf = $this->createCustomFieldNumber(array( + 'min' => 1000, + 'max' => null, + 'scale' => null, + 'post_text' => null + )); + $cf->setRequired(false); + + $cfGroup = (new \Chill\CustomFieldsBundle\Entity\CustomFieldsGroup()) + ->addCustomField($cf); + + $form = static::$kernel->getContainer()->get('form.factory') + ->createBuilder('custom_field', array(), array( + 'group' => $cfGroup + )) + ->getForm(); + + $this->assertFalse($form['default']->isRequired(), + "The field should not be required"); + } + + public function testRequiredFieldIsTrue() + { + $cf = $this->createCustomFieldNumber(array( + 'min' => 1000, + 'max' => null, + 'scale' => null, + 'post_text' => null + )); + $cf->setRequired(true); + + $cfGroup = (new \Chill\CustomFieldsBundle\Entity\CustomFieldsGroup()) + ->addCustomField($cf); + + $form = static::$kernel->getContainer()->get('form.factory') + ->createBuilder('custom_field', array(), array( + 'group' => $cfGroup + )) + ->getForm(); + + $this->assertTrue($form['default']->isRequired(), + "The field should be required"); + } + }