'plugin.php.tpl' * ]; * $generator = new FilesystemGenerator('$', $structure, '$/Author/Plugin/templates/plugin'); * * $variables = [ * 'namespace' => 'Author/Plugin' * ]; * $generator->setVariables($variables); * $generator->generate(); * * @package rainlab\builder * @author Alexey Bobkov, Samuel Georges */ class FilesystemGenerator { protected $destinationPath; protected $structure; protected $variables = []; protected $templatesPath; /** * Initializes the object. * @param string $destinationPath Destination path to create the filesystem objects in. * The path can contain filesystem symbols. * @param array $structure Specifies the structure as array. * @param string $templatesPath Path to the directory that contains file templates. * The parameter is required only in case any files should be created. The path can * contain filesystem symbols. */ public function __construct($destinationPath, array $structure, $templatesPath = null) { $this->destinationPath = File::symbolizePath($destinationPath); $this->structure = $structure; if ($templatesPath) { $this->templatesPath = File::symbolizePath($templatesPath); } } public function setVariables($variables) { foreach ($variables as $key=>$value) { $this->setVariable($key, $value); } } public function setVariable($key, $value) { $this->variables[$key] = $value; } public function generate() { if (!File::isDirectory($this->destinationPath)) { throw new SystemException(Lang::get('rainlab.builder::lang.common.destination_dir_not_exists', ['path'=>$this->destinationPath])); } foreach ($this->structure as $key=>$value) { if (is_numeric($key)) { $this->makeDirectory($value); } else { $this->makeFile($key, $value); } } } public function getTemplateContents($templateName) { $templatePath = $this->templatesPath.DIRECTORY_SEPARATOR.$templateName; if (!File::isFile($templatePath)) { throw new SystemException(Lang::get('rainlab.builder::lang.common.template_not_found', ['name'=>$templateName])); } $fileContents = File::get($templatePath); return TextParser::parse($fileContents, $this->variables); } protected function makeDirectory($dirPath) { $path = $this->destinationPath.DIRECTORY_SEPARATOR.$dirPath; if (File::isDirectory($path)) { throw new ApplicationException(Lang::get('rainlab.builder::lang.common.error_dir_exists', ['path'=>$path])); } if (!File::makeDirectory($path, 0777, true, true)) { throw new SystemException(Lang::get('rainlab.builder::lang.common.error_make_dir', ['name'=>$path])); } } protected function makeFile($filePath, $templateName) { $path = $this->destinationPath.DIRECTORY_SEPARATOR.$filePath; if (File::isFile($path)) { throw new ApplicationException(Lang::get('rainlab.builder::lang.common.error_file_exists', ['path'=>$path])); } $fileDirectory = dirname($path); if (!File::isDirectory($fileDirectory)) { if (!File::makeDirectory($fileDirectory, 0777, true, true)) { throw new SystemException(Lang::get('rainlab.builder::lang.common.error_make_dir', ['name'=>$fileDirectory])); } } $fileContents = $this->getTemplateContents($templateName); if (@File::put($path, $fileContents) === false) { throw new SystemException(Lang::get('rainlab.builder::lang.common.error_generating_file', ['path'=>$path])); } @File::chmod($path); } }