Spec-Zone.ru › Phalcon 2

Управление активами

Phalcon\Assets — компонент, позволяющий разработчику управлять статическими ресурсами, такими как стили CSS или библиотеки JavaScript, в веб-приложении.

Phalcon\Assets\Manager доступен в контейнере сервисов, поэтому вы можете добавлять ресурсы из любой части приложения, где доступен контейнер.

Добавление ресурсов

Assets поддерживает два встроенных типа ресурсов: css и javascripts. Вы можете создавать другие типы ресурсов при необходимости. Менеджер активов внутренне хранит два набора ресурсов: один для JavaScript и другой для CSS.

Вы можете легко добавить ресурсы в эти наборы следующим образом:

class IndexController extends Phalcon\Mvc\Controller
{
    public function index()
    {

        //Add some local CSS resources
        $this->assets
            ->addCss('css/style.css')
            ->addCss('css/index.css');

        //and some local javascript resources
        $this->assets
            ->addJs('js/jquery.js')
            ->addJs('js/bootstrap.min.js');

    }
}

Затем в представлениях добавленные ресурсы можно вывести:

<html>
    <head>
        <title>Some amazing website</title>
        <?php $this->assets->outputCss() ?>
    </head>
    <body>

        <!-- ... -->

        <?php $this->assets->outputJs() ?>
    </body>
<html>

Синтаксис Volt:

<html>
    <head>
        <title>Some amazing website</title>
          {{ assets.outputCss() }}
    </head>
    <body>

        <!-- ... -->

          {{ assets.outputJs() }}
    </body>
<html>

Локальные/удаленные ресурсы

Локальные ресурсы предоставляются тем же приложением и находятся в корневой директории приложения. URL-адреса локальных ресурсов генерируются сервисом «url», обычно Phalcon\Mvc\Url.

Удаленные ресурсы — это такие ресурсы, как общие библиотеки (например, jQuery, Bootstrap), которые предоставляются CDN.

public function indexAction()
{

    //Add some local CSS resources
    $this->assets
        ->addCss('//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css', false)
        ->addCss('css/style.css', true);
}

Наборы

Наборы группируют ресурсы одного типа. Менеджер активов неявно создаёт два набора: css и js. Вы можете создать дополнительные наборы для группировки определённых ресурсов, чтобы упростить их размещение в представлениях:

//Javascripts in the header
$this->assets
    ->collection('header')
    ->addJs('js/jquery.js')
    ->addJs('js/bootstrap.min.js');

//Javascripts in the footer
$this->assets
    ->collection('footer')
    ->addJs('js/jquery.js')
    ->addJs('js/bootstrap.min.js');

Затем в представлениях:

<html>
    <head>
        <title>Some amazing website</title>
        <?php $this->assets->outputJs('header') ?>
    </head>
    <body>

        <!-- ... -->

        <?php $this->assets->outputJs('footer') ?>
    </body>
<html>

Синтаксис Volt:

<html>
    <head>
        <title>Some amazing website</title>
          {{ assets.outputCss('header') }}
    </head>
    <body>

        <!-- ... -->

          {{ assets.outputJs('footer') }}
    </body>
<html>

Префиксы

Наборы могут иметь URL-префиксы, что позволяет легко переключаться между серверами в любой момент:

$scripts = $this->assets->collection('footer');

if ($config->environment == 'development') {
    $scripts->setPrefix('/');
} else {
    $scripts->setPrefix('http:://cdn.example.com/');
}

$scripts->addJs('js/jquery.js')
        ->addJs('js/bootstrap.min.js');

Доступен также цепочный синтаксис:

$scripts = $assets
    ->collection('header')
    ->setPrefix('http://cdn.example.com/')
    ->setLocal(false)
    ->addJs('js/jquery.js')
    ->addJs('js/bootstrap.min.js');

Минификация/Фильтрация

Phalcon\Assets предоставляет встроенную минификацию ресурсов JavaScript и CSS. Разработчик может создать набор ресурсов, указав менеджеру активов, какие из них должны быть отфильтрованы, а какие — нет. Кроме того, Jsmin от Douglas Crockford входит в состав расширения и обеспечивает минификацию файлов JavaScript для максимальной производительности. В мире CSS доступна также библиотека CSSMin от Ryan Day для минификации CSS-файлов:

Следующий пример демонстрирует, как минифицировать набор ресурсов:

$manager

    //These Javascripts are located in the page's bottom
    ->collection('jsFooter')

    //The name of the final output
    ->setTargetPath('final.js')

    //The script tag is generated with this URI
    ->setTargetUri('production/final.js')

    //This is a remote resource that does not need filtering
    ->addJs('code.jquery.com/jquery-1.10.0.min.js', true, false)

    //These are local resources that must be filtered
    ->addJs('common-functions.js')
    ->addJs('page-functions.js')

    //Join all the resources in a single file
    ->join(true)

    //Use the built-in Jsmin filter
    ->addFilter(new Phalcon\Assets\Filters\Jsmin())

    //Use a custom filter
    ->addFilter(new MyApp\Assets\Filters\LicenseStamper());

