HosipLan

assets

Jul 23rd, 2011
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.84 KB | None | 0 0
  1. <?php
  2.  
  3. namespace WOW\Service;
  4.  
  5. use Nette\Application\UI\Presenter;
  6. use Nette\DI\Container;
  7. use Nette\Utils\Finder;
  8. use Nette\Caching\Cache;
  9. use Nette\Reflection\ClassType;
  10.  
  11.  
  12.  
  13. class ComponentRegister extends Nette\Object
  14. {  
  15.     /** @var Cache */
  16.     private $cache;
  17.  
  18.     /** @var callable */
  19.     private $expander;
  20.  
  21.     /** @var array */
  22.     private $types = array(
  23.             'jpg' => '%wwwDir%/images',
  24.             'png' => '%wwwDir%/images',
  25.             'gif' => '%wwwDir%/images',
  26.             'css' => '%wwwDir%/css',
  27.             'js' => '%wwwDir%/js',
  28.         );
  29.  
  30.  
  31.  
  32.     /**
  33.      * @param Container $container
  34.      */
  35.     public function __construct(Container $container, Nette\Caching\IStorage $cacheStorage)
  36.     {
  37.         $this->expander = callback($continer, 'expand');
  38.         $this->cache = new Cache($cacheStorage, 'WOW.ComponentInstaller');
  39.     }
  40.  
  41.  
  42.  
  43.     /**
  44.      * @param Presenter $presenter
  45.      */
  46.     public function installPresenterComponents(Presenter $presenter)
  47.     {
  48.         if ($this->isInstalled($presenter)) {
  49.             return;
  50.         }
  51.  
  52.         $files = array();
  53.         foreach ($this->getPresenterComponents($presenter) as $component) {
  54.             $files = array_merge($files, $this->prepareAssets($component));
  55.         }
  56.  
  57.         $this->setInstalled($presenter, $files);
  58.     }
  59.  
  60.  
  61.  
  62.     /**
  63.      * @param Presenter $presenters
  64.      * @return array of files
  65.      */
  66.     public function getPresenterAssets(Presenter $presenter)
  67.     {
  68.         if (!$this->isInstalled($presenter)) {
  69.             throw new Nette\InvalidArgumentException("Presenter " . get_class($presenter) . " is not installed");
  70.         }
  71.        
  72.         return $this->cache->load($presenter->getAction(TRUE));
  73.     }
  74.  
  75.  
  76.  
  77.     /**
  78.      * @param Presenter $presenters
  79.      * @return boolean
  80.      */
  81.     public function isInstalled(Presenter $presenter)
  82.     {
  83.         return $this->cache->load($presenter->getAction(TRUE)) !== NULL;
  84.     }
  85.  
  86.  
  87.  
  88.     /**
  89.      * @param Presenter $presenters
  90.      * @param array $files
  91.      */
  92.     private function setInstalled(Presenter $presenter, array $files)
  93.     {
  94.         $this->cache->save(
  95.                 $presenter->getAction(TRUE), // vrací "nette" cestu k presenteru
  96.                 $files, // list of files to include, Control will resolve...
  97.                 array(
  98.                         Cache::FILES => $files + array('presenter' => $presenter->getReflection()->getFileName())
  99.                     )
  100.             );
  101.     }
  102.  
  103.  
  104.  
  105.     /**
  106.      * @param object $component
  107.      * @return array of sources
  108.      */
  109.     private function prepareAssets($component)
  110.     {
  111.         $files = array();
  112.         foreach ($this->types as $type => $publicPath) {
  113.             foreach (Finder::findFiles('*.' . $type)->from($component->path) as $file) {
  114.                 $files[] = $source = $file->getRealPath();
  115.                 @copy($source, $this->expander->invoke($publicPath . '/' . basename($source)));
  116.             }
  117.         }
  118.        
  119.         return $files;
  120.     }
  121.  
  122.  
  123.  
  124.     /**
  125.      * @param Presenter $presenter
  126.      * @return array components
  127.      */
  128.     private function getPresenterComponents(Presenter $presenter)
  129.     {
  130.         $components = array();
  131.         foreach (ClassType::from($presenter)->getMethods() as $method) {
  132.             if (substr($method->name, 0, 15) !== 'createComponent') {
  133.                 continue;
  134.             }
  135.  
  136.             if ($method->hasAnnotation('component')) {
  137.                 if (!$method->getAnnotation('return')) {
  138.                     throw new Nette\UnexpectedValueException("Set annotation @return for " . $method->getName() . " in " . get_class($presenter));
  139.                 }
  140.  
  141.                 $name = lcFirst(substr($method->getName(), 15));
  142.                 $components[] = (object)array(
  143.                         'name' => $name,
  144.                         'factory' => $method,
  145.                         'class' => $reflection->getAnnotation('return'),
  146.                         'path' => ClassType::from($reflection->getAnnotation('return'))->getFileName();
  147.                     );
  148.             }
  149.         }
  150.  
  151.         return $components;
  152.     }
  153.  
  154. }
  155.  
  156.  
  157.  
  158. abstract class BasePresenter extends Nette\Application\UI\Presenter
  159. {
  160.  
  161.     protected function startup()
  162.     {
  163.         parent::startup();
  164.         $this->context->componentRegister->installPresenterComponents($this);
  165.     }
  166.  
  167.  
  168.  
  169.     /**
  170.      * @return AssetsControl
  171.      */
  172.     protected function createComponentAssets()
  173.     {
  174.         return new AssetsControl($this->context->componentRegister);
  175.     }
  176.  
  177. }
Advertisement
Add Comment
Please, Sign In to add comment