Menu

Vérifier si une section Laravel Blade est vide

Publié en Mars 2016 - Développement web, Logiciel Libre

laravel

Si vous avez besoin d'afficher une portion de HTML dans votre vue Blade, seulement si une section n'est pas vide, voici une petite astuce (sous Laravel 5.2).

Par exemple, vous souhaitez garder la structure de la "sidebar" de votre site dans votre vue principale master.blade.php pour ne pas avoir à répéter à chaque fois les tags HTML dans le vues qui l'étende. Un format simple pourrait être :

<div id="sidebar">
    <div class="wrapper">
        @yield('sidebar')
    </div>
</div>
<div id="main">...</div>

Le soucis est donc que dans votre CSS vous avez stylisé la "sidebar" et si elle ne contient rien, elle prend toujours de la place dans le visuel. Le solution pour ne pas l'afficher quand la section est vide est d'utiliser la variable $__env disponible dans les vues Blades et qui représente le compilateur Illuminate\View\Factory. Elle donne accès à des méthodes de lecture du contenu des sections :

@if (trim($__env->yieldContent('sidebar')))
    <div id="sidebar">
        <div class="wrapper">
            @yield('sidebar')
        </div>
    </div>
@endif
<div id="main">...</div>

Ca marche, cependant ce n'est pas une écriture très agréable donc vous pouvez étendre Blade pour ajouter une directive qui fera ce test. Ceci est à ajouter dans la méthode boot() de votre fichier app/Providers/AppServiceProvider.php :

public function boot()
{
    Blade::directive('ifSectionNotEmpty', function ($section) {
        return "<?php if (trim(\$__env->yieldContent({$section}))): ?>";
    });
}

Pour une utilisation des plus simple :

@ifSectionNotEmpty('sidebar')
    <div id="sidebar">
        <div class="wrapper">
            @yield('sidebar')
        </div>
    </div>
@endif
<div id="main">...</div>

Et voila ça fonctionne !