Skip to content

Commit

Permalink
Merge pull request #77 from open-sausages/pulls/4/generate-blocks
Browse files Browse the repository at this point in the history
NEW Generate blocks
  • Loading branch information
chillu authored Dec 7, 2020
2 parents 0302087 + efbc66d commit b8403b9
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 11 deletions.
26 changes: 25 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,35 @@ 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,
but also includes branches matching earlier core releases for backwards compatibility.

## Related

* [zframeworktest_dbswitcher](https://github.com/silverstripe-labs/zframeworktest_dbswitcher) module - adds capabilities to switch the database by a query parameter for testing purposes
* [zframeworktest_dbswitcher](https://github.com/silverstripe-labs/zframeworktest_dbswitcher) module - adds capabilities to switch the database by a query parameter for testing purposes
7 changes: 7 additions & 0 deletions _config/elemental.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
Only:
classexists: 'DNADesign\Elemental\Extensions\ElementalPageExtension'
---
SilverStripe\FrameworkTest\Model\TestPage:
extensions:
- DNADesign\Elemental\Extensions\ElementalPageExtension
2 changes: 1 addition & 1 deletion code/TestPage.php
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down
114 changes: 105 additions & 9 deletions code/tasks/FTPageMakerTask.php
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
<?php

use DNADesign\Elemental\Models\ElementContent;
use SilverStripe\Assets\File;
use SilverStripe\Assets\Image;
use SilverStripe\Dev\BuildTask;
use SilverStripe\Core\ClassInfo;
use DNADesign\Elemental\Models\BaseElement;
use SilverStripe\ElementalBannerBlock\Block\BannerBlock;
use SilverStripe\ElementalFileBlock\Block\FileBlock;


/**
* Creates sample page structure, useful to test tree performance,
* UI behaviour on deeply nested pages etc.
*
*
* @todo Allow passing in counts
*/
class FTPageMakerTask extends BuildTask
{

/**
* Defaults create 2,000 pages
*/
Expand All @@ -20,20 +27,43 @@ class FTPageMakerTask extends BuildTask
100,
1,
1,
1
];

/**
* @var array Range of blocks to add (in case elemental is installed).
* Will create between X and Y blocks randomly.
*/
protected $blockCountRange = [
1,
10
];

/**
* @var array
* @config
*/
private static $block_generators = [
'DNADesign\Elemental\Models\ElementContent' => [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;
Expand All @@ -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' => '<bold>test</bold> 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' => '<bold>test</bold> 123',
'CallToActionLink' => 'http://example.com',
]);
$block->write();

return $block;
}

}

0 comments on commit b8403b9

Please sign in to comment.