Атрибут урожая Laravel
Я пытаюсь установить атрибут, используя @yield и @section, но как? Я пытался использовать
<html @yield('mainApp')>
а также
@section('mainApp','id="myid"')
но он возвращает id = & quot; myid & quot; вместо id = "myid"
Я знаю, что могу управлять им с помощью идентификатора по умолчанию, но мне это не нравится, а также, что если мне нужно использовать пользовательский атрибут?
17 ответов
Laravel по умолчанию экранирует HTML. Поэтому я вижу, что у вас есть два варианта.
Представьте значение для представления в качестве переменной в вашем контроллере.
view()->share('mainApp', sprintf('id="%s"', 'myid'));
Затем выведите значение unescaped.
<html {!! $mainApp !!}
Только дают
id
значение атрибута, а не весь атрибут.@section('mainApp') myid @stop
<html id="@yield('mainApp', '')">
На вашем контроллере вы делаете что-то вроде:
return view('my_page')->with('myid', 'myid');
и на ваш взгляд / макет вы делаете что-то вроде:
<html {{ $myid or '' }}>
...
Вам не нужно уступать для такой задачи.
Если вы посмотрите Руководство по обновлению по ссылке ниже, вы увидите несколько строк ниже под Blade: https://laravel.com/docs/5.4/upgrade
@section Escaping
В Laravel 5.4 встроенный контент, передаваемый в раздел, автоматически экранируется:
@section('title', $content)
Если вы хотите визуализировать неэкранированный контент в разделе, вы должны объявить раздел в традиционном стиле "длинная форма":
@section('title')
{!! $content !!}
@stop
Таким образом, получить результат для вашего запроса вам нужно, как показано ниже:
@section('mainApp', {!! 'id="myid"' !!})
Какую версию Laravel вы используете? В Laravel 5.4 есть обновление об этом:
лопасть
@section Escape
В Laravel 5.4 встроенный контент, передаваемый в раздел, автоматически экранируется:
@section ('title', $ content)
Если вы хотите визуализировать неэкранированный контент в разделе, вы должны объявить раздел в традиционном стиле "длинная форма":
@section ('title') {!! $ content!!} @stop
https://laravel.com/docs/5.4/upgrade
Длинный рассказ, попробуйте использовать Laravel 5.4, а затем используйте этот код
@section('mainApp')
id="myid"
@stop
Почему бы вам не использовать как это:
@section('mainApp') id='myid' @endsection
Это не ускользнет от персонажа.
Так что лучший способ сделать это, если я вас понимаю, это использовать @stack и @push
<html class="no-js" lang="en" @stack('mainApp')>
И на какую страницу вы хотите отправить идентификатор, используйте @push
@push('mainApp')
id='myid'
@endpush
https://laravel.com/docs/5.2/blade
можно даже добавить переменные или все, что вам нравится, и оно пойдет туда, где находится @stack
Если используется Laravel 5.4, встроенный контент, передаваемый в раздел, автоматически экранируется.
затем удалить автоматически сбежавший в разделе для подержанных
@section('mainApp', {!! 'id="myid"' !!})
Может быть, что-то подобное поможет:
{!! $__env->yieldContent('mainApp') !!}
Тем не менее, используя laravel 5.4, ваш способ работает нормально для меня.. какую версию вы используете?
Содержимое раздела по умолчанию экранируется с помощью e()
помощник. Начиная с Laravel 5.1 вы можете использовать Illuminate\Support\HtmlString
этот HTML- контент этого класса не экранирован, но напрямую отрисован Laravel e()
вспомогательная функция, т.е.
@section('mainApp', new Illuminate\Support\HtmlString('id="myid"'))
Если вы хотите достичь <html id="myid">
Вы можете сделать это следующим образом:
в свой HTML-тег добавить это:
<html @yield('mainApp')>
и в вашем шаблоне:
@section('mainApp', "id=myid") // this will give you <html id="myid">
Я не пробовал, но, возможно, вы могли бы сделать что-то вроде этого:
<html {!! View::getSections()['mainApp'] !!}>
Если я прав, View::getSections()
возвращает все определенные разделы.
Однако я не знаю, будет ли это работать, потому что, возможно, getSections будет вызываться до того, как будет определен раздел. Но это все еще стоит выстрел.
E сть HtmlString
класс, который вы можете использовать для таких вещей, Laravel использует его для таких вещей, как csrf_field()
а также method_field()
,
Вы можете вставить это, если хотите:
@section('mainApp', new \Illuminate\Support\HtmlString('id="myid"'))
Тем не менее, я бы лично создал собственный помощник для этого, чтобы я мог получить к нему гораздо проще, то есть:
@section('mainApp', html_string('id="myid"'))
Помощник должен выглядеть примерно так...
function html_string($string) {
return new \Illuminate\Support\HtmlString($string);
}
Если вам нужна помощь в создании настраиваемого помощника, ознакомьтесь с этим ответом /questions/28759065/luchshie-praktiki-dlya-polzovatelskih-pomoschnikov-v-laravel-5/28759087#28759087
Я только что проверил это в Laravel 5.4 и что работает для меня:
Это в моем макете
<html lang="en" @yield('mainApp')>
И это в моем расширенном представлении (удалены кавычки, упаковывающие myid)
@section('mainApp','id=myid')
Результат в прикрепленном изображении
Определите свой основной макет с @yield
<html lang="{{ config('app.locale') }}" @yield('hello')>
Продлите этого мастера
@extends('layouts.app')
Начать раздел привет
@section('hello')
id="myId"
@endsection
Вывод следующий следующий: id="myId" - динамическая часть.
<html id="myId" lang="en">
Вот как я делаю это в Laravel 5.4:
HTML-шаблон (template.html):
<!DOCTYPE html>
<html id="{{ $html_id or '' }}" lang="{{ $html_locale or 'en' }}">
<head>
...
@yield('head')
...
</head>
<body>
...
@yield('body')
...
</body>
</html>
Базовый шаблон (template.main)
@component('template.html')
@section('head')
...
@stop
@section('body')
...
@yield('contents')
...
@stop
@endcomponent
Шаблон страницы, который будет определять HTML #ID
@extends('template.main')
@slot('html_id')
app-html-id
@endslot
@section('contents')
...
@stop
Я не уверен, как вы назначаете значение myId
но если это просто переменная PHP, пытались ли вы передать ее частям, как это?
@yield('mainApp', [
'id' => $myid
])
@section('mainApp', [
'id' => $myid
])
Вы должны иметь возможность передавать любые переменные из одного шаблона в другой и сопоставлять их с разными именами переменных, используя ассоциативный массив пар ключ => значение
Позвольте мне рассказать вам в одной строке.
Начальное имя раздела должно быть yield("Название раздела")