从Laravel 5.3中的任何视图中隐藏任何元素的智能方法?

时间:2016-10-18 20:01:33

标签: php laravel user-interface

我遇到一个问题,我不想在某些视图中显示X元素。

真实的例子是,我不想在页面contactabout us上显示产品图片滑块,但它应该在所有其他页面上显示(大约6个以上)

那么如何排除在 m 页面的 n 中渲染div而不会产生很长的@if条件? 想要时尚的解决方案吗?

修改 回答我为什么不想把它放在独立的视图文件中的问题:
想象一下,除了特定的视图和只有一个

之外,您希望在所有视图中显示此行
<span>Lorem Ipsum</span>

这只是一行HTML代码,在项目中创建另一个文件是不值得的,因为它会在项目文件树中混乱,另一个例子是一个不好的解决方法

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

使项目增长时难以阅读和理解代码

编辑2 我预测了一些建议的解决方案,并已经写了为什么这不适合处理这个问题。我看起来更有可能找到类似于@can@cannot的解决方案,该解决方案取决于当前路线

编辑3: 致力于解决方案

编辑4: 我在这里发布了一个答案,但它还不完美(我不会将其标记为已接受),所以仅针对本主题的读者,我会将其副本粘贴在下面

  

好的我已经制作了一个简单的刀片指令来解决这个问题   好看的方式

     

首先,创建一个确定html路由访问权限的数组   snippet
最佳位置是在config中创建此文件   目录,例如presence.php文件

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

然后在AppServiceProvider.php class

中创建一个指令
<?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()
    {
        //
    }
}
     

在html视图中最终使用这个技巧

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

如果当前路径名不在,则会打印Lorem Ipsum   ipsum数组(在\App\config\presence.php文件中声明   我们可以使用config()辅助方法

来访问它      

如果我能处理通配符,那就太好了,比如

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

但我稍后会调查。

     

总是欢迎反馈或批评:)

4 个答案:

答案 0 :(得分:1)

如果使用刀片模板,则可以创建两种不同的布局。一个带图像滑块,一个没有。 这是我能从头脑中思考的最直接的解决方案。

修改 创建另一个布局,特别是如果你将所有布局放在一个单独的文件夹中,不会在文件结构中造成混乱,这肯定是值得的。

答案 1 :(得分:0)

如果contactabout us拥有自己的URI,您可以尝试匹配,以确定是否应该显示不是...

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

或者另一种方法是添加一个设置某个变量的中间件,例如$dontShowElement并设置一个视图编辑器并将该变量传递给所有视图。然后,您需要做的就是在输出元素之前检查该变量是否存在,并且只提供您希望该元素隐藏在该中间件上的那两条路由。

答案 2 :(得分:0)

好的我已经制作了一个简单的刀片指令,以一种漂亮的方式解决了这个问题

首先,创建一个数组,确定html代码段的路由访问权限 最好的位置是在config目录中创建此文件,例如presence.php文件

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

然后在AppServiceProvider.php class

中创建一个指令
<?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()
    {
        //
    }
}

在html视图中最终使用这个技巧

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

如果当前路由名称不在Lorem Ipsum数组中(在ipsum文件中声明,那么我们可以使用\App\config\presence.php辅助方法访问它),它将打印config()

如果我能处理通配符,那就太好了,比如

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

但我稍后会调查。

总是欢迎反馈或批评:)

答案 3 :(得分:0)

在App / Http / helper.php

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

查看

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