web-dev-qa-db-fra.com

Laravel 4 - incluant une vue "partielle" dans une vue (sans utiliser le modèle de lame)

Dans Laravel 3, j'avais l'habitude de faire cela.

<?php render('partials.header'); ?>

Cela a été fait dans les vues "PHP", sans utiliser les templates Blade de Laravel.

Quel est l'équivalent de cela dans la version 4?

J'ai essayé

<?php @include('partials.header'); ?>

Ça ne marche pas.

Si je fais

@include('partials.header')

Je dois sauvegarder mon fichier sous le nom ".blade.php"

Comment inclure une "sous-vue" sans utiliser le modèle de lame?

12
ericbae

Il existe différentes manières d'inclure une vue dans une vue dans Laravel 4. Votre choix dépendra de l'un des résultats décrits ci-dessous ...

Pour la flexibilité

Vous pouvez compiler (rendre) les vues partielles dans le contrôleur approprié et les transmettre à la vue principale à l'aide du tableau $data['']

Cela peut devenir fastidieux à mesure que le nombre de vues augmente, mais bon, au moins, il y a beaucoup de flexibilité :) 

Voir le code ci-dessous pour un exemple:

Manette

...

public function showMyView()
{
   /* Header partial view */
   $data['header'] = View::make('partials.header');

   /* Flexible enough for any kind of partial views you require (e.g. a Header Menu partial view) */
   $data['header_menu'] = View::make('partials.header_menu'); 

   /* Footer partial view */
   $data['footer'] = View::make('partials.footer');

   return View::make('myView', $data);
}

...

Vue

Vous pouvez inclure les partiels ci-dessus comme suit (à n’importe quelle position dans votre code View):

<html>  
<head></head>   
<body>

<!-- include partial views -->
<?php echo ($header) ?>  
<?php echo ($header_menu) ?>  

<div id="main-content-area"></div>  

<?php echo ($footer) ?>  

</body>  
</html>

Vos vues partielles seront maintenant ajoutées à votre vue principale.


Pour la simplicité

Il existe en fait un moyen beaucoup plus simple que d’utiliser la méthode ci-dessus: il suffit d’inclure ceci dans le code HTML de la vue ...

Vue

<html>  
<head></head>   
<body>

<!-- include partial view: header -->
<?php echo View::make('partials.header') ?>

   <div id="main-content-area">
   </div>

<!-- include partial view: footer -->
<?php echo View::make('partials.footer') ?>

</body>  
</html>

Assurez-vous que la structure de dossier pour les partiels est [views/partials/header.php] afin de fournir le chemin de fichier correct à la fonction View :: make () de Laravel.

ATTENTION

Si vous essayez de transmettre le $data['page_title'] à un contrôleur, les vues imbriquées ne recevront pas les données.
Pour transmettre des données à ces vues imbriquées, procédez comme suit:

<html>  
<head></head>   
<body>

<?php
   /* Pass page title to header partial view */
   $data ['page_title'] = "My awesome website";  
   echo View::make('partials.header', $data); 
?>

<div id="main-content-area"></div>

<?php echo View::make('partials.footer') ?>

</body>  
</html>

REMARQUE

La question disait clairement: "Sans utiliser le modèle de lame", je me suis donc assuré de donner une solution qui n'inclut aucun code de modèle de lame.

Bonne chance :)

24
Robin Hood

Vous pouvez imbriquer vos partiels dans des vues essayez ceci

View::make('folder.viewFile')->nest('anyname', 'folder.FileName');

Accédez ensuite au fichier de vue imbriquée à partir de votre modèle {{ $anyname }}. Ainsi, vous n’avez pas à inclure de fichiers dans votre vue. Cela devrait également fonctionner pour le fichier .php.

Je ne suis pas sûr du nombre de personnes qui ont utilisé Laravel 4 dans ce billet, mais si vous souhaitez inclure des partiels ou séparer vos types de vues, vous pouvez le faire avec @includes

par exemple, si vous voulez un dossier de partiels pour votre en-tête, pied de page, barre latérale, etc.

créer un répertoire pour les partiels sous 

app/views/partials

Puis créer un partiel 

app/views/partials/navigation.blade.php

Puis, dans votre fichier de modèle maître, ajoutez la ligne 

@include('partials.navigation')

Voilà tout ce qu'il faut. 

** Bonus vous pouvez également transmettre des données à un partiel ou inclure des partiels imbriqués dans un partiel

8
philcollin_us

Je sais que la réponse est un peu tardive, mais je me suis dit que je ne voyais pas cette solution parmi les autres réponses, c’était bien.

Si vous souhaitez inclure votre en-tête et votre pied de page sur chaque page, je les ajouterais aux filtres avant et après. Il suffit d'aller à filters.php dans votre dossier d'application

App::before(function($request)
{
    echo View::make('partials.header');
});

App::after(function($request, $response)
{
    echo View::make('partials.footer');
});

En procédant ainsi, vous n'avez rien besoin d'ajouter dans les fichiers de vue pour les inclure.

5
Ole

Vous pouvez utiliser la fonction de nid de View

View::make('default.layout')->nest('header', 'default.header');

Utilisez le troisième paramètre pour transmettre des données au modèle

View::make('default.layout')->nest('header', 'default.header', ['name' => 'John Doe', 'test' => 'It works!']);

sur vos vues/default/header.blade.php

<div>hey {{ $name }}! {{ $test }}</div>
3
Leysam Rosario

Je suis encore assez nouveau à Laravel, mais je pense que le dessous est plutôt idéal ...

Route::get('/', function()
{
    $data['title'] = 'sample';
    return View::make('page', $data);
});

# /views/partials/header.php
# /views/partials/footer.php
View::composer('page', function($view)
{
    $view->with('header', View::make('partials.header', $view->getData()));
    $view->with('footer', View::make('partials.footer', $view->getData()));
});

Voir Laravel Voir les compositeurs .. http://laravel.com/docs/responses#view-composers

/views/page.php

<?php echo $header; ?>
<div>CONTENT</div>
<?php echo $footer; ?>
1
farinspace

Dans une vue, faites simplement écho à l'autre vue:

echo View::make('header'); //This will look for a view called header.php
0
Callum