From efbc66d94166de2e7a283589e072a8307e84a62d Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Tue, 3 Nov 2020 17:48:30 +1300 Subject: [PATCH] NEW Generate blocks --- README.md | 26 +++++++- _config/elemental.yml | 7 ++ code/TestPage.php | 2 +- code/tasks/FTPageMakerTask.php | 114 ++++++++++++++++++++++++++++++--- 4 files changed, 138 insertions(+), 11 deletions(-) create mode 100644 _config/elemental.yml diff --git a/README.md b/README.md index 7134e40..ffd9396 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,30 @@ If you want to test the CMS behaviour for a large and nested tree, the module includes a simple generator task: `dev/tasks/FTPageMakerTask`. It will create 3^5 pages by default, so takes a while to run through. +## Blocks + +When [dnadesign/silverstripe-elemental](https://github.com/dnadesign/silverstripe-elemental) +is installed, the `FTPageMakerTask` can also generate blocks within those pages automatically. +It has a few hardcoded sample data structures for common block types, +and randomly creates a number of blocks, as well as randomly choosing to publish them. +Relies on files and images being available to add as sample data. + +Additional setup: + +``` +composer require dnadesign/silverstripe-elemental +composer require silverstripe/elemental-bannerblock +composer require silverstripe/elemental-fileblock +``` + +Usage: + +``` +# Generate some sample files to associate with blocks +sake dev/tasks/FTFileMakerTask +sake dev/tasks/FTPageMakerTask withBlocks=true +``` + ## Requirements The module is intended to run against the latest core codebase, @@ -36,4 +60,4 @@ but also includes branches matching earlier core releases for backwards compatib ## Related - * [zframeworktest_dbswitcher](https://github.com/silverstripe-labs/zframeworktest_dbswitcher) module - adds capabilities to switch the database by a query parameter for testing purposes \ No newline at end of file + * [zframeworktest_dbswitcher](https://github.com/silverstripe-labs/zframeworktest_dbswitcher) module - adds capabilities to switch the database by a query parameter for testing purposes diff --git a/_config/elemental.yml b/_config/elemental.yml new file mode 100644 index 0000000..e3f2c90 --- /dev/null +++ b/_config/elemental.yml @@ -0,0 +1,7 @@ +--- +Only: + classexists: 'DNADesign\Elemental\Extensions\ElementalPageExtension' +--- +SilverStripe\FrameworkTest\Model\TestPage: + extensions: + - DNADesign\Elemental\Extensions\ElementalPageExtension diff --git a/code/TestPage.php b/code/TestPage.php index fa48159..d8f0931 100644 --- a/code/TestPage.php +++ b/code/TestPage.php @@ -20,7 +20,7 @@ /** * Parent class of all test pages */ -class TestPage extends Page +class TestPage extends Page implements \TestPageInterface { private static $table_name = 'FrameworkTestPage'; diff --git a/code/tasks/FTPageMakerTask.php b/code/tasks/FTPageMakerTask.php index bdd22cd..958a87c 100644 --- a/code/tasks/FTPageMakerTask.php +++ b/code/tasks/FTPageMakerTask.php @@ -1,17 +1,24 @@ [self::class, 'generateContentBlock'], + 'SilverStripe\ElementalBannerBlock\Block\BannerBlock' => [self::class, 'generateBannerBlock'], + 'SilverStripe\ElementalFileBlock\Block\FileBlock' => [self::class, 'generateFileBlock'], ]; public function run($request) { - $this->generatePages(); + // Optionally add blocks + $withBlocks = (bool)$request->getVar('withBlocks'); + if ($withBlocks && !class_exists('DNADesign\Elemental\Models\BaseElement')) { + throw new \LogicException('withBlocks requested, but BaseElement class not found'); + } + + $this->generatePages(0, "", 0, $withBlocks); } - protected function generatePages($depth = 0, $prefix = "", $parentID = 0) + protected function generatePages($depth = 0, $prefix = "", $parentID = 0, $withBlocks = false) { $maxDepth = count($this->pageCountByDepth); $pageCount = $this->pageCountByDepth[$depth]; $testPageClasses = ClassInfo::implementorsOf('TestPageInterface'); - $testPageClasses[] = 'Page'; for ($i=1; $i<=$pageCount; $i++) { $fullPrefix = $prefix ? "{$prefix}-{$i}" : $i; @@ -46,14 +76,80 @@ protected function generatePages($depth = 0, $prefix = "", $parentID = 0) $page->publish('Stage', 'Live'); echo "Created '$page->Title' ($page->ClassName)\n"; - + + if ($withBlocks) { + $this->generateBlocksForPage($page); + } + $pageID = $page->ID; + unset($page); if ($depth < $maxDepth-1) { - $this->generatePages($depth+1, $fullPrefix, $pageID); + $this->generatePages($depth+1, $fullPrefix, $pageID, $withBlocks); } } } - + + protected function generateBlocksForPage(Page $page) + { + $classes = array_filter($this->config()->get('block_generators'), function ($callable, $class) { + return class_exists($class); + }, ARRAY_FILTER_USE_BOTH); + + // Generate a random amount of blocks in the preferred range + $range = $this->blockCountRange; + foreach(range($range[0], array_rand(range($range[0], $range[1]))) as $i) { + $class = array_rand($classes); + $callable = $classes[$class]; + $block = call_user_func($callable); + + // Add block to page + $page->ElementalArea()->Elements()->add($block); + + // 50% chance of block being published + if (rand(0,1) === 0) { + $block->publishRecursive(); + } + + echo sprintf(" Added '%s' block #%d to page #%d\n", $class, $block->ID, $page->ID); + } + } + + public static function generateContentBlock() + { + $block = new ElementContent([ + 'HTML' => 'test 123' + ]); + $block->write(); + + return $block; + } + + public static function generateFileBlock() + { + // Supports both images and files + $file = File::get()->shuffle()->First(); + if (!$file) { + throw new \LogicException('No files found to associate with FileBlock'); + } + + $block = new FileBlock(); + $block->FileID = $file->ID; + $block->write(); + + return $block; + } + + public static function generateBannerBlock() + { + $block = new BannerBlock([ + 'Content' => 'test 123', + 'CallToActionLink' => 'http://example.com', + ]); + $block->write(); + + return $block; + } + }