199 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Nextend\Framework\Asset;
 | |
| 
 | |
| use Nextend\Framework\Misc\Base64;
 | |
| 
 | |
| class AbstractAsset {
 | |
| 
 | |
|     /**
 | |
|      * @var AbstractCache
 | |
|      */
 | |
|     protected $cache;
 | |
| 
 | |
|     protected $files = array();
 | |
|     protected $urls = array();
 | |
|     protected $codes = array();
 | |
|     protected $globalInline = array();
 | |
|     protected $firstCodes = array();
 | |
|     protected $inline = array();
 | |
|     protected $staticGroupPreload = array();
 | |
|     protected $staticGroup = array();
 | |
| 
 | |
|     protected $groups = array();
 | |
| 
 | |
|     public function addFile($pathToFile, $group) {
 | |
|         $this->addGroup($group);
 | |
|         $this->files[$group][] = $pathToFile;
 | |
|     }
 | |
| 
 | |
|     public function addFiles($path, $files, $group) {
 | |
|         $this->addGroup($group);
 | |
|         foreach ($files as $file) {
 | |
|             $this->files[$group][] = $path . DIRECTORY_SEPARATOR . $file;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function addStaticGroupPreload($file, $group) {
 | |
|         $this->staticGroupPreload[$group] = $file;
 | |
|     }
 | |
| 
 | |
|     public function addStaticGroup($file, $group) {
 | |
|         $this->staticGroup[$group] = $file;
 | |
|     }
 | |
| 
 | |
|     private function addGroup($group) {
 | |
|         if (!isset($this->files[$group])) {
 | |
|             $this->files[$group] = array();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function addCode($code, $group, $unshift = false) {
 | |
|         if (!isset($this->codes[$group])) {
 | |
|             $this->codes[$group] = array();
 | |
|         }
 | |
|         if (!$unshift) {
 | |
|             $this->codes[$group][] = $code;
 | |
|         } else {
 | |
|             array_unshift($this->codes[$group], $code);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function addUrl($url) {
 | |
|         $this->urls[] = $url;
 | |
|     }
 | |
| 
 | |
|     public function addFirstCode($code, $unshift = false) {
 | |
|         if ($unshift) {
 | |
|             array_unshift($this->firstCodes, $code);
 | |
|         } else {
 | |
|             $this->firstCodes[] = $code;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function addInline($code, $name = null, $unshift = false) {
 | |
|         if ($unshift) {
 | |
|             array_unshift($this->inline, $code);
 | |
| 
 | |
|         } else {
 | |
|             if ($name) {
 | |
|                 $this->inline[$name] = $code;
 | |
|             } else {
 | |
|                 $this->inline[] = $code;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function addGlobalInline($code, $unshift = false) {
 | |
|         if ($unshift) {
 | |
|             array_unshift($this->globalInline, $code);
 | |
|         } else {
 | |
|             $this->globalInline[] = $code;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function loadedFilesEncoded() {
 | |
|         return Base64::encode(json_encode(call_user_func_array('array_merge', $this->files) + $this->urls));
 | |
|     }
 | |
| 
 | |
|     protected function uniqueFiles() {
 | |
|         foreach ($this->files as $group => &$files) {
 | |
|             $this->files[$group] = array_values(array_unique($files));
 | |
|         }
 | |
|         $this->initGroups();
 | |
|     }
 | |
| 
 | |
|     public function removeFiles($notNeededFiles) {
 | |
|         foreach ($this->files as $group => &$files) {
 | |
|             $this->files[$group] = array_diff($files, $notNeededFiles);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function initGroups() {
 | |
|         $this->groups = array_unique(array_merge(array_keys($this->files), array_keys($this->codes)));
 | |
| 
 | |
|         $skeleton = array_map(array(
 | |
|             AbstractAsset::class,
 | |
|             'emptyArray'
 | |
|         ), array_flip($this->groups));
 | |
| 
 | |
|         $this->files += $skeleton;
 | |
|         $this->codes += $skeleton;
 | |
|     }
 | |
| 
 | |
|     private static function emptyArray() {
 | |
|         return array();
 | |
|     }
 | |
| 
 | |
|     public function getFiles() {
 | |
|         $this->uniqueFiles();
 | |
| 
 | |
|         $files = array();
 | |
| 
 | |
|         if (AssetManager::$cacheAll) {
 | |
|             foreach ($this->groups as $group) {
 | |
|                 if (isset($this->staticGroup[$group])) continue;
 | |
|                 $files[$group] = $this->cache->getAssetFile($group, $this->files[$group], $this->codes[$group]);
 | |
|             }
 | |
|         } else {
 | |
|             foreach ($this->groups as $group) {
 | |
|                 if (isset($this->staticGroup[$group])) continue;
 | |
|                 if (in_array($group, AssetManager::$cachedGroups)) {
 | |
|                     $files[$group] = $this->cache->getAssetFile($group, $this->files[$group], $this->codes[$group]);
 | |
|                 } else {
 | |
|                     foreach ($this->files[$group] as $file) {
 | |
|                         $files[] = $file;
 | |
|                     }
 | |
|                     foreach ($this->codes[$group] as $code) {
 | |
|                         array_unshift($this->inline, $code);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         if (isset($files['n2'])) {
 | |
|             return array('n2' => $files['n2']) + $this->staticGroup + $files;
 | |
|         }
 | |
| 
 | |
|         return array_merge($files, $this->staticGroup);
 | |
|     }
 | |
| 
 | |
|     public function serialize() {
 | |
|         return array(
 | |
|             'staticGroupPreload' => $this->staticGroupPreload,
 | |
|             'staticGroup'        => $this->staticGroup,
 | |
|             'files'              => $this->files,
 | |
|             'urls'               => $this->urls,
 | |
|             'codes'              => $this->codes,
 | |
|             'firstCodes'         => $this->firstCodes,
 | |
|             'inline'             => $this->inline,
 | |
|             'globalInline'       => $this->globalInline
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function unSerialize($array) {
 | |
|         $this->staticGroupPreload = array_merge($this->staticGroupPreload, $array['staticGroupPreload']);
 | |
|         $this->staticGroup        = array_merge($this->staticGroup, $array['staticGroup']);
 | |
| 
 | |
|         foreach ($array['files'] as $group => $files) {
 | |
|             if (!isset($this->files[$group])) {
 | |
|                 $this->files[$group] = $files;
 | |
|             } else {
 | |
|                 $this->files[$group] = array_merge($this->files[$group], $files);
 | |
|             }
 | |
|         }
 | |
|         $this->urls = array_merge($this->urls, $array['urls']);
 | |
| 
 | |
|         foreach ($array['codes'] as $group => $codes) {
 | |
|             if (!isset($this->codes[$group])) {
 | |
|                 $this->codes[$group] = $codes;
 | |
|             } else {
 | |
|                 $this->codes[$group] = array_merge($this->codes[$group], $codes);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         $this->firstCodes   = array_merge($this->firstCodes, $array['firstCodes']);
 | |
|         $this->inline       = array_merge($this->inline, $array['inline']);
 | |
|         $this->globalInline = array_merge($this->globalInline, $array['globalInline']);
 | |
|     }
 | |
| } |