| 
<?php
 use gdgrid\gd\bundle\connectors\AssetConnector;
 use gdgrid\gd\Grid;
 
 /* @var \gdgrid\gd\plugin\GridPlugin $this */
 
 $this->setConfig('assets', [
 'sourceDir' => [],
 'outputDir' => 'gd-assets',
 'prepend'   => [],
 'append'    => [],
 ]);
 
 $this->fetchComponent('assets', function(AssetConnector $plugin, Grid $grid)
 {
 /* @var \gdgrid\gd\plugin\GridPlugin $this */
 
 $plugin->setSourceDir(array_merge([dirname(dirname(__FILE__))], $plugin->getSourceDir()));
 
 $plugin->find(function($subDir)
 {
 return preg_replace('/^([^\/]+)(\/assets)?(.*?)/i', '$1$3', $subDir);
 });
 
 $prepend = $append = [];
 
 foreach (array_keys($this->getComponents()) as $component)
 {
 $dirName = dirname($this->getComponentInitPath($component));
 
 $dir = dirname($dirName);
 
 $activePlugin = str_replace($dir . '/', '', $dirName);
 
 if ($activePluginDir = is_dir($plugin->getOutputDir() . '/' . $activePlugin)
 
 ? $plugin->getOutputDir() . '/' . $activePlugin : null)
 
 $plugin->output($activePluginDir, function($file) use ($plugin, & $prepend, & $append)
 {
 $ext = pathinfo($file, PATHINFO_EXTENSION);
 
 if ($ext === 'css')
 
 $prepend[] = $plugin->webPath($file);
 
 elseif ($ext === 'js')
 
 $append[] = $plugin->webPath($file);
 });
 }
 
 $prepend = array_merge($prepend, (array)$this->getConfig('assets', 'prepend'));
 
 $append = array_merge($append, (array)$this->getConfig('assets', 'append'));
 
 $prependHtml = $appendHtml = '';
 
 if ($sz = sizeof($prepend))
 {
 for ($i = 0; $i < $sz; ++$i)
 {
 $asset = ltrim($prepend[$i], '/');
 
 $prependHtml .= '<link rel="stylesheet" href="/' . $asset . '?v=' . $plugin->timestamp($asset) . '">';
 }
 }
 
 if ($sz = sizeof($append))
 {
 for ($i = 0; $i < $sz; ++$i)
 {
 $asset = ltrim($append[$i], '/');
 
 $appendHtml .= '<script src="/' . $asset . '?v=' . $plugin->timestamp($asset) . '"></script>';
 }
 }
 
 $grid->bindLayout('{assets}', [$prependHtml, ''])->bindLayout('{/assets}', [$appendHtml, null, '']);
 });
 
 |