diff --git a/code/tasks/FTPageMakerTask.php b/code/tasks/FTPageMakerTask.php index e4749d3..bdd22cd 100644 --- a/code/tasks/FTPageMakerTask.php +++ b/code/tasks/FTPageMakerTask.php @@ -1,6 +1,8 @@ pageCountByDepth); $pageCount = $this->pageCountByDepth[$depth]; + $testPageClasses = ClassInfo::implementorsOf('TestPageInterface'); + $testPageClasses[] = 'Page'; for ($i=1; $i<=$pageCount; $i++) { $fullPrefix = $prefix ? "{$prefix}-{$i}" : $i; - $page = new Page(); + $randomIndex = array_rand($testPageClasses); + $pageClass = $testPageClasses[$randomIndex]; + $page = new $pageClass(); $page->ParentID = $parentID; $page->Title = "Test page {$fullPrefix}"; $page->write(); $page->publish('Stage', 'Live'); - echo "Created '$page->Title'\n"; + echo "Created '$page->Title' ($page->ClassName)\n"; $pageID = $page->ID; unset($page); diff --git a/code/tasks/FTPageTypeCreatorTask.php b/code/tasks/FTPageTypeCreatorTask.php new file mode 100644 index 0000000..0c70df7 --- /dev/null +++ b/code/tasks/FTPageTypeCreatorTask.php @@ -0,0 +1,111 @@ +fs = new Filesystem(); + $this->faker = Factory::create(); + $this->finder = new Finder(); + } + + /** + * @param HTTPRequest $request + */ + public function run($request) + { + $count = $request->getVar('count') ?: 20; + $module = ModuleLoader::getModule('silverstripe/frameworktest'); + $testPageDir = $module->getPath() . '/code/test-pages'; + if(!$this->fs->exists($testPageDir)) { + throw new RuntimeException("Test page directory $testPageDir does not exist!"); + } + + $pageTypes = $this->getExistingClassNames($testPageDir); + $created = 0; + while($created < $count) { + $className = null; + while( + !$className || + in_array($className, $pageTypes) || + class_exists(basename($className, 'php')) + ) { + $className = $this->generateClassName(); + } + $pageTypes[] = $className; + $code = $this->generateClassCode($className); + $filePath = sprintf('%s/%s.php', $testPageDir, $className); + try { + $this->fs->dumpFile($filePath, $code); + $created++; + } catch (IOException $e) { + echo "Could not write to file $filePath. Got error: {$e->getMessage()}\n"; + die(); + } + echo "Created page type $className\n"; + } + } + + private function getExistingClassNames($dir) + { + $files = $this->finder + ->in($dir) + ->files() + ->name('*Page.php'); + + return array_map(function ($file) { + /* @var SplFileInfo $file */ + return $file->getBasename(); + }, iterator_to_array($files)); + } + + private function generateClassName() + { + return ucfirst($this->faker->word . 'Page'); + } + + private function generateClassCode($className) + { + $self = __CLASS__; + $code = <<