/DependencyInjection/Configuration.php

https://github.com/ad2joe/RosettaBundle · PHP · 400 lines · 297 code · 29 blank · 74 comment · 9 complexity · 5544438e033e15430476feb716a3f83c MD5 · raw file

  1. <?php
  2. namespace BeSimple\RosettaBundle\DependencyInjection;
  3. use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
  4. use Symfony\Component\Config\Definition\Builder\TreeBuilder;
  5. use Symfony\Component\Config\Definition\ConfigurationInterface;
  6. /**
  7. * @author: Jean-François Simon <contact@jfsimon.fr>
  8. */
  9. class Configuration implements ConfigurationInterface
  10. {
  11. /**
  12. * @var \Closure
  13. */
  14. private $arrayWrapper;
  15. /**
  16. * @var array
  17. */
  18. private $defaultLoaders;
  19. /**
  20. * @var string
  21. */
  22. private $defaultDumper;
  23. /**
  24. * @var string
  25. */
  26. private $defaultTranslator;
  27. /**
  28. * @var array
  29. */
  30. private $availableImporterActions;
  31. /**
  32. * @var array
  33. */
  34. private $defaultParametersGuessers;
  35. /**
  36. * @var array
  37. */
  38. private $defaultManageValue;
  39. /**
  40. * @var string
  41. */
  42. private $defaultBackupDirectory;
  43. /**
  44. * @var string
  45. */
  46. private $defaultBackupDateFormat;
  47. /**
  48. * @var string
  49. */
  50. private $defaultModelHelper;
  51. /**
  52. * @var int
  53. */
  54. private $defaultBatchLimit;
  55. /**
  56. * @var int
  57. */
  58. private $defaultMinRating;
  59. /**
  60. * @var array
  61. */
  62. private $defaultTasks;
  63. /**
  64. * Constructor.
  65. */
  66. public function __construct()
  67. {
  68. $this->arrayWrapper = function($value) {
  69. return array($value);
  70. };
  71. $this->defaultLoaders = array('xliff', 'yml', 'php', 'csv');
  72. $this->defaultDumper = 'xliff';
  73. $this->defaultTranslator = 'google';
  74. $this->availableImporterActions = array('keep', 'backup', 'remove');
  75. $this->defaultParametersGuessers = array('{{*}}'); //, '%*%');
  76. $this->defaultManageValue = array('app', 'src');
  77. $this->defaultBackupDirectory = 'backups';
  78. $this->defaultBackupDateFormat = 'YmdHis';
  79. $this->defaultModelHelper = 'BeSimple\\RosettaBundle\\Entity\\Helper\\Helper';
  80. $this->defaultBatchLimit = 50;
  81. $this->defaultMinRating = 0;
  82. $this->defaultTasks = array('translate', 'select', 'dump');
  83. }
  84. /**
  85. * Creates configuration tree builder.
  86. *
  87. * @return TreeBuilder
  88. */
  89. public function getConfigTreeBuilder()
  90. {
  91. $treeBuilder = new TreeBuilder();
  92. $rootNode = $treeBuilder->root('be_simple_rosetta');
  93. $this->addTranslatorSection($rootNode);
  94. $this->addDumperSection($rootNode);
  95. $this->addImporterSection($rootNode);
  96. $this->addManageSection($rootNode);
  97. $this->addBackupSection($rootNode);
  98. $this->addModelSection($rootNode);
  99. $this->addWorkflowSection($rootNode);
  100. $this->addLocalesSection($rootNode);
  101. return $treeBuilder;
  102. }
  103. /**
  104. * @param ArrayNodeDefinition $rootNode
  105. */
  106. private function addTranslatorSection(ArrayNodeDefinition $rootNode)
  107. {
  108. $rootNode
  109. ->children()
  110. ->arrayNode('translator')
  111. ->useAttributeAsKey('key')
  112. ->prototype('array')
  113. ->useAttributeAsKey('key')
  114. ->beforeNormalization()
  115. ->ifNull()->thenEmptyArray()
  116. ->ifTrue()->thenEmptyArray()
  117. ->ifString()->then(function ($value) {
  118. return array('api_key' => $value);
  119. })
  120. ->end()
  121. ->prototype('scalar')->end()
  122. ->end()
  123. ->end()
  124. ->end()
  125. ;
  126. }
  127. /**
  128. * @param ArrayNodeDefinition $rootNode
  129. */
  130. private function addDumperSection(ArrayNodeDefinition $rootNode)
  131. {
  132. $rootNode
  133. ->children()
  134. ->arrayNode('dumper')
  135. ->addDefaultsIfNotSet()
  136. ->beforeNormalization()
  137. ->ifNull()->thenEmptyArray()
  138. ->ifTrue()->thenEmptyArray()
  139. ->ifString()->then(function ($value) {
  140. return 'disabled' === $value
  141. ? array('enabled' => false)
  142. : array('format' => $value);
  143. })
  144. ->end()
  145. ->children()
  146. ->scalarNode('format')->defaultValue($this->defaultDumper)->end()
  147. ->booleanNode('backup')->defaultFalse()->end()
  148. ->booleanNode('no_merge')->defaultFalse()->end()
  149. ->booleanNode('enabled')->defaultTrue()->end()
  150. ->end()
  151. ->end()
  152. ->end()
  153. ;
  154. }
  155. /**
  156. * @param ArrayNodeDefinition $rootNode
  157. */
  158. private function addImporterSection(ArrayNodeDefinition $rootNode)
  159. {
  160. $rootNode
  161. ->children()
  162. ->arrayNode('importer')
  163. ->addDefaultsIfNotSet()
  164. ->beforeNormalization()
  165. ->ifNull()->thenEmptyArray()
  166. ->ifTrue()->thenEmptyArray()
  167. ->ifString()->then(function($value) {
  168. return 'disabled' === $value
  169. ? array('enabled' => false)
  170. : array('then' => $value);
  171. })
  172. ->end()
  173. ->children()
  174. ->arrayNode('formats')
  175. ->defaultValue($this->defaultLoaders)
  176. ->beforeNormalization()
  177. ->ifString()->then($this->arrayWrapper)
  178. ->end()
  179. ->prototype('scalar')->end()
  180. ->end()
  181. ->arrayNode('parameters')
  182. ->defaultValue($this->defaultParametersGuessers)
  183. ->beforeNormalization()
  184. ->ifString()->then($this->arrayWrapper)
  185. ->end()
  186. ->prototype('scalar')->end()
  187. ->end()
  188. ->arrayNode('tasks')
  189. ->defaultNull()
  190. ->prototype('scalar')->end()
  191. ->end()
  192. ->scalarNode('then')
  193. ->validate()
  194. ->ifNotInArray($this->availableImporterActions)
  195. ->thenInvalid('Importer.then valid options are "'.implode('", "', $this->availableImporterActions).'"; "%s" found instead.')
  196. ->end()
  197. ->defaultValue('backup')
  198. ->end()
  199. ->booleanNode('enabled')->defaultTrue()->end()
  200. ->end()
  201. ->end()
  202. ->end()
  203. ;
  204. }
  205. /**
  206. * @param ArrayNodeDefinition $rootNode
  207. */
  208. protected function addManageSection(ArrayNodeDefinition $rootNode)
  209. {
  210. $that = $this;
  211. $setDefaults = function() use ($that) {
  212. return $that->defaultManageValue;
  213. };
  214. $rootNode
  215. ->children()
  216. ->arrayNode('manage')
  217. ->addDefaultsIfNotSet()
  218. ->beforeNormalization()
  219. ->ifArray()->then(function ($values) {
  220. $manage = array('app_dir' => false, 'src_dir' => false);
  221. foreach ($values as $value) {
  222. if ('app' === $value) {
  223. $manage['app_dir'] = true;
  224. } else if ('src' === $value) {
  225. $manage['src_dir'] = true;
  226. } else {
  227. if (!isset($manage['bundles'])) {
  228. $manage['bundles'] = array();
  229. }
  230. $manage['bundles'][] = $value;
  231. }
  232. }
  233. return $manage;
  234. })
  235. ->end()
  236. ->beforeNormalization()
  237. ->ifNull()->then($setDefaults)
  238. ->ifTrue()->then($setDefaults)
  239. ->ifString()->then(function($value) {
  240. if ('app' === $value) {
  241. return array('app_dir' => true, 'src_dir' => false);
  242. } else if ('src' === $value) {
  243. return array('app_dir' => false, 'src_dir' => true);
  244. } else {
  245. return array('app_dir' => false, 'src_dir' => false, 'bundles' => $value);
  246. }
  247. })
  248. ->end()
  249. ->children()
  250. ->arrayNode('bundles')
  251. ->defaultValue(array())
  252. ->beforeNormalization()
  253. ->ifString()->then($this->arrayWrapper)
  254. ->end()
  255. ->prototype('scalar')->end()
  256. ->end()
  257. ->booleanNode('app_dir')->defaultTrue()->end()
  258. ->booleanNode('src_dir')->defaultTrue()->end()
  259. ->end()
  260. ->end()
  261. ->end()
  262. ;
  263. }
  264. /**
  265. * @param ArrayNodeDefinition $rootNode
  266. */
  267. private function addBackupSection(ArrayNodeDefinition $rootNode)
  268. {
  269. $rootNode
  270. ->children()
  271. ->arrayNode('backup')
  272. ->addDefaultsIfNotSet()
  273. ->beforeNormalization()
  274. ->ifNull()->thenEmptyArray()
  275. ->ifTrue()->thenEmptyArray()
  276. ->ifString()->then(function($value) {
  277. return 'disabled' === $value
  278. ? array('enabled' => false)
  279. : array('directory' => $value);
  280. })
  281. ->end()
  282. ->children()
  283. ->scalarNode('directory')->defaultValue($this->defaultBackupDirectory)->end()
  284. ->scalarNode('date_format')->defaultValue($this->defaultBackupDateFormat)->end()
  285. ->booleanNode('enabled')->defaultTrue()->end()
  286. ->end()
  287. ->end()
  288. ->end()
  289. ;
  290. }
  291. /**
  292. * @param ArrayNodeDefinition $rootNode
  293. */
  294. private function addModelSection(ArrayNodeDefinition $rootNode)
  295. {
  296. $rootNode
  297. ->children()
  298. ->arrayNode('model')
  299. ->addDefaultsIfNotSet()
  300. ->beforeNormalization()
  301. ->ifNull()->thenEmptyArray()
  302. ->ifTrue()->thenEmptyArray()
  303. ->ifString()->then(function($value) {
  304. return array('manager' => $value);
  305. })
  306. ->end()
  307. ->children()
  308. ->scalarNode('manager')->defaultNull()->end()
  309. ->booleanNode('helper')->defaultValue($this->defaultModelHelper)->end()
  310. ->end()
  311. ->end()
  312. ->end()
  313. ;
  314. }
  315. /**
  316. * @param ArrayNodeDefinition $rootNode
  317. */
  318. private function addWorkflowSection(ArrayNodeDefinition $rootNode)
  319. {
  320. $rootNode
  321. ->children()
  322. ->arrayNode('workflow')
  323. ->addDefaultsIfNotSet()
  324. ->beforeNormalization()
  325. ->ifNull()->thenEmptyArray()
  326. ->ifTrue()->thenEmptyArray()
  327. ->end()
  328. ->children()
  329. ->scalarNode('batch_limit')->defaultValue($this->defaultBatchLimit)->end()
  330. ->scalarNode('min_rating')->defaultValue($this->defaultMinRating)->end()
  331. ->arrayNode('tasks')
  332. ->defaultValue($this->defaultTasks)
  333. ->prototype('scalar')
  334. ->end()
  335. ->end()
  336. ->end()
  337. ->end()
  338. ;
  339. }
  340. /**
  341. * @param ArrayNodeDefinition $rootNode
  342. */
  343. protected function addLocalesSection(ArrayNodeDefinition $rootNode)
  344. {
  345. $rootNode
  346. ->children()
  347. ->arrayNode('locales')
  348. ->addDefaultsIfNotSet()
  349. ->beforeNormalization()
  350. ->ifArray()->then(function($values) {
  351. return range(0, count($values) - 1) === array_keys($values)
  352. ? array('translations' => $values)
  353. : $values;
  354. })
  355. ->ifNull()->thenEmptyArray()
  356. ->ifTrue()->thenEmptyArray()
  357. ->ifString()->then(function($value) {
  358. return array('translations' => array($value));
  359. })
  360. ->end()
  361. ->children()
  362. ->scalarNode('source')->defaultValue('%session.default_locale%')->end()
  363. ->arrayNode('translations')
  364. ->prototype('scalar')->end()
  365. ->end()
  366. ->end()
  367. ->end()
  368. ->end()
  369. ;
  370. }
  371. }