diff --git a/CustomFields/AbstractCustomField.php b/CustomFields/AbstractCustomField.php new file mode 100644 index 000000000..ddd019176 --- /dev/null +++ b/CustomFields/AbstractCustomField.php @@ -0,0 +1,37 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace Chill\CustomFieldsBundle\CustomFields; + +use Chill\CustomFieldsBundle\CustomFields\CustomFieldInterface; +use Chill\CustomFieldsBundle\Entity\CustomField; + +/** + * + * + * @author Julien Fastré + */ +abstract class AbstractCustomField implements CustomFieldInterface +{ + public function isEmptyValue($value, CustomField $customField) + { + return (empty($value) and $value !== FALSE); + } + +} diff --git a/CustomFields/CustomFieldChoice.php b/CustomFields/CustomFieldChoice.php index 6f23b6339..8b0d0f647 100644 --- a/CustomFields/CustomFieldChoice.php +++ b/CustomFields/CustomFieldChoice.php @@ -38,7 +38,7 @@ use Symfony\Component\Translation\Translator; * @author Julien Fastré * @author Marc Ducobu */ -class CustomFieldChoice implements CustomFieldInterface +class CustomFieldChoice extends AbstractCustomField { const ALLOW_OTHER = 'other'; const OTHER_VALUE_LABEL = 'otherValueLabel'; @@ -174,6 +174,11 @@ class CustomFieldChoice implements CustomFieldInterface { return 'Choices'; } + + public function isEmptyValue($value, CustomField $customField) + { + return $value['_choices'] === NULL; + } /** * diff --git a/CustomFields/CustomFieldInterface.php b/CustomFields/CustomFieldInterface.php index 994172e41..ce341142d 100644 --- a/CustomFields/CustomFieldInterface.php +++ b/CustomFields/CustomFieldInterface.php @@ -58,4 +58,12 @@ interface CustomFieldInterface * @return \Symfony\Component\Form\FormTypeInterface|null the form type */ public function buildOptionsForm(FormBuilderInterface $builder); + + /** + * Return if the value can be considered as empty + * + * @param mixed $value the value passed throug the deserialize function + * @param CustomField $customField + */ + public function isEmptyValue($value, CustomField $customField); } diff --git a/CustomFields/CustomFieldLongChoice.php b/CustomFields/CustomFieldLongChoice.php index a66de9dc2..58285d132 100644 --- a/CustomFields/CustomFieldLongChoice.php +++ b/CustomFields/CustomFieldLongChoice.php @@ -33,7 +33,7 @@ use Symfony\Bridge\Twig\TwigEngine; * * @author Julien Fastré */ -class CustomFieldLongChoice implements CustomFieldInterface +class CustomFieldLongChoice extends AbstractCustomField { /** * diff --git a/CustomFields/CustomFieldNumber.php b/CustomFields/CustomFieldNumber.php index d880f8a17..b87dfe685 100644 --- a/CustomFields/CustomFieldNumber.php +++ b/CustomFields/CustomFieldNumber.php @@ -39,7 +39,7 @@ use Chill\MainBundle\Templating\TranslatableStringHelper; * @author Julien Fastré * @author Marc Ducobu */ -class CustomFieldNumber implements CustomFieldInterface +class CustomFieldNumber extends AbstractCustomField { /** * key for the minimal value of the field diff --git a/CustomFields/CustomFieldText.php b/CustomFields/CustomFieldText.php index a11705707..c2189bb88 100644 --- a/CustomFields/CustomFieldText.php +++ b/CustomFields/CustomFieldText.php @@ -33,7 +33,7 @@ use Chill\MainBundle\Templating\TranslatableStringHelper; * @author Julien Fastré * @author Marc Ducobu */ -class CustomFieldText implements CustomFieldInterface +class CustomFieldText extends AbstractCustomField { private $requestStack; diff --git a/CustomFields/CustomFieldTitle.php b/CustomFields/CustomFieldTitle.php index 6c15543eb..23f9f5e2b 100644 --- a/CustomFields/CustomFieldTitle.php +++ b/CustomFields/CustomFieldTitle.php @@ -28,7 +28,7 @@ use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Bundle\TwigBundle\TwigEngine; use Chill\MainBundle\Templating\TranslatableStringHelper; -class CustomFieldTitle implements CustomFieldInterface +class CustomFieldTitle extends AbstractCustomField { const TYPE = 'type'; const TYPE_TITLE = 'title'; @@ -92,6 +92,11 @@ class CustomFieldTitle implements CustomFieldInterface { return 'title'; } + + public function isEmptyValue($value, CustomField $customField) + { + return false; + } public function buildOptionsForm(FormBuilderInterface $builder) { diff --git a/DependencyInjection/ChillCustomFieldsExtension.php b/DependencyInjection/ChillCustomFieldsExtension.php index 3aaab5933..05c4108e4 100644 --- a/DependencyInjection/ChillCustomFieldsExtension.php +++ b/DependencyInjection/ChillCustomFieldsExtension.php @@ -33,6 +33,8 @@ class ChillCustomFieldsExtension extends Extension implements PrependExtensionIn $container->setParameter('chill_custom_fields.customizables_entities', $config['customizables_entities']); + $container->setParameter('chill_custom_fields.show_empty_values', + $config['show_empty_values_in_views']); } /* (non-PHPdoc) diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 232a1a9a2..84c2147bb 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -35,27 +35,35 @@ class Configuration implements ConfigurationInterface ->defaultValue(array()) ->prototype('array') ->children() - ->scalarNode('class')->isRequired()->info($classInfo)->end() - ->scalarNode('name') ->isRequired()->info($nameInfo) ->end() + ->scalarNode('class')->isRequired()->info($classInfo) + ->end() + ->scalarNode('name') ->isRequired()->info($nameInfo) + ->end() ->arrayNode('options') - ->info($optionsInfo) - ->defaultValue(array()) - ->useAttributeAsKey('key') - ->prototype('array') - ->children() - ->scalarNode('form_type') - ->isRequired() - ->info($optionsFormType) - ->end() - ->variableNode('form_options') - ->info($optionsFormOptionsInfos) - ->defaultValue(array()) - ->end() + ->info($optionsInfo) + ->defaultValue(array()) + ->useAttributeAsKey('key') + ->prototype('array') + ->children() + ->scalarNode('form_type') + ->isRequired() + ->info($optionsFormType) ->end() + ->variableNode('form_options') + ->info($optionsFormOptionsInfos) + ->defaultValue(array()) + ->end() + ->end() ->end() ->end() ->end() ->end() + ->end() + ->booleanNode('show_empty_values_in_views') + ->info('Show the empty value for custom fields in the views, timeline, ...') + ->defaultValue(true) + ->end() + ->end() ; return $treeBuilder; diff --git a/Resources/config/services.yml b/Resources/config/services.yml index e2c971c75..1e03b8bf2 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -106,6 +106,8 @@ services: class: Chill\CustomFieldsBundle\Templating\Twig\CustomFieldsGroupRenderingTwig calls: - [setContainer, ["@service_container"]] + arguments: + - "%chill_custom_fields.show_empty_values%" tags: - { name: twig.extension } diff --git a/Resources/views/CustomFieldsGroup/render.html.twig b/Resources/views/CustomFieldsGroup/render.html.twig index a63183233..e325432a0 100644 --- a/Resources/views/CustomFieldsGroup/render.html.twig +++ b/Resources/views/CustomFieldsGroup/render.html.twig @@ -2,7 +2,9 @@ {% if customField.type == 'title' %} {{ chill_custom_field_widget(cFData , customField) }} {% else %} + {%- if show_empty == true or (chill_custom_field_is_empty(customField, cFData) == false) -%}
{{ chill_custom_field_label(customField) }}
{{ chill_custom_field_widget(cFData , customField) }}
- {% endif %} + {%- endif -%} + {%- endif -%} {% endfor %} \ No newline at end of file diff --git a/Service/CustomFieldsHelper.php b/Service/CustomFieldsHelper.php index 477c190ad..07c8c4f04 100644 --- a/Service/CustomFieldsHelper.php +++ b/Service/CustomFieldsHelper.php @@ -137,6 +137,17 @@ class CustomFieldsHelper : null; } + public function isEmptyValue(array $fields, $classOrCustomField, $slug = null) + { + $customField = ($classOrCustomField instanceof CustomField) ? $classOrCustomField : $this->getCustomField($classOrCustomField, $slug); + $slug = $customField->getSlug(); + $rawValue = (isset($fields[$slug])) ? $fields[$slug] : null; + + $customFieldType = $this->provider->getCustomFieldByType($customField->getType()); + + return $customFieldType->isEmptyValue($rawValue, $customField); + } + /** * Render the value of a custom field * @@ -144,16 +155,17 @@ class CustomFieldsHelper * @param CustomField|object|string $classOrCustomField the object OR the get_class($object) string OR The CustomField * @param string $documentType The type of document in which the rendered value is displayed ('html' or 'csv'). * @param string $slug The slug of the custom field to render. + * @param boolean $showIfEmpty If the widget must be rendered if the value is empty. An empty value is all values described as http://php.net/manual/fr/function.empty.php, except `FALSE` * @throws CustomFieldsHelperException if slug is missing * @return The representation of the value the customField. */ - public function renderCustomField(array $fields, $classOrCustomField, $documentType='html', $slug = null) + public function renderCustomField(array $fields, $classOrCustomField, $documentType='html', $slug = null, $showIfEmpty = true) { $customField = ($classOrCustomField instanceof CustomField) ? $classOrCustomField : $this->getCustomField($classOrCustomField, $slug); $slug = $customField->getSlug(); $rawValue = (isset($fields[$slug])) ? $fields[$slug] : null; + $customFieldType = $this->provider->getCustomFieldByType($customField->getType()); - return $this->provider->getCustomFieldByType($customField->getType()) - ->render($rawValue, $customField, $documentType); + return $customFieldType->render($rawValue, $customField, $documentType); } } \ No newline at end of file diff --git a/Templating/Twig/CustomFieldRenderingTwig.php b/Templating/Twig/CustomFieldRenderingTwig.php index be155abe3..8561d26f8 100644 --- a/Templating/Twig/CustomFieldRenderingTwig.php +++ b/Templating/Twig/CustomFieldRenderingTwig.php @@ -76,10 +76,21 @@ class CustomFieldRenderingTwig extends \Twig_Extension implements ContainerAware 'is_safe' => array( 'html' ) + )), + new \Twig_SimpleFunction('chill_custom_field_is_empty', array( + $this, + 'isEmptyValue' )) ]; } + + public function isEmptyValue($customFieldorClass, $fields, $slug = null) + { + return $this->container->get('chill.custom_field.helper') + ->isEmptyValue($fields, $customFieldorClass); + } + /* (non-PHPdoc) * @see Twig_ExtensionInterface::getName() */ diff --git a/Templating/Twig/CustomFieldsGroupRenderingTwig.php b/Templating/Twig/CustomFieldsGroupRenderingTwig.php index af6dbb585..a6b9305c0 100644 --- a/Templating/Twig/CustomFieldsGroupRenderingTwig.php +++ b/Templating/Twig/CustomFieldsGroupRenderingTwig.php @@ -37,15 +37,25 @@ use Chill\CustomFieldsBundle\Entity\CustomField; */ class CustomFieldsGroupRenderingTwig extends \Twig_Extension implements ContainerAwareInterface { - + /** @var Container $container The container */ private $container; /** @var array $defaultParams The default parameters */ private $defaultParams = array( - 'layout' => 'ChillCustomFieldsBundle:CustomFieldsGroup:render.html.twig' + 'layout' => 'ChillCustomFieldsBundle:CustomFieldsGroup:render.html.twig', + 'show_empty' => True ); + /** + * + * @param boolean $showEmptyValues whether the empty values must be rendered + */ + public function __construct($showEmptyValues) + { + $this->defaultParams['show_empty'] = $showEmptyValues; + } + /* * (non-PHPdoc) * @see \Symfony\Component\DependencyInjection\ContainerAwareInterface::setContainer() @@ -92,6 +102,7 @@ class CustomFieldsGroupRenderingTwig extends \Twig_Extension implements Containe * @param array $params The parameters for rendering : * - layout : allow to choose a different layout by default : * ChillCustomFieldsBundle:CustomFieldsGroup:render.html.twig + * - show_empty : force show empty field * @return string HTML representation of the custom field group value, as described in * the CustomFieldInterface. Is HTML safe */ @@ -102,6 +113,7 @@ class CustomFieldsGroupRenderingTwig extends \Twig_Extension implements Containe return $this->container->get('templating') ->render($resolvedParams['layout'], array( 'cFGroup' => $customFielsGroup, - 'cFData' => $fields)); + 'cFData' => $fields, + 'show_empty' => $resolvedParams['show_empty'])); } } \ No newline at end of file