2

我有一个使用 twig 模板的 symfony2 项目。

我正在显示一些图像,并且希望仅在特定资产存在时才显示图像。

我有这个:

{% 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 %}

但 if 条件始终为真。

请问有什么想法吗?谢谢你。

4

3 回答 3

17

如果要检查资产是否存在,可以创建一个Twig 扩展来实现该功能。

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这是配置,放入您的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要使用此扩展,请在 twig 文件上使用:

{% if asset_exists('bundles/fuztest/images/test.png') %}

注意:不要忘记替换命名空间以匹配您的项目。

于 2013-06-03T21:41:39.330 回答
1

您的代码中有一个错字:

fuz_tools.twig.asset_exists_extension.class: Fuz\TestBundle\Twig\Extension\AssetsExistsExtension

应该

fuz_tools.twig.asset_exists_extension.class: Fuz\TestBundle\Twig\Extension\AssetExistsExtension
于 2013-07-17T21:39:29.357 回答
0

嗨,米洛斯,我已经在这里回答了这个问题:https ://stackoverflow.com/a/14232207/875519

只需通过扩展 Twig 引擎注册 file_exists,然后您就可以在 Twig 模板中进行测试 ^^

于 2013-06-03T14:15:33.857 回答