# Twig Assets Extension

Armazenamento em cache e compactação para  Twig (JavaScript e CSS).

## Installation

```
composer install enio-dev/twig-assets
```

## Requirements

* PHP 7.0+

## Configuration

```php
$options = [
    // Pasta dos arquivos publicos
    'path' => '/var/www/example.com/htdocs/public/assets/cache',

    // Permissões de diretório de cache público (octal)
    // Você precisa prefixar o modo com um zero (0)
    // Use -1 para desativar o chmod
    'path_chmod' => 0755,

    // O caminho base do URL público
    'url_base_path' => 'assets/cache/',

    // Configurações de cache interno
    //
    // O diretório principal de cache
    // Use '' (string vazia) para desativar o cache interno
    'cache_path' => '/var/www/example.com/htdocs/temp',

    // Usado como o subdiretório do diretório cache_path,
    // onde os itens de cache serão armazenados
    'cache_name' => 'assets-cache',

    // A vida útil (em segundos) para itens de cache
    // Com um valor 0, fazendo com que os itens sejam armazenados indefinidamente
    'cache_lifetime' => 0,

    // Ativar compactação JavaScript e CSS
    // 1 = on, 0 = off
    'minify' => 1
];
```

## Integração

### Registre a extensão Twig

```php
$loader = new \Twig\Loader\FilesystemLoader('/path/to/templates');
$twig = new \Twig\Environment($loader, array(
    'cache' => '/path/to/compilation_cache',
));

$twig->addExtension(new \EnioDev\Twig\TwigAssetsExtension($twig, $options));
```

### Slim Framework

Requisitos

* [Slim Framework Twig View](https://github.com/slimphp/Twig-View)

No seu `dependencies.php` ou onde quer que você adicione suas Fábricas de Serviços:

```php
$container[\Slim\Views\Twig::class] = function (Container $container) {
    $settings = $container->get('settings');
    $viewPath = $settings['twig']['path'];

    $twig = new \Slim\Views\Twig($viewPath, [
        'cache' => $settings['twig']['cache_enabled'] ? $settings['twig']['cache_path']: false
    ]);

    /** @var \Twig\Loader\FilesystemLoader $loader */
    $loader = $twig->getLoader();
    $loader->addPath($settings['public'], 'public');

    // Instanciar e adicionar extensão específica Slim
    $basePath = rtrim(str_ireplace('index.php', '', $container->get('request')->getUri()->getBasePath()), '/');
    $twig->addExtension(new \Slim\Views\TwigExtension($container->get('router'), $basePath));

    // Adicione a extensão Assets ao Twig
    $twig->addExtension(new \EnioDev\Twig\TwigAssetsExtension($twig->getEnvironment(), $settings['assets']));

    return $twig;
};
```

## Uso

### Funções de modelo personalizadas

Esta extensão do Twig expõe uma função personalizada `assets ()` aos seus modelos do Twig. Você pode usar esta função para gerar URLs completos para qualquer ativo de aplicativo Slim.

#### Parameters

Name | Type | Default | Required | Description
--- | --- | --- | --- | ---
files | array | [] | yes | Todos os arquivos a serem entregues ao navegador. [Namespaced Twig Paths](http://symfony.com/doc/current/templating/namespaced_paths.html) (`@mypath/`) também são suportados.
inline | bool | false | no | Define se o navegador baixa os ativos em linha ou via URL.
minify | bool | true | no | Especifica se a compactação JS / CSS está ativada ou desativada.
name | string | file | no | Define o nome do arquivo de saída na URL.

### Template

#### Saída de conteúdo CSS em cache e minificado

```twig
{{ assets({files: ['Login/login.css']}) }}
```

Saída de conteúdo CSS em cache e minificado inline:

```twig
{{ assets({files: ['Login/login.css'], inline: true}) }}
```

Envie vários testes CSS em um único arquivo .css:

```twig
{{ assets({files: [
    '@public/css/default.css',
    '@public/css/print.css',
    'User/user-edit.css'
    ], name: 'layout.css'})
}}
```

#### Saída de conteúdo JavaScript em cache e minificado

```twig
{{ assets({files: ['Login/login.js']}) }}
```

Envie vários testes JavaScript em um único arquivo .js:

```twig
{{ assets({files: [
    '@public/js/my-js-lib.js',
    '@public/js/notify.js',
    'Layout/app.js'
    ], name: 'layout.js'})
}}
```

#### Recursos específicos da página de saída

Conteúdo do arquivo: `layout.twig`

```twig
<html>
    <head>
        {% block assets %}{% endblock %}
    </head>
    <body>
        {% block content %}{% endblock %}
    </body>
</html>
```

Conteúdo de `home.twig`:

```twig
{% extends "Layout/layout.twig" %}

{% block assets %}
    {{ assets({files: ['Home/home.js'], name: 'home.js'}) }}
    {{ assets({files: ['Home/home.css'], name: 'home.css'}) }}
{% endblock %}

{% block content %}
    <div id="content" class="container"></div>
{% endblock %}
```

## Configurar um caminho base

Você deve informar ao navegador onde encontrar os ativos da web com uma `base href` no seu modelo de layout.

### Exemplo de Slim Twig:

```twig
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <!-- outras coisas -->
    <base href="{{ base_url() }}/"/>
    <!-- outras coisas -->

    <!-- arquivos na pasta public usa @ -->
    {{ assets({files: [
        '@public/js/jquery.min.js',
        '@public/js/popper.min.js',
        '@public/js/tooltip.min.js',
        '@public/js/bootstrap.min.js'
    ], name: 'jquery-bootstrap.js'}) }}

    <!-- arquivos dentro do tema -->
    {{ assets({files: [
        'public/js/jquery.min.js',
        'public/js/popper.min.js',
        'public/js/tooltip.min.js',
        'public/js/bootstrap.min.js'
    ], name: 'jquery-bootstrap.js'}) }}
```

## Limpando o cache

### Limpando o cache interno

```php
use EnioDev\Twig\TwigAssetsCache;

$settings = $container->get('settings');

// Caminho interno do cache, por exemplo tmp / twig-cache
$twigCachePath = $settings['twig']['cache_path'];

$internalCache = new TwigAssetsCache($twigCachePath);
$internalCache->clearCache();
```

### Limpando o cache público

```php
use EnioDev\Twig\TwigAssetsCache;

$settings = $container->get('settings');

// Public assets cache directory e.g. 'public/cache' or 'public/assets'
$publicAssetsCachePath = $settings['assets']['path'];

$internalCache = new TwigAssetsCache($publicAssetsCachePath);
$internalCache->clearCache();
```
