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