Kaynağa Gözat

[AsseticBundle] added the ability to define assets outside of the view layer

In config.yml:

    assetic:
        assets:
            jquery: js/jquery.js
            plugin1:
                - @jquery
                - js/jquery.plugin1.js
            all_js:
                - @plugin1
                filters: ?yui_js
            all_css:
				- css/*.scss
                filters: [ scss, ?yui_css ]
        filters:
            yui_css:
                jar: %kernel.root_dir%/Resources/java/yui.jar
            yui_js:
                jar: %kernel.root_dir%/Resources/java/yui.jar
            scss: ~

In Twig:

    {% javascripts '@all_js' %}
    <script src="{{ asset_url }}"></script>
    {% endjavascripts %}

    {% stylesheets '@all_css' %}
    <link href="{{ asset_url }}" type="text/css" rel="stylesheet" />
    {% endstylesheets %}
Kris Wallsmith 14 yıl önce
ebeveyn
işleme
e8e87e65f7

+ 13 - 0
src/Symfony/Bundle/AsseticBundle/DependencyInjection/AsseticExtension.php

@@ -52,6 +52,19 @@ class AsseticExtension extends Extension
         $container->setParameter('assetic.node.bin', $config['node']);
         $container->setParameter('assetic.sass.bin', $config['sass']);
 
+        // register formulae
+        $formulae = array();
+        foreach ($config['assets'] as $name => $formula) {
+            $formulae[$name] = array($formula['inputs'], $formula['filters'], $formula['options']);
+        }
+
+        if ($formulae) {
+            $container->getDefinition('assetic.config_resource')->replaceArgument(0, $formulae);
+        } else {
+            $container->removeDefinition('assetic.config_loader');
+            $container->removeDefinition('assetic.config_resource');
+        }
+
         // register filters
         foreach ($config['filters'] as $name => $filter) {
             if (isset($filter['resource'])) {

+ 55 - 0
src/Symfony/Bundle/AsseticBundle/DependencyInjection/Configuration.php

@@ -77,6 +77,61 @@ class Configuration implements ConfigurationInterface
                 ->end()
             ->end()
 
+            // assets
+            ->fixXmlConfig('asset')
+            ->children()
+                ->arrayNode('assets')
+                    ->addDefaultsIfNotSet()
+                    ->requiresAtLeastOneElement()
+                    ->useAttributeAsKey('name')
+                    ->prototype('array')
+                        ->beforeNormalization()
+                            // a scalar is a simple formula of one input file
+                            ->ifTrue(function($v) { return !is_array($v); })
+                            ->then(function($v) { return array('inputs' => array($v)); })
+                        ->end()
+                        ->beforeNormalization()
+                            ->always()
+                            ->then(function($v)
+                            {
+                                // cast scalars as array
+                                foreach (array('input', 'inputs', 'filter', 'filters') as $key) {
+                                    if (isset($v[$key]) && !is_array($v[$key])) {
+                                        $v[$key] = array($v[$key]);
+                                    }
+                                }
+
+                                // organize arbitrary options
+                                foreach ($v as $key => $value) {
+                                    if (!in_array($key, array('input', 'inputs', 'filter', 'filters', 'option', 'options'))) {
+                                        $v['options'][$key] = $value;
+                                        unset($v[$key]);
+                                    }
+                                }
+
+                                return $v;
+                            })
+                        ->end()
+
+                        // the formula
+                        ->fixXmlConfig('input')
+                        ->fixXmlConfig('filter')
+                        ->children()
+                            ->arrayNode('inputs')
+                                ->prototype('scalar')->end()
+                            ->end()
+                            ->arrayNode('filters')
+                                ->prototype('scalar')->end()
+                            ->end()
+                            ->arrayNode('options')
+                                ->useAttributeAsKey('name')
+                                ->prototype('variable')->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+
             // filters
             ->fixXmlConfig('filter')
             ->children()

+ 29 - 0
src/Symfony/Bundle/AsseticBundle/Factory/Loader/ConfigurationLoader.php

@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * This file is part of the Symfony framework.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Symfony\Bundle\AsseticBundle\Factory\Loader;
+
+use Assetic\Factory\Loader\FormulaLoaderInterface;
+use Assetic\Factory\Resource\ResourceInterface;
+use Symfony\Bundle\AsseticBundle\Factory\ConfigurationResource;
+
+/**
+ * Loads configured formulae.
+ *
+ * @author Kris Wallsmith <kris@symfony.com>
+ */
+class ConfigurationLoader implements FormulaLoaderInterface
+{
+    public function load(ResourceInterface $resource)
+    {
+        return $resource instanceof ConfigurationResource ? $resource->getContent() : array();
+    }
+}

