Add possibility to hide empty value in customfield group view rendering

A new parameter is defined :

```
chill_custom_fields:
    show_empty_values_in_views = true|false
```

A new method is added to CustomFieldInterface: `isEmptyValue`. To ease
the dev of new classes, an AbstractCustomField class is created, which
implements the most commons function (currently, only isEmptyValue).

A new Twig Filter is added: `chill_custom_field_is_empty`

The twig filter `chill_custom_fields_group_widget` has a new possibility
in array option : `show_empty`. Default to
chill_custom_fields.show_empty_values_in_view. May be forced by
true/false.
This commit is contained in:
Julien Fastré 2015-12-15 11:11:36 +01:00
parent 9ca2be78eb
commit fe73a64e9d
14 changed files with 131 additions and 27 deletions

View File

@ -0,0 +1,37 @@
<?php
/*
* Copyright (C) 2015 Julien Fastré <julien.fastre@champs-libres.coop>
*
* 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 <http://www.gnu.org/licenses/>.
*/
namespace Chill\CustomFieldsBundle\CustomFields;
use Chill\CustomFieldsBundle\CustomFields\CustomFieldInterface;
use Chill\CustomFieldsBundle\Entity\CustomField;
/**
*
*
* @author Julien Fastré <julien.fastre@champs-libres.coop>
*/
abstract class AbstractCustomField implements CustomFieldInterface
{
public function isEmptyValue($value, CustomField $customField)
{
return (empty($value) and $value !== FALSE);
}
}

View File

@ -38,7 +38,7 @@ use Symfony\Component\Translation\Translator;
* @author Julien Fastré <julien.fastre@champs-libres.coop>
* @author Marc Ducobu <marc@champs-libes.coop>
*/
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;
}
/**
*

View File

@ -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);
}

View File

@ -33,7 +33,7 @@ use Symfony\Bridge\Twig\TwigEngine;
*
* @author Julien Fastré <julien.fastre@champs-libres.coop>
*/
class CustomFieldLongChoice implements CustomFieldInterface
class CustomFieldLongChoice extends AbstractCustomField
{
/**
*

View File

@ -39,7 +39,7 @@ use Chill\MainBundle\Templating\TranslatableStringHelper;
* @author Julien Fastré <julien.fastre@champs-libres.coop>
* @author Marc Ducobu <marc@champs-libres.coop>
*/
class CustomFieldNumber implements CustomFieldInterface
class CustomFieldNumber extends AbstractCustomField
{
/**
* key for the minimal value of the field

View File

@ -33,7 +33,7 @@ use Chill\MainBundle\Templating\TranslatableStringHelper;
* @author Julien Fastré <julien.fastre@champs-libres.coop>
* @author Marc Ducobu <marc@champs-libres.coop>
*/
class CustomFieldText implements CustomFieldInterface
class CustomFieldText extends AbstractCustomField
{
private $requestStack;

View File

@ -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)
{

View File

@ -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)

View File

@ -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;

View File

@ -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 }

View File

@ -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) -%}
<dt>{{ chill_custom_field_label(customField) }}</dt>
<dd>{{ chill_custom_field_widget(cFData , customField) }}</dd>
{% endif %}
{%- endif -%}
{%- endif -%}
{% endfor %}

View File

@ -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);
}
}

View File

@ -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()
*/

View File

@ -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']));
}
}