【问题标题】:Symfony2 and Twig - Check if an asset existsSymfony2 和 Twig - 检查资产是否存在
【发布时间】:2013-06-03 14:02:59
【问题描述】:

我有一个使用 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 条件始终为真。

有什么想法吗?谢谢。

【问题讨论】:

标签: php symfony twig assets


【解决方案1】:

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

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') %}

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

【讨论】:

  • 我在 assets_exists 中添加了 / TEST IMAGE =&gt; {% if asset_exists('/bundles/fuztest/images/test.png') %} YES ! asset_exists {% else %}NO asset_exists :({% endif %}
  • @Alain Tiemblo 我已经尝试过您的解决方案,如果存在 .jpg 文件,我正在寻找它以列出
    以显示图像,如果不存在,则不要显示图像。我正在使用以下内容:{% if asset_exists('/images/.jpeg') %},即使列出的帖子有 .jpeg 文件,也没有找到任何内容。使用 .jpeg 是查找此内容的正确方法吗?图片在 web/images 中
  • 这个 Twig 函数检查是否存在真实路径。这意味着,如果 some_image.jpg 存在,asset_exists('/images/some_image.jpg') 将返回 true。您目前不能在文件名中添加一个小丑,但这很容易实现。将if (!is_file($toCheck)) 替换为if (count(glob($toCheck)) == 0)。然后,使用asset_exists('/image/*.jpeg')
  • 你不需要在这里注入整个内核 - 只需 %kernel.root_dir% 参数。
  • 哦,是的,你是对的。这个答案有点老了,有时间我会更新它。谢谢!
【解决方案2】:

您的代码中有错字:

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

应该是

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

【讨论】:

    【解决方案3】:

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

    只需通过扩展 Twig 引擎注册 file_exists 即可在 Twig 模板中进行测试^^

    【讨论】:

    • 谢谢西比奥。这可能有效,但我找到了另一种方法,适用于我的情况。对于每个会议对象,我都有图像对象,如果设置了图像,特定会议的图像对象将为空,所以我可以这样测试。但是您的回答更完整,我会接受。再次感谢。
    • -1,您的回答提供了一种检查文件是否存在的方法,而不是具体的资产。
    • 我的意思是,您可以在扩展中注入内核并使用适当的方法来检查资产是否存在,我会写下我的答案,这将更好地解释。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签