Drupal - Get path to theme assets in Twig template
you can use {{ base_path ~ directory }}
which will fix the absolute problem, no need to do any preprocessing, both of these variables are included by core.
For example
<img src="{{ base_path ~ directory }}/images/logo.png" alt="My Logo" />
PS. the ~
helper in twig is concatenate.
Edit: at least in the page*.html.twig templates base_path variable is included, possibly you will need to do preprocessing for other templates, you can easily check with {{ dump() }}
if the variables are present
// File: THEMENAME.theme in your theme's root directory
function THEMENAME_preprocess(&$variables, $hook)
{
$variables['base_path'] = base_path();
}
<img src="/{{ directory }}/images/logo.png"/>
worked for me when
<img src="{{ base_path ~ directory }}/images/logo.png" alt="My Logo" />
did not
for content template, i had to use in .module
function hook_preprocess(&$variables, $hook) {
$module_handler = Drupal::service('module_handler');
$path = $module_handler->getModule('myModuleName')->getPath();
if(isset($variables['region']) && $variables['region'] == 'content'){
$variables['module_path'] = $path;
$variables['http_host'] = $_SERVER['HTTP_HOST'];
and
<img src="{{ module_path }}/images/error404.png" />
<img src="//{{ http_host }}/{{ module_path }}/images/error403.png" />
There is by default a {{ directory }}
variable that you can use that points to your theme directory. The problem is, it's not absolute, just like the one you added. I think that's a bug in core because it should include the base path, but changing that would of course break existing sites that use it.
So you need to add a / in front of it; this would break if Drupal is installed in a subfolder. You can either hardcode that in your template or keep using base_path()
as you did in 7.x in a custom variable.