Перезаписать активы, используя сборку

У меня есть проект, который использует активы из разных исходных папок. Некоторые из этих активов могут перезаписать другие. Я хотел бы сослаться на актив в шаблоне ветки. Если ресурс существует более чем в одной из исходных папок, следует выбрать первую (например, изображение проекта перезаписывает изображение модуля). Я намеревался использовать kriswallsmith/assetic пакет, но не могу найти способ указать несколько корневых папок.
То, что я хочу, это что-то вроде Twig_Loader_Filesystem::addPath но для активов.

Пример:

Исходные папки:

  • assets/design (содержит images/red.jpg помимо других активов)
  • assets/module (содержит images/red.jpg помимо других активов)

В шаблоне ветки я хочу ссылаться

{% image 'images/red.jpg' %}<img src="{{ asset_url }}" />{% endimage %}

библиотека должна теперь выбрать изображение assets/design/images/red.jpg

Возможно ли это с помощью библиотеки сборок?
Если мне нужно продлить какие-либо занятия, можете ли вы дать мне несколько советов?
Или есть другая библиотека, которая бы лучше соответствовала моим потребностям?

2

Решение

хорошо, я понял, как решить мой вопрос:

Я должен расширить AssetFactory и переписать метод parseInput. Я придумал следующее решение:

use Assetic\Asset\AssetInterface;
use Assetic\Factory\AssetFactory;

class MyAssetFactory extends AssetFactory
{
/**
* @var string[]
*/
private $rootFolders;

/**
* @param string[] $rootFolders
* @param bool   $debug
*/
public function __construct($rootFolders, $debug = false)
{
if (empty($rootFolders)) {
throw new \Exception('there must be at least one folder');
}

parent::__construct($rootFolders[0], $debug);

$this->rootFolders = $rootFolders;
}

/**
* @param string $input
* @param array  $options
* @return AssetInterface an asset
*/
protected function parseInput($input, array $options = array())
{
// let the parent handle references, http assets, absolute path and glob assets
if ('@' == $input[0] || false !== strpos($input, '://') || 0 === strpos($input, '//') || self::isAbsolutePath($input) || false !== strpos($input, '*')) {
return parent::parseInput($input, $options);
}

// now we have a relatve path eg js/file.js
// let's match it with the given rootFolders
$root = '';
$path = $input;
foreach ($this->rootFolders as $root) {
if (file_exists($root . DIRECTORY_SEPARATOR . $input)) {
$path = $input;
$input = $root . $path;
break;
}
}

// TODO: what to do, if the asset was not found..?

return $this->createFileAsset($input, $root, $path, $options['vars']);
}

/**
* copied from AssetFactory, as it was private
*
* @param string $path
* @return bool
*/
private static function isAbsolutePath($path)
{
return '/' == $path[0] || '\\' == $path[0] || (3 < strlen($path) && ctype_alpha($path[0]) && $path[1] == ':' && ('\\' == $path[2] || '/' == $path[2]));
}
}

Теперь я могу создать новую фабрику с разными исходными папками.

$factory = new MyAssetFactory(array('/folder/alpha/', '/folder/beta/'));
// $factory->set some stuff
$twig->addExtension(new AsseticExtension($factory));
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]