devel_generate.module 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <?php
  2. use Drupal\Core\Entity\EntityInterface;
  3. use Drupal\Core\Field\FieldDefinitionInterface;
  4. use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface;
  5. use Drupal\Component\Utility\Random;
  6. use Drupal\devel_generate\DevelGenerateBase;
  7. use Drupal\node\NodeInterface;
  8. /**
  9. * Implements hook_menu_links_discovered_alter().
  10. */
  11. function devel_generate_menu_links_discovered_alter(&$links) {
  12. $devel_generate_plugins = $devel_generate_manager = \Drupal::service('plugin.manager.develgenerate')->getDefinitions();
  13. foreach ($devel_generate_plugins as $id => $plugin) {
  14. $label = $plugin['label'];
  15. $links["devel_generate.$id"] = array(
  16. 'title' => "Generate $label",
  17. 'parent' => 'system.admin_config_development',
  18. 'description' => $plugin['description'],
  19. 'route_name' => "devel_generate.$id",
  20. );
  21. }
  22. }
  23. /**
  24. * Implements hook_entity_insert().
  25. *
  26. * Inserts nodes properly based on generation options.
  27. *
  28. * @param \Drupal\Core\Entity\EntityInterface $entity
  29. * The base node created on submit. Inspects $node->devel_generate.
  30. */
  31. function devel_generate_entity_insert(EntityInterface $entity) {
  32. if ($entity->getEntityTypeId() != 'node' || !isset($entity->devel_generate)) {
  33. return;
  34. }
  35. /** @var \Drupal\node\NodeInterface $entity */
  36. $results = $entity->devel_generate;
  37. if (!empty($results['max_comments'])) {
  38. foreach ($entity->getFieldDefinitions() as $field_name => $field_definition) {
  39. if ($field_definition->getType() == 'comment' && $entity->get($field_name)->status == CommentItemInterface::OPEN) {
  40. // Add comments for each comment field on entity.
  41. devel_generate_add_comments($entity, $field_definition, $results['users'], $results['max_comments'], $results['title_length']);
  42. }
  43. }
  44. }
  45. // Add an url alias. Cannot happen before save because we don't know the nid.
  46. if (!empty($results['add_alias'])) {
  47. $path = array(
  48. 'source' => '/node/' . $entity->id(),
  49. 'alias' => '/node-' . $entity->id() . '-' . $entity->bundle(),
  50. );
  51. \Drupal::service('path.alias_storage')->save($path['source'], $path['alias']);
  52. }
  53. // Add node statistics.
  54. if (!empty($results['add_statistics']) && \Drupal::moduleHandler()->moduleExists('statistics')) {
  55. devel_generate_add_statistics($entity);
  56. }
  57. }
  58. /**
  59. * Create comments and add them to a node.
  60. *
  61. * @param \Drupal\node\NodeInterface $node
  62. * Node to add comments to.
  63. * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition
  64. * The field storage definition.
  65. * @param array $users
  66. * Array of users to assign comment authors.
  67. * @param int $max_comments
  68. * Max number of comments to generate per node.
  69. * @param int $title_length
  70. * Max length of the title of the comments.
  71. */
  72. function devel_generate_add_comments(NodeInterface $node, FieldDefinitionInterface $field_definition, $users, $max_comments, $title_length = 8) {
  73. $parents = array();
  74. $field_name = $field_definition->getName();
  75. $num_comments = mt_rand(1, $max_comments);
  76. for ($i = 1; $i <= $num_comments; $i++) {
  77. switch ($i % 3) {
  78. case 0:
  79. // No parent.
  80. case 1:
  81. // Top level parent.
  82. $parents = \Drupal::entityQuery('comment')
  83. ->condition('pid', 0)
  84. ->condition('entity_id', $node->id())
  85. ->condition('entity_type', 'node')
  86. ->condition('field_name', $field_name)
  87. ->range(0, 1)
  88. ->execute();
  89. break;
  90. case 2:
  91. // Non top level parent.
  92. $parents = \Drupal::entityQuery('comment')
  93. ->condition('pid', 0, '>')
  94. ->condition('entity_id', $node->id())
  95. ->condition('entity_type', 'node')
  96. ->condition('field_name', $field_name)
  97. ->range(0, 1)
  98. ->execute();
  99. break;
  100. }
  101. $random = new Random();
  102. $stub = array(
  103. 'entity_type' => $node->getEntityTypeId(),
  104. 'entity_id' => $node->id(),
  105. 'field_name' => $field_name,
  106. 'name' => 'devel generate',
  107. 'mail' => 'devel_generate@example.com',
  108. 'timestamp' => mt_rand($node->getCreatedTime(), REQUEST_TIME),
  109. 'subject' => substr($random->sentences(mt_rand(2, $title_length), TRUE), 0, 63),
  110. 'uid' => $users[array_rand($users)],
  111. 'langcode' => $node->language()->getId(),
  112. );
  113. if ($parents) {
  114. $stub['pid'] = current($parents);
  115. }
  116. $comment = entity_create('comment', $stub);
  117. //Populate all core fields on behalf of field.module
  118. DevelGenerateBase::populateFields($comment);
  119. $comment->save();
  120. }
  121. }
  122. /**
  123. * Generate statistics information for a node.
  124. *
  125. * @param \Drupal\node\NodeInterface $node
  126. * A node object.
  127. */
  128. function devel_generate_add_statistics(NodeInterface $node) {
  129. $statistic = array(
  130. 'nid' => $node->id(),
  131. 'totalcount' => mt_rand(0, 500),
  132. 'timestamp' => REQUEST_TIME - mt_rand(0, $node->getCreatedTime()),
  133. );
  134. $statistic['daycount'] = mt_rand(0, $statistic['totalcount']);
  135. db_insert('node_counter')->fields($statistic)->execute();
  136. }