Drupal.org module page: https://www.drupal.org/project/generated_content
As a site owner
I want to see generated content before I have content
So that I can see how my site looks
As a Drupal developer
I want to control what is put into generated content
So that I could have control over what is being generated
As a Drupal developer
I want to have a list of pre-generated pages with URLs
So that I could use then for Visual Regression testing during site releases
composer require drupal/generated_content
-
The module provides callbacks system to generate content entities within a code of a custom module sitting in
generated_content/{entity_type}/{entity_bundle}.inc
. -
The module provides a helper (singleton) class to generate random and static content. It also supports extending this class in your custom module to enhance with your site-specific generation helpers.
-
Generated content entities are tracked in the Repository so that they could be referenced from other generated entities (e.g., generated Articles using generated Tags).
-
Content can be generated from UI
/admin/config/development/generated-content
or through a Drush commanddrush generated-content:create-content {entity_type} {bundle}
. -
Content can also be generated on module install if
GENERATED_CONTENT_CREATE
environment variable is set to1
. Generation can be further filtered by specified types inGENERATED_CONTENT_ITEMS
environment variable as a comma-separated list of{entity_type}-{bundle}
values:# Generate all items in my_module module when it is enabled. GENERATED_CONTENT_CREATE=1 drush pm-enable my_module # Generate only selected items in my_module module when it is enabled. GENERATED_CONTENT_CREATE=1 GENERATED_CONTENT_ITEMS=media-image,taxonomy_term-tags,node-page drush pm-enable my_module
See test example module 1 and test example module 2 for extensive examples.
See generated_content.api.php
for API of callbacks system.
<?php
/**
* @file
* Create generated Tags terms.
*/
use Drupal\Core\Link;
use Drupal\generated_content\Helpers\GeneratedContentHelper;
use Drupal\taxonomy\Entity\Term;
/**
* Implements hook_generated_content_create_ENTITY_TYPE_BUNDLE_weight().
*/
function generated_content_example2_generated_content_create_taxonomy_term_tags_weight() {
return 12;
}
/**
* Implements hook_generated_content_create_ENTITY_TYPE_BUNDLE_tracking().
*/
function generated_content_example2_generated_content_create_taxonomy_term_tags_tracking() {
return TRUE;
}
/**
* Implements hook_generated_content_create_ENTITY_TYPE_BUNDLE().
*/
function generated_content_example2_generated_content_create_taxonomy_term_tags() {
// Total number of terms to create.
$total_terms_count = 10;
/** @var \Drupal\generated_content\Helpers\GeneratedContentHelper $helper */
$helper = GeneratedContentHelper::getInstance();
$terms = [];
for ($i = 0; $i < $total_terms_count; $i++) {
// Create a term instance.
$term = Term::create([
'vid' => 'tags',
'name' => 'Generated term ' . ($i + 1),
]);
// Save term instance.
$term->save();
// Track saved term instance to return.
$terms[] = $term;
// Log creation of this entity.
$helper::log(
'Created "%s" term "%s" [ID: %s] %s',
$term->bundle(),
$term->toLink()->toString(),
$term->id(),
Link::createFromRoute('Edit', 'entity.taxonomy_term.edit_form', ['taxonomy_term' => $term->id()])->toString()
);
}
// Return created term instances.
return $terms;
}
Generation helper class GeneratedContentHelper
is a Singleton class which
provides:
- Random non-Drupal scalar values generation.
- Static non-Drupal scalar values generation.
- Random asset generator (files of different types).
- Static asset generator (files from pre-defined assets).
- Random Drupal entity values generation.
- Static Drupal entity values generation.
See example of class extension: modules/generated_content_example2/src/GeneratedContentExample2Helper.php
See example of class usage: modules/generated_content_example2/generated_content/node/article.inc
Sometimes, it is sufficient to simply populate entities with random content to make the site look "not empty". Depending on your deployment strategy (if you are enabling content generation modules on every deployment on top of the fresh database), this may change the content on every deployment.
However, there are times when all generated content can still be a "placeholder" content, but it should be "static" between deployments, so that all content and it's aliases would not change. This is specifically important for Visual Regression testing during a release: the tool can compare generated pages with known aliases in 2 environments and report differences, if any.
- Add more random and static generators.
- Add tests for existing random and static generators.
- Suggest yours.
Provided that you have PHP installed locally, you can develop an extension using the provided scripts.
Run .devtools/build-codebase.sh
(or ahoy build-codebase
if Ahoy is installed) to start inbuilt PHP
server locally and run the same commands as in CI, plus installing a site and
your extension automatically.
Run tools individually (or ahoy lint
to run all tools
if Ahoy is installed) to lint your code
according to
the Drupal coding standards.
cd build
vendor/bin/phpcs
vendor/bin/phpstan
vendor/bin/rector --clear-cache --dry-run
vendor/bin/phpmd . text phpmd.xml
vendor/bin/twigcs
- PHPCS config:
phpcs.xml
- PHPStan config:
phpstan.neon
- PHPMD config:
phpmd.xml
- Rector config:
rector.php
- TwigCS config:
.twig_cs.php
Run .devtools/test.sh
(or ahoy test
if Ahoy is installed) to run all test for
your extension.
To browse the contents of created SQLite database
(located at /tmp/site_[EXTENSION_NAME].sqlite
),
use DB Browser for SQLite.