Symfony2 - checking if file exists

前端 未结 6 1233
执笔经年
执笔经年 2020-12-05 05:59

I have a loop in Twig template, which returns multiple values. Most important - an ID of my entry. When I didn\'t use any framework nor template engine, I used simply

6条回答
  •  [愿得一人]
    2020-12-05 06:06

    I've created a Twig function which is an extension of the answers I have found on this topic. My asset_if function takes two parameters: the first one is the path for the asset to display. The second parameter is the fallback asset, if the first asset does not exist.

    Create your extension file:

    src/Showdates/FrontendBundle/Twig/Extension/ConditionalAssetExtension.php:

    container = $container;
        }
    
        /**
         * Returns a list of functions to add to the existing list.
         *
         * @return array An array of functions
         */
        public function getFunctions()
        {
            return array(
                'asset_if' => new \Twig_Function_Method($this, 'asset_if'),
            );
        }
    
        /**
         * Get the path to an asset. If it does not exist, return the path to the
         * fallback path.
         * 
         * @param string $path the path to the asset to display
         * @param string $fallbackPath the path to the asset to return in case asset $path does not exist
         * @return string path
         */
        public function asset_if($path, $fallbackPath)
        {
            // Define the path to look for
            $pathToCheck = realpath($this->container->get('kernel')->getRootDir() . '/../web/') . '/' . $path;
    
            // If the path does not exist, return the fallback image
            if (!file_exists($pathToCheck))
            {
                return $this->container->get('templating.helper.assets')->getUrl($fallbackPath);
            }
    
            // Return the real image
            return $this->container->get('templating.helper.assets')->getUrl($path);
        }
    
        /**
         * Returns the name of the extension.
         *
         * @return string The extension name
         */
        public function getName()
        {
           return 'asset_if';
        }
    }
    

    Register your service (app/config/config.yml or src/App/YourBundle/Resources/services.yml):

    services:
        showdates.twig.asset_if_extension:
            class: Showdates\FrontendBundle\Twig\Extension\ConditionalAssetExtension
            arguments: ['@service_container']
            tags:
              - { name: twig.extension }
    

    Now use it in your templates like this:

    
    

提交回复
热议问题