Он начинает получать набор ресурсов от менеджера активов. Набор может содержать JavaScript- или CSS-ресурсы, но не оба типа одновременно. Некоторые ресурсы могут быть удалёнными, то есть они получаются по HTTP из удалённого источника для дальнейшей фильтрации. Рекомендуется преобразовать внешние ресурсы в локальные, чтобы избежать накладных расходов на их получение.

//These Javascripts are located in the page's bottom
$js = $manager->collection('jsFooter');

Как показано выше, метод addJs используется для добавления ресурсов в набор. Второй параметр указывает, является ли ресурс внешним, а третий — должен ли ресурс быть отфильтрован или оставлен без изменений:

// This a remote resource that does not need filtering
$js->addJs('code.jquery.com/jquery-1.10.0.min.js', true, false);

// These are local resources that must be filtered
$js->addJs('common-functions.js');
$js->addJs('page-functions.js');

Фильтры регистрируются в наборе. Допускается несколько фильтров. Содержимое ресурсов фильтруется в том же порядке, в котором были зарегистрированы фильтры:

//Use the built-in Jsmin filter
$js->addFilter(new Phalcon\Assets\Filters\Jsmin());

//Use a custom filter
$js->addFilter(new MyApp\Assets\Filters\LicenseStamper());

Обратите внимание, что встроенные и пользовательские фильтры могут применяться к наборам ресурсов прозрачно. Последний шаг — определить, должны ли все ресурсы набора объединяться в один файл или каждый из них подаваться индивидуально. Чтобы указать набору, что все ресурсы должны быть объединены, можно использовать метод «join»:

// This a remote resource that does not need filtering
$js->join(true);

//The name of the final file path
$js->setTargetPath('public/production/final.js');

//The script html tag is generated with this URI
$js->setTargetUri('production/final.js');

Если ресурсы будут объединены, нам также нужно определить, какой файл будет использоваться для хранения ресурсов и какой URI будет использоваться для его отображения. Эти настройки задаются с помощью setTargetPath() и setTargetUri().

Встроенные фильтры

Phalcon предоставляет 2 встроенных фильтра для минификации JavaScript и CSS соответственно. Их C-бекенд обеспечивает минимальную нагрузку для выполнения этой задачи:

Фильтр Описание
Phalcon\Assets\Filters\Jsmin Минифицирует JavaScript, удаляя ненужные символы, которые игнорируются интерпретаторами/компиляторами JavaScript
Phalcon\Assets\Filters\Cssmin Минифицирует CSS, удаляя ненужные символы, которые уже игнорируются браузерами

Пользовательские фильтры

В дополнение к встроенным фильтрам разработчик может создавать собственные. Они могут использовать существующие и более продвинутые инструменты, такие как YUI, Sass, Closure и др.:

use Phalcon\Assets\FilterInterface;

/**
 * Filters CSS content using YUI
 *
 * @param string $contents
 * @return string
 */
class CssYUICompressor implements FilterInterface
{

    protected $_options;

    /**
     * CssYUICompressor constructor
     *
     * @param array $options
     */
    public function __construct($options)
    {
        $this->_options = $options;
    }

    /**
     * Do the filtering
     *
     * @param string $contents
     * @return string
     */
    public function filter($contents)
    {

        //Write the string contents into a temporal file
        file_put_contents('temp/my-temp-1.css', $contents);

        system(
            $this->_options['java-bin'] .
            ' -jar ' .
            $this->_options['yui'] .
            ' --type css '.
            'temp/my-temp-file-1.css ' .
            $this->_options['extra-options'] .
            ' -o temp/my-temp-file-2.css'
        );

        //Return the contents of file
        return file_get_contents("temp/my-temp-file-2.css");
    }
}

Использование:

//Get some CSS collection
$css = $this->assets->get('head');

//Add/Enable the YUI compressor filter in the collection
$css->addFilter(new CssYUICompressor(array(
     'java-bin' => '/usr/local/bin/java',
     'yui' => '/some/path/yuicompressor-x.y.z.jar',
     'extra-options' => '--charset utf8'
)));

Настройка вывода

Методы outputJs и outputCss доступны для генерации необходимых HTML-кодов в соответствии с каждым типом ресурсов. Вы можете переопределить эти методы или вручную выводить ресурсы следующим образом:

foreach ($this->assets->collection('js') as $resource) {
    echo \Phalcon\Tag::javascriptInclude($resource->getPath());
}

© 2011–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/assets.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API