kinske
kinske

Reputation: 607

symfony, twig - default filter for all variables in template

Let's say I want to display a larger data set and it is possible that there are many null / empty values. I don't want to define default filter for every variable. Is there a way to display a default value for all (empty, null) variables in a template (like: "not specified").

EDIT:

twig:

{# src/KuMiV/EmployeeBundle/Resources/views/Other/detailItem.html.twig #}
{% extends "base.html.twig" %}
...
{% block content %}   
    <h3 class="sub-header">Personenbezogene Angaben</h3>
        <div class="row">
            <div class="col-md-3">             
                <label> ID </label><p>{{ employee.id }} </p>
            </div>
            <div class="col-md-3">  
                <label> Titel </label><p>{{ employee.title|default('keine Angabe') }} </p>
            </div>
            <div class="col-md-3">             
                <label> Vorname </label><p>{{ employee.firstName }} </p>
            </div>
            <div class="col-md-3">                
                <label> Nachname </label><p>{{ employee.lastName }} </p>
            </div>
        </div>
        <div class="row">
            <div class="col-md-3"> 
                <label> Geschlecht </label><p>{{ employee.gender }} </p>
            </div>
            <div class="col-md-3">               
                <label> Email </label><p>{{ employee.email|default('keine Angabe') }} </p>
            </div>
            <div class="col-md-3">               
                <label> Telefon 1</label><p>{{ employee.phone1|default('keine Angabe') }} </p>
            </div>
            <div class="col-md-3">              
                <label> Telefon 2 </label><p>{{ employee.phone2|default('keine Angabe') }} </p>
            </div>
        </div>
        ...
{% endblock content %}

Controller:

class DefaultController extends Controller
{
 public function detailAction($id)
    {
        $employee = $this->getDoctrine("Employee")
                ->getRepository("EmployeeBundle:Employee")
                ->find($id);

        return $this->render('EmployeeBundle:Other:detail.html.twig', array(
            'employee' => $employee,
        ));
    }
}

Upvotes: 1

Views: 2975

Answers (1)

Javad
Javad

Reputation: 4397

You may need to create a custom twig extension for this.

namespace Employee\EmployeeBundle\Twig;
class EmployeeExtension extends \Twig_Extension
{
   public function getFilters()
   {
      return array(
         new \Twig_SimpleFilter('setDefaults', array($this, 'setDefaultFilter')),
      );
   }

   public function setDefaultFilter($employee)
   {
      $employee.title = !empty($employee.title) ? $employee.title : 'keine Angabe';
      $employee.email = !empty($employee.email) ? $employee.email : 'keine Angabe';
      //... So on; continue for others
      return $employee;
   }

   public function getName()
   {
      return 'employee_extension';
   }
}

Keep in mind to register the extension as a service:

services:
   employee.twig.employee_extension:
      class: Employee\EmployeeBundle\Twig\EmployeeExtension
      tags:
         - { name: twig.extension }

Now you can use it in your twig file as:

{% set employee = employee|setDefaults %}

Still I believe the default filter in twig is better.

Upvotes: 1

Related Questions