2014-09-24 4 views
35

im Aufbau eines kleinen CMS in Laravel und jeder ich habe versucht, den Inhalt zu zeigen, die in der DB gespeichert sind es zeigt die HTML-Tags, anstatt sie auszuführen, es ist ein Auto html_entity_decode für alle gedrucktLaravel entkommen alle HTML in Blade-Vorlage

Daten
<?php 
class CmsController extends BaseController{ 
    public function Content($name){ 

     $data = Pages::where('CID','=',Config::get('company.CID'))->where('page_name','=',$name)->first(); 
     return View::make('cms.page')->with('content', $data); 
    } 
} 
?> 

ich versuchte, den Inhalt unter Verwendung geschweifte Klammer

{{$content->page_desc}} 

und triple geschweifte Klammer

{{{$content->page_desc}}} 
zu drucken

und sie geben das gleiche Ergebnis
ich brauche diese HTML-Tags auszuführen, anstatt sie zu entkommen

+1

In der neuesten Version 'ver-5.0'' {{}} 'und' {{{}}}} macht beides, welche Version hast du genau? –

+0

im mit der Version 4.2 –

+0

Dann bin ich mir nicht sicher, warum '{{...}}' gibt Ergebnis entkommen! –

Antwort

2

Es gibt kein Problem mit HTML-Code Anzeigen in Blade-Vorlagen.

Route::get('/', function() { 

     $data = new stdClass(); 
     $data->page_desc 
      = '<strong>aaa</strong><em>bbb</em> 
       <p>New paragaph</p><script>alert("Hello");</script>'; 

     return View::make('hello')->with('content', $data); 
    } 
); 

und in hello.blade.php Datei:

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
</head> 
<body> 

{{ $content->page_desc }} 

</body> 
</html> 

Für den folgenden Code, den Sie Ausgabe als auf das Bild bekommen

Für Test können Sie nur eine Route routes.php hinzufügen

Output

Also wahrscheinlich page_desc in Ihrem Fall ist nicht das, was Sie erwarten. Aber wie Sie sehen es gefährlich Potential sein kann, wenn jemand zum Beispiel verwendet ‚` Tag so sollten Sie wahrscheinlich in Ihrer Route vor einigen Tags zu Blade Schablonenfilter Zuordnung

EDIT

ich auch getestet habe mit den gleichen Code in der Datenbank setzen:

Route::get('/', function() { 

     $data = User::where('id','=',1)->first(); 

     return View::make('hello')->with('content', $data); 
    } 
); 

Ausgang ist genau das gleiche in diesem Fall

EDIT2

Ich weiß auch nicht, ob Pages ist Ihr Modell oder es ist ein Hersteller-Modell. Zum Beispiel kann es haben Accessor innen:

public function getPageDescAttribute($value) 
{ 
    return htmlspecialchars($value); 
} 

und dann, wenn Sie page_desc Attribut erhalten Sie page_desc mit htmlspecialchars geändert bekommen. Also, wenn Sie sicher sind, dass Daten in der Datenbank mit Raw html (nicht maskiert) ist, sollten Sie sich diese Pages Klasse

+0

testet jetzt Danke –

-3

{{html_entity_decode ($ post-> content())}} das Problem für mich mit Laravel 4.0 gespeichert . Jetzt wird Mein HTML-Inhalt wie erwartet interpretiert.

+0

Ja, diese Lösung funktioniert tatsächlich für Laravel 4 - vielleicht weiß jemand eine bessere Lösung für L4? –

+0

Da wir Laravel verwenden, sollten wir {!! !!}, die der Laravel-Syntax folgt. – Nick

88

Ändern Sie die Syntax von {{ }} in {!! !!}.

Wie der Alpha in einem Kommentar oben sagte (keine Antwort, also dachte ich, ich würde schreiben), in Laravel 5 hat sich die {{ }} (zuvor nicht maskiert Ausgabesyntax) zu {!! !!} geändert.Ersetzen Sie {{ }} durch {!! !!} und es sollte funktionieren.

+0

Gelöst in meinem Fall! – fpauer

+1

hat funktioniert! Danke @Alpha –

+0

arbeitete für mich !!! Danke @Ivan Topolcic – Raham

7

Fügen Sie den Inhalt in {! !}.

10

Verwenden Sie dieses Tag {!! Beschreibungstext !!}

+0

Diese Antwort funktionierte für meine in Laravel 5.2. Im Laufe der Arbeit an dem Problem entdeckte ich auch, dass Illuminate/Support/helpers.php :: 529 'htmlentities()' ausführt, wenn Sie diese Syntax nicht verwenden: '{!! !!} '. – PapaHotelPapa

1

Ich hatte das gleiche Problem. Danke für die obigen Antworten, ich habe mein Problem gelöst. Wenn es Menschen gibt, vor dem gleichen Problem, hier ist zwei Weg, es zu lösen:

  • können Sie {!! $news->body !!} verwenden
  • Sie können traditionelle php openning verwenden (Es wird nicht empfohlen) wie: <?php echo $string ?>

Ich hoffe es hilft.