Symfony2和Twig-检查资产是否存在 [英] Symfony2 and Twig - Check if an asset exists

查看:80
本文介绍了Symfony2和Twig-检查资产是否存在的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个使用树枝模板的symfony2项目.

I have a symfony2 project using twig templates.

我正在显示一些图像,并且仅在存在特定资产的情况下才显示图像.

I am displaying some images and would like to display the image only if the specific asset exists.

我有这个:

{% 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条件始终为真.

But the if condition is always true.

有什么主意吗?谢谢.

推荐答案

如果要检查资产是否存在,可以创建

If you want to check if an asset exists, you can create a Twig extension to implement the function.

PHP 在您的Twig\Extension目录中,创建具有以下内容的AssetExistsExtension.php:

PHP In your Twig\Extension directory, create AssetExistsExtension.php with the following content:

<?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文件的配置.

YML And here is the configuration, to put in your services.yml file.

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 To use this extension, on a twig file, use:

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

注意:请不要忘记替换名称空间以与您的项目匹配.

Note: do not forget to replace namespaces to match with your project.

这篇关于Symfony2和Twig-检查资产是否存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