Je joue avec Symfony2, et j'ai des problèmes avec les fichiers CSS et JS dans le modèle Twig.
J'ai un paquet nommé Webs/HomeBundle
à l'intérieur duquel j'ai HomeController
avec indexAction
qui restitue un fichier de modèle de brindille:
public function indexAction()
{
return $this->render("WebsHomeBundle:Home:index.html.twig");
}
Donc c'est facile. Maintenant, ce que je veux faire, est d’inclure des fichiers CSS et JS dans ce modèle Twig. Le modèle ressemble à ceci:
<!DOCTYPE html>
<html>
<head>
{% block stylesheets %}
<link href="{{ asset('css/main.css') }}" type="text/css" rel="stylesheet" />
{% endblock %}
</head>
<body>
</body>
</html>
Le fichier que je voudrais inclure, le fichier main.css
se trouve dans:
Webs/HomeController/Resources/public/css/main.css
Ma question est donc la suivante: comment puis-je inclure un simple fichier CSS dans le modèle Twig?
J'utilise la fonction Twig asset()
et elle ne frappe pas le bon chemin CSS. Aussi, j'exécute cette commande dans la console:
app/console assets:install web
Cela a créé un nouveau dossier
/web/bundles/webshome/...
c'est juste un lien vers le
src/Webs/HomeController/Resources/public/
droite?
Bundle/Resources/public
? Est-ce le bon endroit pour eux?Vous faites tout bien, sauf en passant votre chemin de paquet à la fonction asset()
.
Selon documentation - dans votre exemple, ceci devrait ressembler à ceci:
{{ asset('bundles/webshome/css/main.css') }}
Astuce: vous pouvez également appeler des actifs: installez avec la clé --symlink
pour créer des liens symboliques dans le dossier Web. Ceci est extrêmement utile lorsque vous appliquez souvent les modifications js
ou css
(de cette manière, vos modifications appliquées à src/YouBundle/Resources/public
seront immédiatement répercutées dans le dossier web
sans qu'il soit nécessaire d'appeler à nouveau assets:install
):
app/console assets:install web --symlink
De même, si vous souhaitez ajouter des actifs dans votre modèle enfant, vous pouvez appeler la méthode parent()
pour le bloc Twig. Dans votre cas, ce serait comme ça:
{% block stylesheets %}
{{ parent() }}
<link href="{{ asset('bundles/webshome/css/main.css') }}" rel="stylesheet">
{% endblock %}
Et vous pouvez utiliser la balise% stylesheets% (fonctionnalité assetic):
{% stylesheets
"@MainBundle/Resources/public/colorbox/colorbox.css"
"%kerner.root_dir%/Resources/css/main.css"
%}
<link type="text/css" rel="stylesheet" media="all" href="{{ asset_url }}" />
{% endstylesheets %}
Vous pouvez écrire le chemin d'accès à css en tant que paramètre (% nom_paramètre%).
En savoir plus sur cette variante: http://symfony.com/doc/current/cookbook/assetic/asset_management.html
Les autres réponses sont valables, mais le guide Official Symfony Best Practices suggère d'utiliser le dossier web/
pour stocker tous les actifs, au lieu de différents ensembles.
La dispersion de vos ressources Web à travers des dizaines de bundles différents le rend plus difficile de les gérer. La vie de vos concepteurs sera beaucoup plus facile si tous les actifs de l’application se trouvent au même endroit.
Les modèles bénéficient également de la centralisation de vos actifs, car le fichier les liens sont beaucoup plus concis [...]
J'ajouterais à cela en vous suggérant de ne placer que des micro-actifs dans des micro-ensembles, par exemple quelques lignes de styles nécessaires uniquement pour un bouton dans un ensemble de boutons.
Si vous utilisez Silex ajoutez le Symfony Asset en tant que dépendance:
composer require symfony/asset
Ensuite, vous pouvez vous inscrire Asset Service Provider :
$app->register(new Silex\Provider\AssetServiceProvider(), array(
'assets.version' => 'v1',
'assets.version_format' => '%s?version=%s',
'assets.named_packages' => array(
'css' => array(
'version' => 'css2',
'base_path' => __DIR__.'/../public_html/resources/css'
),
'images' => array(
'base_urls' => array(
'https://img.example.com'
)
),
),
));
Puis dans votre fichier Twig template dans la section head:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
{% block head %}
<link rel="stylesheet" href="{{ asset('style.css') }}" />
{% endblock %}
</head>
<body>
</body>
</html>