5 votes

Un moyen intelligent de masquer tout élément de toute vue dans Laravel 5.3 ?

Je suis confronté à un problème où je ne veux pas afficher un élément X dans certaines vues.

L'exemple concret est que je ne veux pas afficher le curseur des images de produits sur les pages. contact y about us mais il devrait être visible sur toutes les autres pages (environ 6 de plus).

Alors comment exclure le rendu de la div en n de m pages sans faire de très longues @if conditions ? Une idée de solution élégante ?

Editar Je réponds à la question de savoir pourquoi je ne veux pas mettre cela dans un fichier de vue autonome :
Imaginez que vous voulez que cette ligne soit visible dans toutes vos vues sauf une spécifique, et une seule

<span>Lorem Ipsum</span>

Il s'agit d'une simple ligne de code HTML, ce n'est pas la peine de créer un autre fichier dans le projet parce que ce sera un désordre dans l'arbre des fichiers du projet, et un autre exemple qui est une mauvaise solution de contournement.

@if(\Request::route()->getName() !== "some.very.long.route.alias.name.that.looks.ugly")
    <span>Lorem Ipsum</span>
@endif

Rend le code difficile à lire et à comprendre lorsque le projet s'étend.

Edit 2 J'ai prédit certaines des solutions suggérées et j'ai déjà écrit pourquoi ce n'est pas une façon appropriée de gérer cette situation. Je cherche plus probablement une solution qui soit similaire à @can ou @cannot qui dépend de l'itinéraire actuel

Edit 3 : Travailler sur la solution

Edit 4 : J'ai posté une réponse ici mais elle n'est pas encore parfaite (je ne la marque pas encore comme acceptée), donc juste pour les lecteurs de ce sujet je vais coller la copie de celle-ci ci-dessous

Ok j'ai fait une simple directive de lame qui résout ce cas dans une manière agréable à regarder

Dans un premier temps, créez un tableau qui détermine l'accès à la route pour le html snippet
Le meilleur endroit serait de créer ce fichier dans la configuration par exemple dans le répertoire presence.php fichier

<?php
return [
    'ipsum' => [            // presence alias
        'about',            // disallowed route #1
        'contact'           // disallowed route #2
    ],
];

Ensuite, créez une directive dans AppServiceProvider.php classe

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Blade::directive('presence', function($alias) {
            return "<?php if (in_array(\Request::route()->getName(),config('presence.'.$alias))):?>";
        });

        Blade::directive('endpresence', function() {
            return '<?php endif; ?>';
        });
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Et dans l'utilisation finale de cette astuce en vue html

@presence('ipsum')
    <span>Lorem Ipsum</span>
@endpresence

Il imprimera Lorem Ipsum si le nom de l'itinéraire actuel n'est pas dans ipsum (qui est déclaré dans \App\config\presence.php fichier donc nous pouvons y accéder avec config() méthode d'aide)

Ce serait génial si je pouvais gérer les caractères génériques, comme par exemple

<?php
return [
    'ipsum' => [            // presence alias
        'admin.category.*',       // advanced route pattern #1
        'admin.users.*'           // advanced route pattern #2
    ],
];

Mais je vais y réfléchir plus tard.

Les commentaires ou les critiques sont toujours les bienvenus :)

1voto

yarwest Points 587

Si vous utilisez un modèle de lame, vous pouvez créer deux mises en page différentes. Une avec le curseur d'image et une sans. C'est la solution la plus simple à laquelle j'ai pensé de prime abord.

EDITAR: La création d'une autre mise en page, surtout si toutes vos mises en page se trouvent dans un dossier distinct, ne créera pas de désordre dans la structure des fichiers et cela en vaut vraiment la peine.

0voto

user3158900 Points 17041

Si contact y about us ont leurs propres URI, vous pouvez essayer de les faire correspondre pour déterminer si vous devez afficher l'élément ou non...

if (!\Request::is('contact') && !\Request::is('about-us')) {
    // Show element X
}

Une autre façon de procéder serait d'ajouter un intergiciel qui définit une certaine variable, par exemple $dontShowElement et met en place un compositeur de vues et passe cette variable à toutes les vues. Ensuite, tout ce que vous avez à faire est de vérifier l'existence de cette variable avant de sortir l'élément et de ne donner que les 2 routes pour lesquelles vous voulez que l'élément soit caché sur ce middleware.

0voto

Bartłomiej Sobieszek Points 1133

Ok, j'ai créé une simple directive de lame qui résout ce cas de manière agréable à regarder.

Tout d'abord, créez un tableau qui détermine l'accès à la route pour le snippet html.
Le meilleur endroit serait de créer ce fichier dans le répertoire de configuration, par exemple un presence.php fichier

<?php
return [
    'ipsum' => [            // presence alias
        'about',            // disallowed route #1
        'contact'           // disallowed route #2
    ],
];

Ensuite, créez une directive dans AppServiceProvider.php classe

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Blade::directive('presence', function($alias) {
            return "<?php if (in_array(\Request::route()->getName(), config('presence.'.$alias))): ?>";
        });

        Blade::directive('endpresence', function() {
            return '<?php endif; ?>';
        });
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Et dans l'utilisation finale de cette astuce en vue html

@presence('ipsum')
    <span>Lorem Ipsum</span>
@endpresence

Il imprimera Lorem Ipsum si le nom de l'itinéraire actuel n'est pas dans ipsum (qui est déclaré dans \App\config\presence.php afin que nous puissions y accéder avec config() méthode d'aide)

Ce serait génial si je pouvais gérer les caractères de remplacement, comme par exemple

<?php
return [
    'ipsum' => [            // presence alias
        'admin.category.*',       // advanced route pattern #1
        'admin.users.*'           // advanced route pattern #2
    ],
];

Mais je vais y réfléchir plus tard.

Les commentaires et les critiques sont toujours les bienvenus :)

0voto

Pratik Kumar Points 53

Copiez ceci dans App/Http/helper.php

function is_path($path){
        return call_user_func_array('Request::is', (array)$path) ? true : false;
    } 

Voir

@if(is_path('about'))
<h1>About</h1>
@endif
Mai this will help you

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X