mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-12 13:24:25 +00:00
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:
parent
9ca2be78eb
commit
fe73a64e9d
37
CustomFields/AbstractCustomField.php
Normal file
37
CustomFields/AbstractCustomField.php
Normal 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);
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
{
|
||||
/**
|
||||
*
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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 }
|
||||
|
||||
|
@ -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 %}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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()
|
||||
*/
|
||||
|
@ -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']));
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user