add a required field to custom fields type

ref Chill-project/Chill-CustomFields#17
This commit is contained in:
Julien Fastré 2015-12-10 17:16:59 +01:00
parent b88bb50b56
commit 3230659a4b
11 changed files with 136 additions and 2 deletions

View File

@ -94,7 +94,7 @@ class CustomFieldChoice implements CustomFieldInterface
$options = array( $options = array(
'multiple' => $customFieldOptions[self::MULTIPLE], 'multiple' => $customFieldOptions[self::MULTIPLE],
'choices' => $choices, 'choices' => $choices,
'required' => false, 'required' => $customField->isRequired(),
'label' => $this->translatableStringHelper->localize($customField->getName())); 'label' => $this->translatableStringHelper->localize($customField->getName()));
//if allow_other = true //if allow_other = true

View File

@ -60,6 +60,12 @@ class CustomField
*/ */
private $ordering; private $ordering;
/**
*
* @var bolean
*/
private $required = FALSE;
const ONE_TO_ONE = 1; const ONE_TO_ONE = 1;
const ONE_TO_MANY = 2; const ONE_TO_MANY = 2;
@ -246,6 +252,34 @@ class CustomField
$this->slug = $slug; $this->slug = $slug;
return $this; 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;
}
} }

View File

@ -66,6 +66,11 @@ class CustomFieldType extends AbstractType
$builder $builder
->add('ordering', 'number') ->add('ordering', 'number')
->add('required', 'checkbox', array(
'required' => false,
//'expanded' => TRUE,
'label' => 'Required field'
))
->add('type', 'hidden', array('data' => $options['type'])) ->add('type', 'hidden', array('data' => $options['type']))
->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event)
{ {

View File

@ -20,6 +20,7 @@ use Chill\CustomFieldsBundle\Service\CustomFieldProvider;
use Chill\CustomFieldsBundle\Form\DataTransformer\CustomFieldDataTransformer; use Chill\CustomFieldsBundle\Form\DataTransformer\CustomFieldDataTransformer;
use Chill\CustomFieldsBundle\Entity\CustomFieldsGroup; use Chill\CustomFieldsBundle\Entity\CustomFieldsGroup;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
use Chill\CustomFieldsBundle\CustomFields\CustomFieldTitle;
class CustomFieldType extends AbstractType class CustomFieldType extends AbstractType
{ {
@ -50,6 +51,7 @@ class CustomFieldType extends AbstractType
$this->customFieldCompiler $this->customFieldCompiler
->getCustomFieldByType($cf->getType()) ->getCustomFieldByType($cf->getType())
->buildForm($builder, $cf); ->buildForm($builder, $cf);
$builder->get($cf->getSlug())->setRequired($cf->isRequired());
} }
} }

View File

@ -22,6 +22,8 @@ Chill\CustomFieldsBundle\Entity\CustomField:
type: float type: float
options: options:
type: json_array type: json_array
required:
type: boolean
lifecycleCallbacks: { } lifecycleCallbacks: { }
manyToOne: manyToOne:
customFieldGroup: customFieldGroup:

View File

@ -0,0 +1,35 @@
<?php
namespace Application\Migrations;
use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;
/**
* Auto-generated Migration: Please modify to your needs!
*/
class Version20151210155904 extends AbstractMigration
{
/**
* @param Schema $schema
*/
public function up(Schema $schema)
{
// this up() 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 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');
}
}

View File

@ -39,6 +39,9 @@ General informations: Informations générales
Options: Options Options: Options
Custom fields group: Groupe de champ personnalisé Custom fields group: Groupe de champ personnalisé
Ordering: Ordre d'apparition 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é Back to the group: Retour au groupe de champs personnalisé
Slug: Identifiant textuel Slug: Identifiant textuel
The custom field has been created: Le champ personnalisé est créé The custom field has been created: Le champ personnalisé est créé

View File

@ -29,6 +29,7 @@
{{ form_row(edit_form.customFieldsGroup) }} {{ form_row(edit_form.customFieldsGroup) }}
{% endif %} {% endif %}
{{ form_row(edit_form.ordering) }} {{ form_row(edit_form.ordering) }}
{{ form_row(edit_form.required) }}
{% if edit_form.options is not empty %} {% if edit_form.options is not empty %}
<h2>{{ 'Options'|trans }}</h2> <h2>{{ 'Options'|trans }}</h2>
{% for option in edit_form.options %} {% for option in edit_form.options %}

View File

@ -30,6 +30,7 @@
{{ form_row(form.customFieldsGroup) }} {{ form_row(form.customFieldsGroup) }}
{% endif %} {% endif %}
{{ form_row(form.ordering) }} {{ form_row(form.ordering) }}
{{ form_row(form.required) }}
{% if form.options is not empty %} {% if form.options is not empty %}
<h2>{{ 'Options'|trans }}</h2> <h2>{{ 'Options'|trans }}</h2>
{% for option in form.options %} {% for option in form.options %}

View File

@ -51,7 +51,10 @@ class CustomFieldsGroupControllerTest extends WebTestCase
private function editCustomFieldsGroup(Client $client) private function editCustomFieldsGroup(Client $client)
{ {
$crawler = $client->request('GET', '/fr/admin/customfieldsgroup/'); $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( $form = $crawler->selectButton('Update')->form(array(
'custom_fields_group[name][fr]' => 'Foo', 'custom_fields_group[name][fr]' => 'Foo',

View File

@ -22,6 +22,8 @@ namespace Chill\CustomFieldsBundle\Tests;
use Chill\CustomFieldsBundle\CustomFields\CustomFieldNumber; use Chill\CustomFieldsBundle\CustomFields\CustomFieldNumber;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Chill\CustomFieldsBundle\Entity\CustomField; use Chill\CustomFieldsBundle\Entity\CustomField;
use Chill\CustomFieldsBundle\Entity\CustomFieldsGroup;
use Chill\CustomFieldsBundle\Form\CustomFieldsGroupType;
/** /**
* Test CustomFieldsNumber * Test CustomFieldsNumber
@ -139,5 +141,51 @@ class CustomFieldsNumberTest extends \Symfony\Bundle\FrameworkBundle\Test\WebTes
$this->assertEquals(1, count($form['default']->getErrors())); $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");
}
} }