Including ‘…/layout.css’ with content type HTML into incompatible type HTML/CSS
- m.brecher
- Generous Backer | 864
Hi,
I need to include css file directly into output html, so I tried go this native way:
layout.css:
body {margin: 0; background-position: center center; background-repeat: repeat; font-family: var(--base-font-family);}
body * {box-sizing: border-box;}
.......
@layout.latte:
<style>
{include $wwwDir.'/css/layout.css'}
</style>
This produces exception:
Latte\RuntimeException
Including '.../css/layout.css' with content type HTML into incompatible type HTML/CSS.
This is little surprising behaviour – the file layout.css isn´t of type html – its clearly identifiable from file extension and also from the content of the file that it is css.
Include the content of css file between html tags <style></style> is correct and the exception is exaggerated.
I haven´t found in latte documentation any notice about including any other file type than .latte.
I know that I can easily solve the problem by copying the css content into latte file between <style></style> tags:
layout-css.latte:
<style>
...css code...
</style>
But I want to write the css code in css file, first because the IDE works better, second I want to have the possibility to change easily including css via <link …> or via {include …}.
In php I was using this simple code:
@layout.php:
.....
<style>
<?php include $wwwDir.'/css/layout.css' ?>
</style>
.....
Exist some equivalent in Latte for something like this above?
Of course I have tried to use php code in latte template like this:
.....
<style>
{php include $wwwDir.'/css/layout.css'}
</style>
.....
But this also ends with exception:
Latte\CompileException
Unexpected '$appDir', expecting end of tag in {php} ...
It looks like an intention not to allow including other files that .latte – may be from security reasons?
Thanks for any advice or information.
Last edited by m.brecher (2023-01-12 02:53)
- m.brecher
- Generous Backer | 864
Hi,
I made last attempt to find a solution by myself and this works:
<style>
{php readfile($wwwDir.'/css/layout.css')}
</style>
It looks like php include is completely disabled in latte in the tag {php …} but the error message isn´t sufficiently clear (see in my previous post). If it is so, than I propose to make the error message from latte more clear and It would be also useful make some comment in latte documentation about how include css file.
Last edited by m.brecher (2023-01-12 02:52)
- nightfish
- Member | 517
m.brecher wrote:
..... <style> {php include $wwwDir.'/css/layout.css'} </style> .....
But this also ends with exception:
Latte\CompileException Unexpected '$appDir', expecting end of tag in {php} ...
It looks like an intention not to allow including other files that .latte – may be from security reasons ??
- Your code contains
$wwwDir
, but the exception message mentions$appDir
. - I am not sure whether this error is caused by an intention or rather by not
supporting PHP language constructs, such as
echo
,include
,foreach
, as opposed to functions (file_get_contents()
,readfile()
), in general.
- Kamil Valenta
- Member | 815
<style type="text/css">
@import url({$wwwDir}+"/css/layout.css");
</style>
- m.brecher
- Generous Backer | 864
@nightfish
Your code contains $wwwDir, but the exception message mentions $appDir
Of course, you are right, I have simplified the code for posting on forum here, the code contains also $appDir but in more complicated code, but this is not the case.
Now it looks like, that latte doesnt allowe any potentially dangerous php functions like echo, include, … and readfile looks to be considered as safe ;).
Last edited by m.brecher (2023-01-12 14:02)
- nightfish
- Member | 517
m.brecher wrote:
Now it looks like, that latte doesnt allowe any potentially dangerous php functions like echo, include, … and readfile looks to be considered as safe ;).
That was the main idea of my previous message – that echo
,
include
etc. are not functions, but rather language
constructs. And that it is quite possible that Latte does not support
language constructs because of their syntactical differences, not because of
safety reasons.
- m.brecher
- Generous Backer | 864
@Milo
I'am solving it by adding <style> into CSS file, change its extension into latte and include it.
Thanks for tip, I know this and also I have mentioned it in my original post why I prefer to go the way simple css file. The reason is that outside latte plugin in phpStorm is much more comfortable to work. Unfortunately at the time being the latte plugin of @mesour blocks many very useful functions of the phpStorm IDE. The completing of file paths, completing of class names, …
An after you wroute 200 lines of css code outside latte and than copy it into latte like this:
style.latte
<style>
.heading {font-family: Arial, sans-serif;} // sample of one line of css
.....
</style>
after than comes hundreds of latte exceptions like this:
Latte\CompileException
Unexpected tag {font-family} (in JavaScript or CSS, try to put a space after bracket or use n:syntax=off)
The whole Nette community knows that in Latte you have to write css with space after { and no one exceptions occurs, but – you use old css code, the css code writes somebody who doesn´t know latte, ......
Last week I have worked in PHP project and I was surprised how easy it is creating php templates and styles if the IDE completes 100% of all paths, and all css classes. I hope one day something similar would be also in Latte ;)
Notice: native phpStorm IDE completes paths in “a smart way” like this:
// index.php
$rootDir = __DIR__;
// /templates/@layout.php
include $rootDir.'/.... // hints all directories in $rootDir !!
For backend developers may this my crying looks like hypersensitivity but quality of prompting has BIG impact on productivity of making the code. It's a pitty that great functionality of prompting which is ALREADY AVAILABLE in phpStorm IDE is not in latte plugin accessible :(.
Last edited by m.brecher (2023-01-12 14:36)
- Marek Bartoš
- Nette Blogger | 1261
<style> {include $wwwDir.'/css/layout.css'} </style>
This looks like something that could be supported and no one yet just considered such use case. Latte 3 needs most things to be explicitly allowed to work
<style> {php include $wwwDir.'/css/layout.css'} </style>
This works only with RawPhpExtension
enabled. Include is a
language construct which is not supported by Latte's PHP dialect and you would
need that dialect to be replaced by raw PHP.
$this->template->getLatte()->addExtension(new \Latte\Essential\RawPhpExtension());
<style type="text/css"> @import url({$wwwDir}+"/css/layout.css"); </style>
How is that helpful? Still an external file, just different syntax
Last edited by Marek Bartoš (2023-01-12 14:29)
- m.brecher
- Generous Backer | 864
@MarekBartoš
Yes, or support in latte, or mention in documentation recommended way how to do this – this doesn´t matter. I think that nobody has mentioned this because everybody will find at the end some solution – me too. But there is another problem, more serious – why I prefer not to write css in latte – that´s because of blocking some very useful hinting of phpStormIDE in latte plugin.
I have described this in more details in my post to @Milo https://forum.nette.org/…ype-html-css#…
- Kamil Valenta
- Member | 815
Marek Bartoš wrote:
<style type="text/css"> @import url({$wwwDir}+"/css/layout.css"); </style>
How is that helpful? Still an external file, just different syntax
But you avoid compilation and latte processing, which you don't need anyway with .css file.
- Kamil Valenta
- Member | 815
mystik wrote:
@KamilValenta But it is basically just more complicated version of
<link rel="stylesheet" href="{$wwwDir}/css/layout.css">
No, <link rel…> is valid tag in head, but @mbrecher required
to write style in body tag.
Would this make sense then? “I want to have the possibility to change easily
including css via <link …>”?
Last edited by Kamil Valenta (2023-01-12 20:15)
- David Grudl
- Nette Core | 8218
<style> {include $wwwDir.'/css/layout.css'} </style>
This is little surprising behaviour – the file layout.css isn´t of type html – its clearly identifiable from file extension and also from the content of the file that it is css.
{include}
is used purely to loads templates written in Latte or
blocks and does not take into account file extension. It's written in the
documentation this way https://latte.nette.org/en/tags#…
..... <style> <?php include $wwwDir.'/css/layout.css' ?> </style> .....
Exist some equivalent in Latte for something like this above ??
The include
in PHP works the same way as {include}
in Latte – it is used to load PHP scripts and does not take into account the
extension. Loading CSS with it is a mistake. If the file contained
<?
characters, it would break it.
<style> {php readfile($wwwDir.'/css/layout.css')} </style>
Yeah, that's the correct way. So there is one security risk (CSS file must
not contain </style
), which Latte does not address at the
moment, but is going to in the next version.
- David Grudl
- Nette Core | 8218
after than comes hundreds of latte exceptions like this:
Latte\CompileException Unexpected tag {font-family} (in JavaScript or CSS, try to put a space after bracket or use n:syntax=off)
Use <style n:syntax=off>
🤦♂️
- m.brecher
- Generous Backer | 864
@KamilValenta
but @mbrecher required to write style in body tag
Sorry Kamil for may be not clear formulation. I didn´t think about writing css code into html tag body but into output html code directly not via <link> tag – of course into html tag head – something like this:
<head>
<style>
... direct css code ...
</style>
...
</head>
I agree with @MarekBartoš and @mystik that @import is more or less the same as <link>.