/** * @see sfTask */ protected function execute($arguments = array(), $options = array()) { $this->logSection('doctrine', 'generating model classes'); $config = $this->getCliConfig(); $this->_checkForPackageParameter($config['yaml_schema_path']); $tmpPath = sfConfig::get('sf_cache_dir') . DIRECTORY_SEPARATOR . 'tmp'; if (!file_exists($tmpPath)) { Doctrine_Lib::makeDirectories($tmpPath); } $plugins = $this->configuration->getPlugins(); foreach ($this->configuration->getAllPluginPaths() as $plugin => $path) { if (!in_array($plugin, $plugins)) { continue; } $schemas = sfFinder::type('file')->name('*.yml')->in($path . '/config/doctrine'); foreach ($schemas as $schema) { $tmpSchemaPath = $tmpPath . DIRECTORY_SEPARATOR . $plugin . '-' . basename($schema); $models = Doctrine_Parser::load($schema, 'yml'); if (!isset($models['package'])) { $models['package'] = $plugin . '.lib.model.doctrine'; $models['package_custom_path'] = $path . '/lib/model/doctrine'; } Doctrine_Parser::dump($models, 'yml', $tmpSchemaPath); } } $options = array('generateBaseClasses' => true, 'generateTableClasses' => true, 'packagesPath' => sfConfig::get('sf_plugins_dir'), 'packagesPrefix' => 'Plugin', 'suffix' => '.class.php', 'baseClassesDirectory' => 'base', 'baseClassName' => 'sfDoctrineRecord'); $options = array_merge($options, sfConfig::get('doctrine_model_builder_options', array())); $import = new Doctrine_Import_Schema(); $import->setOptions($options); $import->importSchema(array($tmpPath, $config['yaml_schema_path']), 'yml', $config['models_path']); }
/** * @see sfTask */ protected function execute($arguments = array(), $options = array()) { $this->logSection('doctrine', 'generating model classes'); $config = $this->getCliConfig(); $builderOptions = $this->configuration->getPluginConfiguration('sfDoctrinePlugin')->getModelBuilderOptions(); $stubFinder = sfFinder::type('file')->prune('base')->name('*' . $builderOptions['suffix']); $before = $stubFinder->in($config['models_path']); $schema = $this->prepareSchemaFile($config['yaml_schema_path']); $import = new Doctrine_Import_Schema(); $import->setOptions($builderOptions); $import->importSchema($schema, 'yml', $config['models_path']); // markup base classes with magic methods foreach (sfYaml::load($schema) as $model => $definition) { // Start OrangeHRM Modified Section $subPackageName = $this->getSubPackageName($definition); // End OrangeHRM Modified Section $file = sprintf('%s%s/%s/Base%s%s', $config['models_path'], isset($definition['package']) ? '/' . substr($definition['package'], 0, strpos($definition['package'], '.')) : '', $builderOptions['baseClassesDirectory'], $model, $builderOptions['suffix']); $code = file_get_contents($file); // introspect the model without loading the class if (preg_match_all('/@property (\\w+) \\$(\\w+)/', $code, $matches, PREG_SET_ORDER)) { $properties = array(); foreach ($matches as $match) { $properties[$match[2]] = $match[1]; } $typePad = max(array_map('strlen', array_merge(array_values($properties), array($model)))); $namePad = max(array_map('strlen', array_keys(array_map(array('sfInflector', 'camelize'), $properties)))); $setters = array(); $getters = array(); foreach ($properties as $name => $type) { $camelized = sfInflector::camelize($name); $collection = 'Doctrine_Collection' == $type; $getters[] = sprintf('@method %-' . $typePad . 's %s%-' . ($namePad + 2) . 's Returns the current record\'s "%s" %s', $type, 'get', $camelized . '()', $name, $collection ? 'collection' : 'value'); $setters[] = sprintf('@method %-' . $typePad . 's %s%-' . ($namePad + 2) . 's Sets the current record\'s "%s" %s', $model, 'set', $camelized . '()', $name, $collection ? 'collection' : 'value'); } // use the last match as a search string $code = str_replace($match[0], $match[0] . PHP_EOL . ' * ' . PHP_EOL . ' * ' . implode(PHP_EOL . ' * ', array_merge($getters, $setters)), $code); // Start OrangeHRM Modified Section $tokens = array('##SUBPACKAGE##' => $subPackageName); $code = str_replace(array_keys($tokens), array_values($tokens), $code); // End OrangeHRM Modified Section file_put_contents($file, $code); } } $properties = parse_ini_file(sfConfig::get('sf_config_dir') . '/properties.ini', true); $tokens = array('##PACKAGE##' => isset($properties['symfony']['name']) ? $properties['symfony']['name'] : 'symfony', '##SUBPACKAGE##' => 'model', '##NAME##' => isset($properties['symfony']['author']) ? $properties['symfony']['author'] : 'Your name here', ' <##EMAIL##>' => '', "{\n\n}" => "{\n}\n"); // cleanup new stub classes $after = $stubFinder->in($config['models_path']); $this->getFilesystem()->replaceTokens(array_diff($after, $before), '', '', $tokens); // cleanup base classes $baseFinder = sfFinder::type('file')->name('Base*' . $builderOptions['suffix']); $baseDirFinder = sfFinder::type('dir')->name('base'); $this->getFilesystem()->replaceTokens($baseFinder->in($baseDirFinder->in($config['models_path'])), '', '', $tokens); $this->reloadAutoload(); }
/** * Execute task * * @param array $arguments Task arguments [optional] * @param array $options Task options [optional] * @return void */ protected function execute($arguments = array(), $options = array()) { $this->logSection('doctrine', 'generating model classes'); $config = $this->getCliConfig(); $builderOptions = $this->configuration->getPluginConfiguration('sfDoctrinePlugin')->getModelBuilderOptions(); $finder = sfFinder::type('file')->prune('base')->name('*' . $builderOptions['suffix']); $before = $finder->in($config['models_path']); $schema = $this->prepareSchemaFile($config['yaml_schema_path']); $import = new Doctrine_Import_Schema(); $import->setOptions($builderOptions); $import->importSchema($schema, 'yml', $config['models_path']); $base = $builderOptions['baseClassesDirectory']; $suff = $builderOptions['suffix']; $src = array('##PACKAGE##', '##SUBPACKAGE##', '##NAME##', ' <##EMAIL##>'); // markup base classes with magic methods foreach (sfYaml::load($schema) as $model => $definition) { $package = isset($definition['package']) ? substr($definition['package'], 0, strpos($definition['package'], '.')) : ''; $basePath = $config['models_path'] . ($package ? '/' . $package : '') . '/'; $file = $basePath . $base . '/Base' . $model . $suff; $code = file_get_contents($file); // introspect the model without loading the class if (preg_match_all('/@property (\\w+) \\$(\\w+)/', $code, $matches, PREG_SET_ORDER)) { $properties = array(); foreach ($matches as $match) { $properties[$match[2]] = $match[1]; } $typePad = max(array_map('strlen', array_merge(array_values($properties), array($model)))); $namePad = max(array_map('strlen', array_keys(array_map(array('sfInflector', 'camelize'), $properties)))); $setters = array(); $getters = array(); foreach ($properties as $name => $type) { $camelized = sfInflector::camelize($name); $collection = 'Doctrine_Collection' == $type; $getters[] = sprintf('@method %-' . $typePad . 's %s%-' . ($namePad + 2) . 's Returns the current record\'s "%s" %s', $type, 'get', $camelized . '()', $name, $collection ? 'collection' : 'value'); $setters[] = sprintf('@method %-' . $typePad . 's %s%-' . ($namePad + 2) . 's Sets the current record\'s "%s" %s', $model, 'set', $camelized . '()', $name, $collection ? 'collection' : 'value'); } $dst = array(dinGeneratorSigner::getProjectName(), 'lib.model.doctrine' . ($package ? '.' . $package : '') . '.base', dinGeneratorSigner::getAuthor(), ''); $code = str_replace($match[0], $match[0] . PHP_EOL . ' * ' . PHP_EOL . ' * ' . implode(PHP_EOL . ' * ', array_merge($getters, $setters)), $code); $code = str_replace($src, $dst, $code); file_put_contents($file, $code); } $this->replaceLibClasses($basePath, $model, $package, $suff); if ($package) { $basePath = $this->configuration->getPluginConfiguration($package)->getRootDir() . '/lib/model/doctrine/'; $this->replaceLibClasses($basePath, $model, $package, $suff, true); } } $this->reloadAutoload(); }
public function testClassExistsAfterImport() { Doctrine_Core::setModelsDirectory(dirname(__FILE__) . '/DC95/models'); $import = new Doctrine_Import_Schema(); $import->setOptions(array('pearStyle' => true, 'baseClassesDirectory' => null, 'baseClassPrefix' => 'Base_', 'classPrefix' => 'DC95_', 'classPrefixFiles' => true)); $modelsPath = dirname(__FILE__) . '/DC95/models'; $import->importSchema(dirname(__FILE__) . '/DC95/schema.yml', 'yml', $modelsPath); /* $this->assertTrue(file_exists($modelsPath . '/DC95/Base/Article.php')); $this->assertTrue(file_exists($modelsPath . '/DC95/Base/Article/Category.php')); $this->assertTrue(file_exists($modelsPath . '/DC95/Article.php')); $this->assertTrue(file_exists($modelsPath . '/DC95/Article/Category.php')); */ Doctrine_Core::setModelsDirectory(null); Doctrine_Lib::removeDirectories(dirname(__FILE__) . '/DC95/models'); }
/** * Generate a yaml schema file from an existing directory of models * * @param string $yamlPath Path to your yaml schema files * @param string $directory Directory to generate your models in * @param array $options Array of options to pass to the schema importer * @return void */ public static function generateModelsFromYaml($yamlPath, $directory, $options = array()) { $import = new Doctrine_Import_Schema(); $import->setOptions($options); return $import->importSchema($yamlPath, 'yml', $directory); }
/** * @see sfTask */ protected function execute($arguments = array(), $options = array()) { $this->logSection('doctrine', 'generating model classes'); $config = $this->getCliConfig(); $builderOptions = $this->configuration->getPluginConfiguration('sfDoctrinePlugin')->getModelBuilderOptions(); $stubFinder = sfFinder::type('file')->prune('base')->name('*' . $builderOptions['suffix']); $before = $stubFinder->in($config['models_path']); $schema = $this->prepareSchemaFile($config['yaml_schema_path']); $import = new Doctrine_Import_Schema(); $import->setOptions($builderOptions); $import->importSchema($schema, 'yml', $config['models_path']); $listFiles = array(); $listDir = array(); $bI = array('package' => isset($properties['symfony']['name']) ? $properties['symfony']['name'] : 'symfony', 'subpackage' => 'model', 'author' => isset($properties['symfony']['author']) ? $properties['symfony']['author'] : 'Your name here'); $baseRecordFile = sprintf("%s/BaseDoctrineRecord.class.php", $config['models_path']); $baseRecordFileContent = <<<EOF <?php /** * Base doctrin record. * * @package {$bI['package']} * @subpackage {$bI['subpackage']} * @author {$bI['author']} */ ##class## BaseDoctrineRecord extends sfPostgresDoctrineRecord { } EOF; if (!file_exists($baseRecordFile)) { file_put_contents($baseRecordFile, str_replace('##class##', 'class', $baseRecordFileContent)); } // markup base classes with magic methods foreach (sfYaml::load($schema) as $model => $definition) { $file = sprintf('%s%s/%s/Base%s%s', $config['models_path'], isset($definition['package']) ? '/' . substr($definition['package'], 0, strpos($definition['package'], '.')) : '', $builderOptions['baseClassesDirectory'], $model, $builderOptions['suffix']); $code = file_get_contents($file); // introspect the model without loading the class if (preg_match_all('/@property (\\w+) \\$(\\w+)/', $code, $matches, PREG_SET_ORDER)) { $properties = array(); foreach ($matches as $match) { $properties[$match[2]] = $match[1]; } $typePad = max(array_map('strlen', array_merge(array_values($properties), array($model)))); $namePad = max(array_map('strlen', array_keys(array_map(array('sfInflector', 'camelize'), $properties)))); $setters = array(); $getters = array(); foreach ($properties as $name => $type) { $camelized = sfInflector::camelize($name); $collection = 'Doctrine_Collection' == $type; $getters[] = sprintf('@method %-' . $typePad . 's %s%-' . ($namePad + 2) . 's Returns the current record\'s "%s" %s', $type, 'get', $camelized . '()', $name, $collection ? 'collection' : 'value'); $setters[] = sprintf('@method %-' . $typePad . 's %s%-' . ($namePad + 2) . 's Sets the current record\'s "%s" %s', $model, 'set', $camelized . '()', $name, $collection ? 'collection' : 'value'); } // use the last match as a search string $code = str_replace($match[0], $match[0] . PHP_EOL . ' * ' . PHP_EOL . ' * ' . implode(PHP_EOL . ' * ', array_merge($getters, $setters)), $code); $newfile = sprintf('%s%s%s/%s/Base%s%s', $config['models_path'], isset($definition['package']) && false !== stripos($definition['package'], 'plugin') && 0 !== stripos($definition['package'], 'plugin') ? '/plugins' : '/project', isset($definition['package']) ? '/' . substr($definition['package'], 0, strpos($definition['package'], '.')) : '', $builderOptions['baseClassesDirectory'], $model, $builderOptions['suffix']); $newtablefile = sprintf('%s%s%s/%sTable%s', $config['models_path'], isset($definition['package']) && false !== stripos($definition['package'], 'plugin') && 0 !== stripos($definition['package'], 'plugin') ? '/plugins' : '/project', isset($definition['package']) ? '/' . substr($definition['package'], 0, strpos($definition['package'], '.')) : '', $model, $builderOptions['suffix']); $newdir = sprintf('%s%s%s/%s', $config['models_path'], isset($definition['package']) && false !== stripos($definition['package'], 'plugin') && 0 !== stripos($definition['package'], 'plugin') ? '/plugins' : '/project', isset($definition['package']) ? '/' . substr($definition['package'], 0, strpos($definition['package'], '.')) : '', $builderOptions['baseClassesDirectory']); if (!file_exists($newdir)) { mkdir($newdir, 0777, true); } $listDir[sprintf('%s%s/%s', $config['models_path'], isset($definition['package']) ? '/' . substr($definition['package'], 0, strpos($definition['package'], '.')) : '', $builderOptions['baseClassesDirectory'])] = true; $listDir[sprintf('%s%s', $config['models_path'], isset($definition['package']) ? '/' . substr($definition['package'], 0, strpos($definition['package'], '.')) : '')] = true; if (!file_exists(str_replace(sprintf('%s/Base', $builderOptions['baseClassesDirectory']), '', $newfile))) { $listFiles[sprintf('%s%s/%s%s', $config['models_path'], isset($definition['package']) ? '/' . substr($definition['package'], 0, strpos($definition['package'], '.')) : '', $model, $builderOptions['suffix'])] = str_replace(sprintf('%s/Base', $builderOptions['baseClassesDirectory']), '', $newfile); } else { unlink(sprintf('%s%s/%s%s', $config['models_path'], isset($definition['package']) ? '/' . substr($definition['package'], 0, strpos($definition['package'], '.')) : '', $model, $builderOptions['suffix'])); } if (!file_exists($newtablefile)) { $listFiles[sprintf('%s%s/%sTable%s', $config['models_path'], isset($definition['package']) ? '/' . substr($definition['package'], 0, strpos($definition['package'], '.')) : '', $model, $builderOptions['suffix'])] = $newtablefile; } else { unlink(sprintf('%s%s/%sTable%s', $config['models_path'], isset($definition['package']) ? '/' . substr($definition['package'], 0, strpos($definition['package'], '.')) : '', $model, $builderOptions['suffix'])); } $code = str_replace(" extends sfDoctrineRecord", " extends BaseDoctrineRecord", $code); file_put_contents($newfile, $code); unlink($file); } } $properties = parse_ini_file(sfConfig::get('sf_config_dir') . '/properties.ini', true); $tokens = array('##PACKAGE##' => isset($properties['symfony']['name']) ? $properties['symfony']['name'] : 'symfony', '##SUBPACKAGE##' => 'model', '##NAME##' => isset($properties['symfony']['author']) ? $properties['symfony']['author'] : 'Your name here', ' <##EMAIL##>' => '', "{\n\n}" => "{\n}\n"); // cleanup new stub classes $after = $stubFinder->in($config['models_path']); $this->getFilesystem()->replaceTokens(array_diff($after, $before), '', '', $tokens); // cleanup base classes $baseFinder = sfFinder::type('file')->name('Base*' . $builderOptions['suffix']); $baseDirFinder = sfFinder::type('dir')->name('base'); $this->getFilesystem()->replaceTokens($baseFinder->in($baseDirFinder->in($config['models_path'])), '', '', $tokens); // cleanup new table classes $tableFinder = sfFinder::type('file')->prune('base')->name('*Table' . $builderOptions['suffix']); foreach (array_diff($tableFinder->in($config['models_path']), $before) as $file) { $contents = file_get_contents($file); file_put_contents($file, sfToolkit::stripComments($contents)); } foreach ($listFiles as $old => $new) { rename($old, $new); } foreach ($listDir as $dir => $val) { if (file_exists($dir)) { if (($files = @scandir($dir)) && count($files) <= 2) { rmdir($dir); } } } $this->reloadAutoload(); }