vendor/bundles/Symfony/Bundle/AsseticBundle/Templating/AsseticHelper.php
changeset 0 7f95f8617b0b
equal deleted inserted replaced
-1:000000000000 0:7f95f8617b0b
       
     1 <?php
       
     2 
       
     3 /*
       
     4  * This file is part of the Symfony framework.
       
     5  *
       
     6  * (c) Fabien Potencier <fabien@symfony.com>
       
     7  *
       
     8  * This source file is subject to the MIT license that is bundled
       
     9  * with this source code in the file LICENSE.
       
    10  */
       
    11 
       
    12 namespace Symfony\Bundle\AsseticBundle\Templating;
       
    13 
       
    14 use Assetic\Asset\AssetInterface;
       
    15 use Assetic\Factory\AssetFactory;
       
    16 use Assetic\Util\TraversableString;
       
    17 use Symfony\Component\Templating\Helper\Helper;
       
    18 
       
    19 /**
       
    20  * The "assetic" templating helper.
       
    21  *
       
    22  * @author Kris Wallsmith <kris@symfony.com>
       
    23  */
       
    24 abstract class AsseticHelper extends Helper
       
    25 {
       
    26     protected $factory;
       
    27 
       
    28     /**
       
    29      * Constructor.
       
    30      *
       
    31      * @param AssetFactory $factory The asset factory
       
    32      */
       
    33     public function __construct(AssetFactory $factory)
       
    34     {
       
    35         $this->factory = $factory;
       
    36     }
       
    37 
       
    38     /**
       
    39      * Returns an array of javascript urls.
       
    40      */
       
    41     public function javascripts($inputs = array(), $filters = array(), array $options = array())
       
    42     {
       
    43         if (!isset($options['output'])) {
       
    44             $options['output'] = 'js/*.js';
       
    45         }
       
    46 
       
    47         return $this->getAssetUrls($inputs, $filters, $options);
       
    48     }
       
    49 
       
    50     /**
       
    51      * Returns an array of stylesheet urls.
       
    52      */
       
    53     public function stylesheets($inputs = array(), $filters = array(), array $options = array())
       
    54     {
       
    55         if (!isset($options['output'])) {
       
    56             $options['output'] = 'css/*.css';
       
    57         }
       
    58 
       
    59         return $this->getAssetUrls($inputs, $filters, $options);
       
    60     }
       
    61 
       
    62     /**
       
    63      * Returns an array of one image url.
       
    64      */
       
    65     public function image($inputs = array(), $filters = array(), array $options = array())
       
    66     {
       
    67         if (!isset($options['output'])) {
       
    68             $options['output'] = 'images/*';
       
    69         }
       
    70 
       
    71         $options['single'] = true;
       
    72 
       
    73         return $this->getAssetUrls($inputs, $filters, $options);
       
    74     }
       
    75 
       
    76     /**
       
    77      * Gets the URLs for the configured asset.
       
    78      *
       
    79      * Usage looks something like this:
       
    80      *
       
    81      *     <?php foreach ($view['assetic']->assets('@jquery, js/src/core/*', '?yui_js') as $url): ?>
       
    82      *         <script src="<?php echo $url ?>" type="text/javascript"></script>
       
    83      *     <?php endforeach; ?>
       
    84      *
       
    85      * When in debug mode, the helper returns an array of one or more URLs.
       
    86      * When not in debug mode it returns an array of one URL.
       
    87      *
       
    88      * @param array|string $inputs  An array or comma-separated list of input strings
       
    89      * @param array|string $filters An array or comma-separated list of filter names
       
    90      * @param array        $options An array of options
       
    91      *
       
    92      * @return array An array of URLs for the asset
       
    93      */
       
    94     private function getAssetUrls($inputs = array(), $filters = array(), array $options = array())
       
    95     {
       
    96         $explode = function($value)
       
    97         {
       
    98             return array_map('trim', explode(',', $value));
       
    99         };
       
   100 
       
   101         if (!is_array($inputs)) {
       
   102             $inputs = $explode($inputs);
       
   103         }
       
   104 
       
   105         if (!is_array($filters)) {
       
   106             $filters = $explode($filters);
       
   107         }
       
   108 
       
   109         if (!isset($options['debug'])) {
       
   110             $options['debug'] = $this->factory->isDebug();
       
   111         }
       
   112 
       
   113         if (!isset($options['combine'])) {
       
   114             $options['combine'] = !$options['debug'];
       
   115         }
       
   116 
       
   117         if (isset($options['single']) && $options['single'] && 1 < count($inputs)) {
       
   118             $inputs = array_slice($inputs, -1);
       
   119         }
       
   120 
       
   121         if (!isset($options['name'])) {
       
   122             $options['name'] = $this->factory->generateAssetName($inputs, $filters, $options);
       
   123         }
       
   124 
       
   125         $asset = $this->factory->createAsset($inputs, $filters, $options);
       
   126 
       
   127         $one = $this->getAssetUrl($asset, $options);
       
   128         $many = array();
       
   129         if ($options['combine']) {
       
   130             $many[] = $one;
       
   131         } else {
       
   132             $i = 0;
       
   133             foreach ($asset as $leaf) {
       
   134                 $many[] = $this->getAssetUrl($leaf, array_replace($options, array(
       
   135                     'name' => $options['name'].'_'.$i++,
       
   136                 )));
       
   137             }
       
   138         }
       
   139 
       
   140         return new TraversableString($one, $many);
       
   141     }
       
   142 
       
   143     /**
       
   144      * Returns an URL for the supplied asset.
       
   145      *
       
   146      * @param AssetInterface $asset   An asset
       
   147      * @param array          $options An array of options
       
   148      *
       
   149      * @return string An echo-ready URL
       
   150      */
       
   151     abstract protected function getAssetUrl(AssetInterface $asset, $options = array());
       
   152 
       
   153     public function getName()
       
   154     {
       
   155         return 'assetic';
       
   156     }
       
   157 }