J'essaie de définir un attribut en utilisant @yield et @section , mais comment? J'ai essayé d'utiliser
<html @yield('mainApp')>
et
@section('mainApp','id="myid"')
mais il retourne id = & quot; myid & quot; au lieu de id = "myid"
Je sais que je peux le gérer avec un id par défaut mais je n'aime pas cette façon, et aussi si je dois utiliser un attribut personnalisé?
Laravel échappe au HTML par défaut. Je vois donc que vous avez deux choix.
Exposez la valeur à la vue sous forme de variable dans votre contrôleur.
view()->share('mainApp', sprintf('id="%s"', 'myid'));
Puis, affichez la valeur non échappée.
<html {!! $mainApp !!}
Ne donnez que la valeur de l'attribut id
, pas l'attribut entier.
@section('mainApp')
myid
@stop
<html id="@yield('mainApp', '')">
Si vous consultez le Guide de mise à niveau à partir du lien ci-dessous, vous verrez quelques lignes sous Lame: https://laravel.com/docs/5.4/upgrade
@section Escaping
Dans Laravel 5.4, le contenu en ligne transmis à une section est automatiquement échappé:
@section('title', $content)
Si vous souhaitez afficher du contenu non masqué dans une section, vous devez déclarer la section en utilisant le style traditionnel "forme longue":
@section('title')
{!! $content !!}
@stop
Donc, pour obtenir le résultat de votre requête, vous devez procéder comme suit:
@section('mainApp', {!! 'id="myid"' !!})
Sur votre contrôleur, vous faites quelque chose comme:
return view('my_page')->with('myid', 'myid');
et sur votre vue/mise en page, vous faites quelque chose comme:
<html {{ $myid or '' }}>
...
Vous n'avez pas besoin de céder pour une telle tâche.
Pourquoi n'utilisez-vous pas comme ça:
@section('mainApp') id='myid' @endsection
Cela n'échappera pas au personnage.
Quelle version de Laravel vous utilisez? Dans le Laravel 5.4, il y a une mise à jour à ce sujet:
Lame
@section s'échappant
Dans Laravel 5.4, le contenu en ligne transmis à une section est automatiquement échappé :
@section ('title', $ content)
Si vous souhaitez rendre le contenu non échappé de Dans une section, vous devez déclarer la section en utilisant le style traditionnel "forme longue" de :
@section titre') {!! $ content !!} @stop
https://laravel.com/docs/5.4/upgrade
Longue histoire, essayez d'utiliser Laravel 5.4 puis utilisez ce code
@section('mainApp')
id="myid"
@stop
Donc, un meilleur moyen de le faire si je vous comprends bien, utilise @stack et @Push
<html class="no-js" lang="en" @stack('mainApp')>
Et quelle que soit la page que vous souhaitiez envoyer, utilisez @Push
@Push('mainApp')
id='myid'
@endpush
https://laravel.com/docs/5.2/blade#stacks
peut même ajouter des variables ou tout ce que vous aimez là-bas et il ira où le @stack est
si utilisé Laravel 5.4, le contenu en ligne transmis à une section est automatiquement échappé.
puis retirez automatiquement échappé dans la section pour utilisé
@section('mainApp', {!! 'id="myid"' !!})
Peut-être que quelque chose comme ceci aiderait:
{!! $__env->yieldContent('mainApp') !!}
Cela dit, en utilisant laravel 5.4, votre façon de faire fonctionne bien pour moi .. quelle version utilisez-vous?
Le contenu par défaut de la section est échappé à l'aide de l'assistant e()
. Depuis Laravel 5.1, vous pouvez utiliser Illuminate\Support\HtmlString
, cette classe html content c'est non échappé mais rendu directement par le Laravel e()
fonction d'assistance, c'est-à-dire:
@section('mainApp', new Illuminate\Support\HtmlString('id="myid"'))
Définissez votre mise en page principale avec @yield
<html lang="{{ config('app.locale') }}" @yield('hello')>
Étendre ce maître
@extends('layouts.app')
Commencer la section bonjour
@section('hello')
id="myId"
@endsection
La sortie de ce qui suit est comme ceci ici id = "myId" est une partie dynamique.
<html id="myId" lang="en">
Je ne sais pas comment vous attribuez la valeur de myId
, mais s'il ne s'agit que d'une variable PHP, avez-vous essayé de la transmettre à vos partiels comme ceci?
@yield('mainApp', [
'id' => $myid
])
@section('mainApp', [
'id' => $myid
])
Vous devriez pouvoir passer toutes les variables d'un modèle à un autre et les mapper avec des noms de variables distincts à l'aide d'un tableau associatif de paires clé => valeur.
Il existe une classe HtmlString
que vous pouvez utiliser pour ce type de choses, Laravel l'utilise pour des fonctions telles que csrf_field()
et method_field()
.
Vous pouvez l'ajouter si vous le souhaitez:
@section('mainApp', new \Illuminate\Support\HtmlString('id="myid"'))
Cependant, je créerais personnellement un assistant personnalisé pour pouvoir y accéder beaucoup plus facilement, à savoir:
@section('mainApp', html_string('id="myid"'))
L'assistant devrait ressembler à quelque chose comme ..
function html_string($string) {
return new \Illuminate\Support\HtmlString($string);
}
Si vous avez besoin d’aide pour créer un assistant personnalisé, consultez cette réponse https://stackoverflow.com/a/28290359/7844646
Je n'ai pas essayé, mais vous pourriez peut-être faire quelque chose comme ça:
<html {!! View::getSections()['mainApp'] !!}>
Si j'ai raison, View::getSections()
renvoie toutes les sections définies.
Cependant, je ne sais pas si cela fonctionnera, car peut-être que getSections sera appelée avant que la section ne soit définie. Mais ça vaut toujours le coup.
Voici comment je fais cela dans Laravel 5.4:
Modèle HTML (template.html):
<!DOCTYPE html>
<html id="{{ $html_id or '' }}" lang="{{ $html_locale or 'en' }}">
<head>
...
@yield('head')
...
</head>
<body>
...
@yield('body')
...
</body>
</html>
Un modèle de base (template.main)
@component('template.html')
@section('head')
...
@stop
@section('body')
...
@yield('contents')
...
@stop
@endcomponent
Un modèle de page qui définira le HTML #ID
@extends('template.main')
@slot('html_id')
app-html-id
@endslot
@section('contents')
...
@stop