我遇到一个问题,我不想在某些视图中显示X元素。
真实的例子是,我不想在页面contact
和about 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 ], ];
但我稍后会调查。
总是欢迎反馈或批评:)
答案 0 :(得分:1)
如果使用刀片模板,则可以创建两种不同的布局。一个带图像滑块,一个没有。 这是我能从头脑中思考的最直接的解决方案。
修改强> 创建另一个布局,特别是如果你将所有布局放在一个单独的文件夹中,不会在文件结构中造成混乱,这肯定是值得的。
答案 1 :(得分:0)
如果contact
和about 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