HosipLan

asserts control

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