Атрибут урожая Laravel

Я пытаюсь установить атрибут, используя @yield и @section, но как? Я пытался использовать

<html @yield('mainApp')>

а также

@section('mainApp','id="myid"')

но он возвращает id = & quot; myid & quot; вместо id = "myid"

Я знаю, что могу управлять им с помощью идентификатора по умолчанию, но мне это не нравится, а также, что если мне нужно использовать пользовательский атрибут?

17 ответов

Laravel по умолчанию экранирует HTML. Поэтому я вижу, что у вас есть два варианта.

  1. Представьте значение для представления в качестве переменной в вашем контроллере.

    view()->share('mainApp', sprintf('id="%s"', 'myid'));

Затем выведите значение unescaped.

<html {!! $mainApp !!}
  1. Только дают 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("Название раздела")

Другие вопросы по тегам