FileGenerator.class.php (3287B)
1 <?php 2 3 4 namespace cms\generator; 5 6 7 use cms\generator\filter\AbstractFilter; 8 use cms\model\File; 9 use cms\model\Value; 10 use logger\Logger; 11 use util\exception\GeneratorException; 12 13 class FileGenerator extends BaseGenerator 14 { 15 16 17 public function __construct($fileContext ) 18 { 19 $this->context = $fileContext; 20 } 21 22 protected function generate() 23 { 24 $file = new File( $this->context->sourceObjectId ); 25 $file->load(); 26 return $this->filterValue( $file ); 27 } 28 29 public function getPublicFilename() 30 { 31 $file = new File( $this->context->sourceObjectId ); 32 $file->load(); 33 34 $filename = $file->filename(); 35 36 if ( $file->extension ) 37 $filename .= '.'.$file->extension; 38 39 return $file->path().'/'.$filename; 40 } 41 42 43 /** 44 * @param $file File 45 * @return string 46 */ 47 protected function filterValue( $file ) 48 { 49 $contentId = $file->contentid; 50 51 $totalSettings = $file->getTotalSettings(); 52 $proxyFileId = @$totalSettings['proxy-file-id']; 53 54 if ( $proxyFileId ) { 55 $proxyFile = new File( $proxyFileId ); // This is a proxy for another file. 56 $proxyFile->load(); 57 $contentId = $proxyFile->contentid; 58 } 59 60 $v = new Value(); 61 $v->contentid = $contentId; 62 63 if ( $this->context->scheme == Producer::SCHEME_PREVIEW ) 64 $v->load(); 65 else 66 $v->loadPublished(); 67 68 $value = $v->file; 69 70 foreach(\util\ArrayUtils::getSubArray($totalSettings, array( 'filter')) as $filterEntry ) 71 { 72 $filterName = ucfirst(@$filterEntry['name']); 73 $extension = @$filterEntry['extension']; 74 75 if ( $extension && strtolower($extension) != strtolower($file->getRealExtension()) ) 76 continue; // File extension does not match 77 78 $filterType = $this->context->scheme==Producer::SCHEME_PUBLIC?'public':'preview'; 79 80 $onPublish = (array) @$filterEntry['on']; 81 if ( ! $onPublish || in_array('all',$onPublish ) ) 82 $onPublish = ['edit','public','preview','show']; 83 84 if ( $onPublish && ! in_array($filterType,$onPublish)) 85 continue; // Publish type does not match 86 87 $parameter = (array) @$filterEntry['parameter']; 88 89 $filterClassNameWithNS = 'cms\\generator\\filter\\' . $filterName.'Filter'; 90 91 if ( !class_exists( $filterClassNameWithNS ) ) 92 throw new \LogicException("Filter '$filterName' does not exist."); 93 94 /** @var AbstractFilter $filter */ 95 $filter = new $filterClassNameWithNS(); 96 $filter->context = $this->context; 97 98 // Copy filter configuration to filter instance. 99 foreach( $parameter as $parameterName=>$parameterValue) { 100 if ( property_exists($filter,$parameterName)) 101 $filter->$parameterName = $parameterValue; 102 } 103 104 105 // Execute the filter. 106 Logger::debug("Filtering '$file->filename' with filter '$filterName'."); 107 108 try { 109 110 $value = $filter->filter( $value ); 111 } catch( \Exception $e ) { 112 // Filter has some undefined error. 113 Logger::warn( $e->getTraceAsString() ); 114 throw new GeneratorException('Could not generate file '.$file->objectid.'. Filter '.$filterName.' has an error.', $e ); 115 } 116 } 117 118 return $value; 119 120 } 121 122 123 /** 124 * Calculates the MIME type of this file. 125 * 126 * @return string 127 */ 128 public function getMimeType() 129 { 130 $file = new File( $this->context->sourceObjectId ); 131 $file->load(); 132 $ext = strtolower( $file->getRealExtension() ); 133 134 $mimeType = File::getMimeType( $ext ); 135 136 return( $mimeType ); 137 } 138 }