#php #laravel
Вопрос:
Итак, у меня есть несколько макетов в моем приложении Laravel, но наиболее распространенным является и .
У меня есть общий маршрут / представление для страниц настроек и паролей, но я хочу использовать одно и то же представление в разных макетах в зависимости от типа пользователя.
/пароль — password.blade.php
@if(Auth::user()->type == 'business')
<x-business-layout>
@else
<x-app-layout>
@endif
PAGE CONTENT HERE
@if(Auth::user()->type == 'business')
</x-business-layout>
@else
</x-app-layout>
@endif
Вот как я думал, что смогу динамически изменять макет в зависимости от пользователя, но это не работает. Просто перейдите syntax error, unexpected 'else'
в конец файла, где я снова использую этот код, чтобы закрыть макет.
Есть какие-нибудь способы сделать это?
Комментарии:
1. Попробуйте
<x-business-layout/>
, если ему нужен хорошо отформатированный XML2. @apokryfos Я уже заканчиваю такие теги макета в нижней части файла 🙂
3. Ты не можешь этого сделать. Он должен открываться и закрываться в блоке «Если или иначе». Вы можете посмотреть, какую разметку он генерирует, если проверите файлы кэша в
storage/framework/views
4. @apokryfos да, и я ищу решение для этого, чтобы мне не пришлось дублировать содержимое страницы на две части оператора if. Я обновлю вопрос, чтобы лучше показать код.
5. Вы уверены, что ваши секции правильно закрыты? С кодом, который вы опубликовали как есть, я не понимаю, как вы получаете синтаксическую ошибку.
Ответ №1:
Пожалуйста, не могли бы вы обновить свой ОП, чтобы включить код для <x-business-layout>
?
Я полагаю, что ваша синтаксическая ошибка вызвана чем-то там…
Кроме того, вместо того, чтобы дублировать Содержимое страницы, которое будет отображаться для каждой из ваших инструкций if, почему бы не создать функцию и/или переменную, содержащую содержимое страницы, к которому вам нужно обращаться только из ваших инструкций if?
Предложение 1
<!-- Variable Example -->
<?php
$someVariable = "PAGE CONTENT HERE";
?>
<!-- Function Example -->
<?php
function someFunction()
{
$pageContent = "Example Page Content Here";
return $pageContent;
}
?>
@if(Auth::user()->type == 'business')
<x-business-layout>
<?php
//Variable Example
echo $someVariable;
?>
</x-business-layout>
@else
<x-app-layout>
<?php
//Function Example
echo someFunction()
?>
</x-app-layout>
@endif
ПРИМЕЧАНИЕ: <?php
?>
теги требуются только в том случае, если вы еще не находитесь в открытых тегах PHP!
Предложение 2:
@if(Auth::user()->type == 'business')
<x-business-layout>
@endif
@if(Auth::user()->type != 'business')
<x-app-layout>
@endif
PAGE CONTENT HERE
@if(Auth::user()->type == 'business')
</x-business-layout>
@endif
@if(Auth::user()->type != 'business')
</x-app-layout>
@endif
Комментарии:
1. Вы задаете больше вопросов, чем ОП 🙂 Это не помогает решить проблему и поэтому не должно публиковаться в качестве ответа.
2. @AlexandreElshobokshy что не так с тем, что я задал ОП? Это предлагаемый ответ на его вопрос, который мог бы помочь решить его проблему…
Ответ №2:
Вы можете создать макет лезвия и расширить его по своим правилам. например: Давайте предположим, что это один из ваших макетов
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
@section('content')
</body>
</html>
И это тот документ, который вы хотите показать:
@if(Auth::user()->type == 'business')
@extends('layout1')
@else
@extends('layout2')
@endif
@section('content')
your content here
@endsection
Ответ №3:
@if(Auth::user()->type == 'business')
<x-business-layout>
@if(Auth::user()->type != 'business')
<x-app-layout>
@endif
Ваше @else
заявление никогда не может быть достигнуто, так как Laravel вводит содержимое вашей страницы между условным блоком.
Ответ №4:
Переместите содержимое страницы в частичное представление
@if (auth()->user()->type == 'business')
<x-business-layout>
@include('partials.page-content')
</x-business-layout>
@else
<x-app-layout>
@include('partials.page-content')
</x-app-layout>
@endif
или вы можете создать common
макет, который будет использовать наследование шаблонов
layouts/common.blade.php
@if (auth()->user()->type == 'business')
<x-business-layout>
@yield('content')
</x-business-layout>
@else
<x-app-layout>
@yield('content')
</x-app-layout>
@endif
тогда вы можете использовать его классическим способом
@extends('layouts.common')
@section('content')
PAGE CONTENT HERE
@endsection
Ответ №5:
Вы можете извлечь условную логику в отдельный компонент:
components/layouts.blade.php
@if(Auth::user()->type == 'business')
<x-business-layout>{{ $slot }}</x-business-layout>
@else
<x-app-layout>{{ $slot }}</x-app-layout>
@endif
А затем используйте этот компонент для инкапсуляции различных типов компоновки:
password.blade.php
<x-layout>
PAGE CONTENT HERE
</x-layout>