[英]Symfony2 and Twig - Check if an asset exists
I have a symfony2 project using twig templates. 我有一个使用twig模板的symfony2项目。
I am displaying some images and would like to display the image only if the specific asset exists. 我正在显示一些图像,并且仅在特定资产存在时才显示图像。
I have this: 我有这个:
{% if asset('bundles/sciforumversion2/images/logos/'~conf.img) %}
<img style="width: 60px; float:right; margin-right: 15px;" src="{{ asset('bundles/sciforumversion2/images/logos/')}}{{ conf.img }}"/>
{% endif %}
But the if condition is always true. 但if条件总是如此。
Any idea please? 有什么好主意吗? Thank you.
谢谢。
If you want to check if an asset exists, you can create a Twig extension to implement the function. 如果要检查资产是否存在,可以创建一个Twig扩展来实现该功能。
PHP In your Twig\\Extension
directory, create AssetExistsExtension.php
with the following content: PHP在
Twig\\Extension
目录中,使用以下内容创建AssetExistsExtension.php
:
<?php
namespace Fuz\TestBundle\Twig\Extension;
use Symfony\Component\HttpKernel\KernelInterface;
class AssetExistsExtension extends \Twig_Extension
{
private $kernel;
public function __construct(KernelInterface $kernel)
{
$this->kernel = $kernel;
}
public function getFunctions()
{
return array(
'asset_exists' => new \Twig_Function_Method($this, 'asset_exists'),
);
}
public function asset_exists($path)
{
$webRoot = realpath($this->kernel->getRootDir() . '/../web/');
$toCheck = realpath($webRoot . $path);
// check if the file exists
if (!is_file($toCheck))
{
return false;
}
// check if file is well contained in web/ directory (prevents ../ in paths)
if (strncmp($webRoot, $toCheck, strlen($webRoot)) !== 0)
{
return false;
}
return true;
}
public function getName()
{
return 'asset_exists';
}
}
YML And here is the configuration, to put in your services.yml
file. YML这是配置,放在您的
services.yml
文件中。
parameters:
(...)
fuz_tools.twig.asset_exists_extension.class: Fuz\TestBundle\Twig\Extension\Asset@ExistsExtension
services:
(...)
fuz_tools.twig.asset_exists_extension:
class: '%fuz_tools.twig.asset_exists_extension.class%'
arguments: ['@kernel']
tags:
- { name: twig.extension }
Twig To use this extension, on a twig file, use: Twig要在twig文件中使用此扩展名,请使用:
{% if asset_exists('bundles/fuztest/images/test.png') %}
Note : do not forget to replace namespaces to match with your project. 注意 :不要忘记替换名称空间以与项目匹配。
There's a typo in your code: 你的代码中有一个拼写错误:
fuz_tools.twig.asset_exists_extension.class: Fuz\TestBundle\Twig\Extension\AssetsExistsExtension
should be 应该
fuz_tools.twig.asset_exists_extension.class: Fuz\TestBundle\Twig\Extension\AssetExistsExtension
Hi Milos I already answered this question here : https://stackoverflow.com/a/14232207/875519 嗨Milos我已经在这里回答了这个问题: https : //stackoverflow.com/a/14232207/875519
Just register file_exists by extending Twig engine and then you'll be able to test inside Twig templates ^^ 只需通过扩展Twig引擎注册file_exists,然后您就可以在Twig模板内进行测试^^
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.