+ 44 - 0
src/Symfony/Bundle/AsseticBundle/Factory/Resource/ConfigurationResource.php

@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * This file is part of the Symfony framework.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Symfony\Bundle\AsseticBundle\Factory\Resource;
+
+use Assetic\Factory\Resource\ResourceInterface;
+
+/**
+ * A configured resource.
+ *
+ * @author Kris Wallsmith <kris@symfony.com>
+ */
+class ConfigurationResource implements ResourceInterface
+{
+    private $formulae;
+
+    public function __construct(array $formulae)
+    {
+        $this->formulae = $formulae;
+    }
+
+    public function isFresh($timestamp)
+    {
+        return true;
+    }
+
+    public function getContent()
+    {
+        return $this->formulae;
+    }
+
+    public function __toString()
+    {
+        return 'symfony';
+    }
+}

+ 10 - 0
src/Symfony/Bundle/AsseticBundle/Resources/config/assetic.xml

@@ -10,6 +10,8 @@
         <parameter key="assetic.asset_manager_cache_warmer.class">Symfony\Bundle\AsseticBundle\CacheWarmer\AssetManagerCacheWarmer</parameter>
         <parameter key="assetic.cached_formula_loader.class">Assetic\Factory\Loader\CachedFormulaLoader</parameter>
         <parameter key="assetic.config_cache.class">Assetic\Cache\ConfigCache</parameter>
+        <parameter key="assetic.config_loader.class">Symfony\Bundle\AsseticBundle\Factory\Loader\ConfigurationLoader</parameter>
+        <parameter key="assetic.config_resource.class">Symfony\Bundle\AsseticBundle\Factory\Resource\ConfigurationResource</parameter>
         <parameter key="assetic.coalescing_directory_resource.class">Assetic\Factory\Resource\CoalescingDirectoryResource</parameter>
         <parameter key="assetic.directory_resource.class">Symfony\Bundle\AsseticBundle\Factory\Resource\DirectoryResource</parameter>
         <parameter key="assetic.filter_manager.class">Symfony\Bundle\AsseticBundle\FilterManager</parameter>
@@ -36,6 +38,14 @@
             <argument>%assetic.debug%</argument>
         </service>
 
+        <service id="assetic.config_loader" class="%assetic.config_loader.class%" public="false">
+            <tag name="assetic.formula_loader" alias="config" />
+        </service>
+        <service id="assetic.config_resource" class="%assetic.config_resource.class%" public="false">
+            <tag name="assetic.formula_resource" loader="config" />
+            <argument type="collection" /> <!-- configured formulae -->
+        </service>
+
         <service id="assetic.config_cache" class="%assetic.config_cache.class%" public="false">
             <argument>%assetic.cache_dir%/config</argument>
         </service>

+ 11 - 0
src/Symfony/Bundle/AsseticBundle/Resources/config/schema/assetic-1.0.xsd

@@ -28,6 +28,17 @@
         <xsd:attribute name="name" type="xsd:string" use="required" />
     </xsd:complexType>
 
+    <xsd:complexType name="asset">
+        <xsd:sequence>
+            <xsd:element name="input" type="xsd:string" minOccurs="1" maxOccurs="unbounded" />
+            <xsd:element name="filter" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+        <xsd:attribute name="name" type="xsd:string" use="required" />
+        <xsd:attribute name="output" type="xsd:string" />
+        <xsd:attribute name="debug" type="xsd:string" />
+        <xsd:anyAttribute namespace="##any" processContents="lax" />
+    </xsd:complexType>
+
     <xsd:complexType name="filter">
         <xsd:attribute name="name" type="xsd:string" use="required" />
         <xsd:attribute name="resource" type="xsd:string" />

+ 14 - 1
src/Symfony/Bundle/AsseticBundle/Tests/Resources/config/config.yml

@@ -18,8 +18,21 @@ twig:
 assetic:
     use_controller: true
     read_from:      "%kernel.root_dir%/web"
-    bundles:        [TestBundle]
+    bundles:        [ TestBundle ]
+    assets:
+        jquery: js/jquery.js
+        app_css:
+            inputs:
+                - css/main.css
+                - css/more.css
+                - @widget_css
+            filters: [ ?yui_css ]
+            output:  css/packed/app.css
+        widget_css:
+            inputs: css/widget.sass
+            filters: sass
     filters:
+        sass: ~
         yui_css:
             jar: %kernel.root_dir/java/yui-compressor-2.4.6.jar
     twig: