2017-08-09 4 views
0

In Ordnung, aus dem Titel sagt. Ich möchte Links in Laravel Blade generieren. Der Haken, mein Inhalt kam aus einer Datenbank.Generieren von HTML-Links in Laravel Blade

Id |   Content            | Status 
1 | <a href="{{ asset('public/images/projects/p1_002728.jpg') }}"> | A 

Mein Controller

public static function ViewPerProject() 
{ 
    $data = Projects::GetProjectDetails(); 

    return view('works.project1', ['projectPackage' => $data]); 
} 

und meine Ansicht

 @foreach($projectPackage as $project) 
     {!! $project->Content !!} 
     @endforeach 

In dem mein Link erzeugt, als ich Element untersuchen.

<a href="{{ asset('public/images/projects/p1_002728.jpg') }}"> 

Ich möchte meinen Link, um den vollständigen Pfad zu erzeugen, die wie dieser Jede Idee Jungs

<a href="localhost/arc/public/images/projects/p1_002728.jpg"> 

etwas ist?

+0

Sie sollten niemals das Wort 'public' verwenden, wenn Sie auf eine lokale Ressource verweisen. Probiere 'asset (" images/projects/p1_002728.jpg ")' – apokryfos

Antwort

0

Sie speichern grundsätzlich eine Blade-Vorlage in Ihrer Datenbank, die sowohl Blade- als auch PHP-Code enthält. Um dies richtig anzuzeigen, ist dies eine Zeichenfolge, die von der Blade-Templating-Engine und der PHP-Engine verarbeitet werden muss.

Es gibt zwei Möglichkeiten.

Zuerst können Sie die Zeichenfolge aus der Datenbank in eine temporäre Datei speichern und dann die Anweisung @include verwenden, um Ihre temporäre Datei einzuschließen.Dies hat natürlich einen gewissen Overhead, da Sie abhängig von der Anzahl der zu verarbeitenden Datensätze eine Menge Festplatten-E/A durchführen.

Zweitens können Sie die Blade-Verarbeitung und die PHP-Verarbeitung manuell aufrufen. Dies beinhaltet einen Aufruf an eval(), aber es ist nicht gefährlicher, als die Zeichenfolge in eine Datei zu schreiben und dann einzuschließen (beides ist gefährlich, wenn $project->Content irgendeine Art von Benutzereingabe enthält!).

Ihr Code für Option zwei würde wie folgt aussehen:

@foreach($projectPackage as $project) 
    {!! eval('?>'.Blade::compileString($project->Content) !!} 
@endforeach 

Zuerst wird die Blade::compileString() Methode die Zeichenfolge aus der Datenbank nehmen und es von einem Blattvorlage in Standard-HTML/PHP kompilieren.

Zweitens wird der Aufruf an eval() Ihre HTML/PHP über den PHP-Prozessor ausführen und die resultierende Zeichenfolge zurückgeben. Die Blade-Vorlagen-Zeichenfolge, die von eval() verarbeitet wird, muss mit ?> beginnen, um eval() im HTML-Modus statt im PHP-Modus() zu starten.

Und drittens, die Klinge {!! !!} Direktiven wird diese Zeichenfolge ausdrucken, ohne irgendetwas zu entgehen.

-1

Ich glaube, Sie dies versuchen:

<a href="{{url('images/projects/p1_002728.jpg')}}"> 

Hoffnung diese Arbeit für Sie !!!

+0

funktioniert nicht :( – drake24

-1

Der Dienst sollte diese Art von Array zurückgeben. Passen Sie einfach den Pfad zu ./ oder ../ entsprechend Ihrer Anforderung an.

public static function ViewPerProject() 
    { 
     $package = ['./images/projects/p1_002728.jpg','./images/projects/p1_002728.jpg'] 
     $this->data['projectPackage'] = $package; 
     $this->data['someOtherData_1'] = []; 
     $this->data['someOtherData_2'] = "test"; 

     return view('works.project1')->with('data',$this->data); 
    } 

In Sicht können Sie so verwenden.

@foreach($projectPackage as $data['projectPackage']) 
     <a href="{{$projectPackage}}"></a> 
@endforeach 
1

Das wird nicht funktionieren. Sie können die PHP-Funktion nicht auf diese Weise ausführen. Es ist wie Echo innerhalb des Echos.

{{!! '<a href="{{ asset('images/projects/p1_002728.jpg') }}">' !!} 

Wenn Sie wirklich Links aus irgendeinem Grund zu Ihrer Datenbank speichern möchten, warum speichern Sie es nicht so:

<a href="[domain]public/images/projects/p1_002728.jpg"> 

Dies ähnelt ein Shortcode von Wordpress.

Bevor Sie also Ihre Daten anzeigen, müssen Sie sie vorbereiten. Übergeben Sie Ihre Daten an Ihren Parser.

@foreach($projectPackage as $project) 
    {!! parseDomain($project->Content) !!} 
@endforeach 

und einen Helfer erstellen, die die [domain] auf Ihre vollständige Domain oder öffentlichen Pfad ändern.

function parseDomain($content){ 
    $domain = asset('/'); 
    return str_replace('[domain]',$domain,$content); 
} 

Aber immer noch, ich hoffe, Sie nur die images/projects/p1_002728.jpg zu Ihrer Datenbank dann das gesamte Element Speichern statt sparen könnte es Echo.