vendor/assetic/docs/en/define.md
author cavaliet
Tue, 15 Nov 2011 12:27:02 +0100
changeset 31 f457dd0e7a1e
parent 0 7f95f8617b0b
permissions -rwxr-xr-x
First step to add context search to a page. Works fine but needs to be improved with several list of selectors.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
Defining Assets "On The Fly"
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
----------------------------
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
The second approach to using Assetic involves defining your application's
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
assets "on the fly" in your templates, instead of in an isolated PHP file.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
Using this approach, your PHP template would look something like this:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
    <script src="<?php echo assetic_javascripts('js/*', 'yui_js') ?>"></script>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
This call to `assetic_javascripts()` serves a dual purpose. It will be read by
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
the Assetic "formula loader" which will extract an asset "formula" that can be
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
used to build, dump and output the asset. It will also be executed when the
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
template is rendered, at which time the path to the output asset is output.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
Assetic includes the following templating helper functions:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 * `assetic_image()`
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
 * `assetic_javascripts()`
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
 * `assetic_stylesheets()`
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
Defining assets on the fly is a much more sophisticated technique and
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
therefore relies on services to do the heavy lifting. The main one being the
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
asset factory.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
### Asset Factory
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
The asset factory knows how to create asset objects using only arrays and
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
scalar values as input. This is the same string syntax used by the `assetic_*`
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
template helper functions.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    use Assetic\Factory\AssetFactory;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
    $factory = new AssetFactory('/path/to/web');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    $js = $factory->createAsset(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
        'js/jquery.js',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
        'js/jquery.plugin.js',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
        'js/application.js',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
### Filter Manager
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
You can also apply filters to asset created by the factory. To do this you
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
must setup a `FilterManager`, which organizes filters by a name.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
    use Assetic\FilterManager;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
    use Assetic\Filter\GoogleClosure\ApiFilter as ClosureFilter;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    $fm = new FilterManager();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    $fm->set('closure', new ClosureFilter());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
    $factory->setFilterManager($fm);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
    $js = $factory->createAsset('js/*', 'closure');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
This code creates an instance of the Google Closure Compiler filter and
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
assigns it the name `closure` using a filter manager. This filter manager is
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
then injected into the asset factory, making the filter available as `closure`
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
when creating assets.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
### Debug Mode
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
The asset factory also introduces the concept of a debug mode. This mode
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
allows you to omit certain filters from assets the factory creates depending
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
on whether it is enabled or not.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
For example, the YUI Compressor is awesome, but it is only appropriate in a
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
production environment as it is very difficult to debug minified Javascript.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
    use Asset\Factory\AssetFactory;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
    $factory = new AssetFactory('/path/to/web', true); // debug mode is on
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
    $factory->setFilterManager($fm);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
    $js = $factory->createAsset('js/*', '?closure');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
By prefixing the `closure` filter's name with a question mark, we are telling
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
the factory this filter is optional and should only be applied with debug mode
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
is off.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
### Asset Manager and Asset References
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
The asset factory provides another special string syntax that allows you to
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
reference assets you defined elsewhere. These are called "asset references"
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
and involve an asset manager which, similar to the filter manager, organizes
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
assets by name.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
    use Assetic\AssetManager;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
    use Assetic\Asset\FileAsset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
    use Assetic\Factory\AssetFactory;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
    $am = new AssetManager();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
    $am->set('jquery', new FileAsset('/path/to/jquery.js'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
    $factory = new AssetFactory('/path/to/web');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
    $factory->setAssetManager($am);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
    $js = $factory->createAsset(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
        '@jquery',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
        'js/application.js',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
    ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
### Extracting Assets from Templates
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
Once you've defined a set of assets in your templates you must use the
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
"formula loader" service to extract these asset definitions.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
    use Assetic\Factory\Loader\FunctionCallsFormulaLoader;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
    use Assetic\Factory\Resource\FileResource;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    $loader = new FunctionCallsFormulaLoader($factory);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
    $formulae = $loader->load(new FileResource('/path/to/template.php'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
These asset formulae aren't much use by themselves. They each include just
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
enough information for the asset factory to create the intended asset object.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
In order for these to be useful they must be wrapped in the special
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
`LazyAssetManager`.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
### The Lazy Asset Manager
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
This service is a composition of the asset factory and one or more formula
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
loaders. It acts as the glue between these services behind the scenes, but can
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
be used just like a normal asset manager on the surface.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
    use Assetic\Asset\FileAsset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    use Assetic\Factory\LazyAssetManager;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
    use Assetic\Factory\Loader\FunctionCallsFormulaLoader;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
    use Assetic\Factory\Resource\DirectoryResource;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
    $am = new LazyAssetManager($factory);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
    $am->set('jquery', new FileAsset('/path/to/jquery.js'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
    $am->setLoader('php', new FunctionCallsFormulaLoader($factory));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
    $am->addResource(new DirectoryResource('/path/to/templates', '/\.php$/'), 'php');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
### Asset Writer
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
Finally, once you've create an asset manager that knows about every asset
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
you've defined in your templates, you must use an asset writer to actually
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
create the files your templates are going to be referencing.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
    use Assetic\AssetWriter;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
    $writer = new AssetWriter('/path/to/web');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
    $writer->writeManagerAssets($am);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
After running this script, all of the assets in your asset manager will be
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
loaded into memory, filtered with their configured filters and dumped to your
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
web directory as static files, ready to be served.