2017-05-19 2 views
0

Im Grunde versuche ich, ein kleines Stück HTML zu implementieren, das von einem Controller in einer separaten Ansicht in einer Hauptansicht generiert wird. Das Problem ist, dass ich benutzerdefinierte Stile für diesen kleinen Teil von HTML brauche und ich kann nicht wissen, wo ich es (manuell) einschließen muss, also möchte ich, dass die CSS an die Datei angehängt wird, die die Funktion irgendwie von nennt der Controller, wenn die Methode aufgerufen wird. Ausführlichere Erläuterung: Ich listet programmatisch kleine benutzerdefinierte Bereiche auf, um einige Eigenschaften jeder Instanz meines Modells anzuzeigen (in diesem Fall ein Fenster). In der Hauptansicht, in der ich aufliste, gibt es viele davon, also habe ich beschlossen, eine separate Ansichtsdatei zu erstellen, um das Panel zu erstellen, und es dann einfach über eine Funktion im Controller zurückzugeben. So in der home.blade.php ich wie folgt:Fügen Sie eine CSS-Datei in die Kopfzeile der Ansicht ein, die eine Controller-Methode aufruft.

@foreach($order -> windows as $window) 
    {!!$window->drawPanel()!!} 
@endforeach 

Dann in meinem Fenster Controller ich eine Methode haben die Ansicht zurückzukehren, in dem das Fenster (anders depeding auf seine Eigenschaften!) Angezeigt wird wie folgt aus:

public function drawPanel() 
{ 
    return view('dogrami.windowPanelThumbnail', ['window' => $this]); 
} 

Und dann in der windowPanelThumbnail Datei anzeigt ich entsprechend den hTML erforderlich. Das Problem ist: Um mein Panel zu erstellen, verwende ich einige benutzerdefinierte CSS, die ich nicht in der Builder-Ansicht aufnehmen kann, weil es wie 100 Mal aufgerufen wird. Die Frage ist - wie man den Stil an die Datei anhängt, die die Methode im Controller aufgerufen hat. Grundsätzlich würde ich tun, wie folgt:

public function drawPanel() 
{ 
    //$cssFile = pathToMyCssFile;//that's the instance containing my custom css 
    //$callingFile = ...//somehow retrieve an instance to the file that called that method.. in this case - the path to 'home.blade.php' 
    //if($calling.File already has the $cssFile included in it's header) 
     //don't do anything 
    //else 
     //$callingFile -> somehow include the $cssFile instance in the header 
    return view('dogrami.windowPanelThumbnail', ['window' => $this]); 
} 

Ich habe keine Ahnung, ob es möglich ist, so dass das, was ich verlangen. Oder wenn Sie bessere Ideen haben, wie Sie das erreichen können, wäre ich wirklich dankbar!

+0

Haben Sie eine Layout-Datei? –

+0

@AlexvanVliet Ich bleibe bei meiner einzigen App-Datei in den Layouts, es ist eine Option! Vielen Dank! Aber meine Frage betrifft den Weg, um das zu erreichen, was ich gefragt habe, obwohl Sie mein Problem mit dieser Erinnerung gelöst haben. Ich meine, ich könnte es für zukünftige Verwendung brauchen und ich würde gerne tun können, wie beschrieben. Wie kann ich die CSS-Datei programmatisch in die Kopfzeile einfügen oder soll ich einfach die 'File'-Fassade verwenden, um direkt in die Datei zu schreiben? Weil ich einen Scheck brauchen würde. –

+0

Nehmen Sie die Ansicht auf oder geben Sie sie? –

Antwort

0

Wenn Sie Ihre CSS enthalten sein sollen dynamisch können Sie Stapel https://laravel.com/docs/5.4/blade#stacks auf diese Weise verwenden:

$links = ["all", "the", "links", "to", "css", "files"]; 
return view('yourview', [/*allyourdata, */, 'stylesheets' => $links]); 

Und Ihrer Ansicht nach können Sie tun:

@push('stylesheets') 
    @foreach($stylesheets as $stylesheet) 
     <link rel="stylesheet" type="text/css" href="{{ $stylesheet }}"> 
    @endforeach 
@endpush 

Und fügen @stack('stylesheets') in den Kopf Ihrer html

PS: Ein Stack ist eine Lifo-Datenstruktur (last in first out), was bedeutet, dass, wenn Sie mehrere @ push, die letzte, die Sie tun, b e die erste Echo'ed

+0

Das Problem ist, ich weiß nicht, welche Ansicht die Methode aufruft ... Und in meinem Controller gibt ich auch nicht die Hauptansicht, sondern die Panel-Builder-Ansicht, zu dem ich kein CSS hinzufügen muss. –

+0

Oh ich habe deine Frage nicht wirklich verstanden, ich habe jetzt, ich werde meine Antwort bearbeiten, sobald ich sie getestet habe –

Verwandte Themen