function ContentDevelGenerate::settingsForm

Same name and namespace in other branches
  1. 4.x devel_generate/src/Plugin/DevelGenerate/ContentDevelGenerate.php \Drupal\devel_generate\Plugin\DevelGenerate\ContentDevelGenerate::settingsForm()

Overrides DevelGenerateBase::settingsForm

File

devel_generate/src/Plugin/DevelGenerate/ContentDevelGenerate.php, line 149

Class

ContentDevelGenerate
Provides a ContentDevelGenerate plugin.

Namespace

Drupal\devel_generate\Plugin\DevelGenerate

Code

public function settingsForm(array $form, FormStateInterface $form_state) : array {
  $types = $this->nodeTypeStorage
    ->loadMultiple();
  if (empty($types)) {
    $create_url = $this->urlGenerator
      ->generateFromRoute('node.type_add');
    $this->messenger()
      ->addMessage($this->t('You do not have any content types that can be generated. <a href=":create-type">Go create a new content type</a>', [
      ':create-type' => $create_url,
    ]), 'error');
    return [];
  }
  $options = [];
  foreach ($types as $type) {
    $options[$type->id()] = [
      'type' => [
        '#markup' => $type->label(),
      ],
    ];
    if ($this->commentManager instanceof CommentManagerInterface) {
      $comment_fields = $this->commentManager
        ->getFields('node');
      $map = [
        $this->t('Hidden'),
        $this->t('Closed'),
        $this->t('Open'),
      ];
      $fields = [];
      foreach ($comment_fields as $field_name => $info) {
        // Find all comment fields for the bundle.
        if (in_array($type->id(), $info['bundles'])) {
          $instance = FieldConfig::loadByName('node', $type->id(), $field_name);
          $default_value = $instance->getDefaultValueLiteral();
          $default_mode = reset($default_value);
          $fields[] = new FormattableMarkup('@field: @state', [
            '@field' => $instance->label(),
            '@state' => $map[$default_mode['status']],
          ]);
        }
      }
      // @todo Refactor display of comment fields.
      if ($fields !== []) {
        $options[$type->id()]['comments'] = [
          'data' => [
            '#theme' => 'item_list',
            '#items' => $fields,
          ],
        ];
      }
      else {
        $options[$type->id()]['comments'] = $this->t('No comment fields');
      }
    }
  }
  $header = [
    'type' => $this->t('Content type'),
  ];
  if ($this->commentManager instanceof CommentManagerInterface) {
    $header['comments'] = [
      'data' => $this->t('Comments'),
      'class' => [
        RESPONSIVE_PRIORITY_MEDIUM,
      ],
    ];
  }
  $form['node_types'] = [
    '#type' => 'tableselect',
    '#header' => $header,
    '#options' => $options,
  ];
  $form['kill'] = [
    '#type' => 'checkbox',
    '#title' => $this->t('<strong>Delete all content</strong> in these content types before generating new content.'),
    '#default_value' => $this->getSetting('kill'),
  ];
  $form['num'] = [
    '#type' => 'number',
    '#title' => $this->t('How many nodes would you like to generate?'),
    '#default_value' => $this->getSetting('num'),
    '#required' => TRUE,
    '#min' => 0,
  ];
  $options = [
    1 => $this->t('Now'),
  ];
  foreach ([
    3600,
    86400,
    604800,
    2592000,
    31536000,
  ] as $interval) {
    $options[$interval] = $this->dateFormatter
      ->formatInterval($interval, 1) . ' ' . $this->t('ago');
  }
  $form['time_range'] = [
    '#type' => 'select',
    '#title' => $this->t('How far back in time should the nodes be dated?'),
    '#description' => $this->t('Node creation dates will be distributed randomly from the current time, back to the selected time.'),
    '#options' => $options,
    '#default_value' => 604800,
  ];
  $form['max_comments'] = [
    '#type' => $this->moduleHandler
      ->moduleExists('comment') ? 'number' : 'value',
    '#title' => $this->t('Maximum number of comments per node.'),
    '#description' => $this->t('You must also enable comments for the content types you are generating. Note that some nodes will randomly receive zero comments. Some will receive the max.'),
    '#default_value' => $this->getSetting('max_comments'),
    '#min' => 0,
    '#access' => $this->moduleHandler
      ->moduleExists('comment'),
  ];
  $form['title_length'] = [
    '#type' => 'number',
    '#title' => $this->t('Maximum number of words in titles'),
    '#default_value' => $this->getSetting('title_length'),
    '#required' => TRUE,
    '#min' => 1,
    '#max' => 255,
  ];
  $form['skip_fields'] = [
    '#type' => 'textfield',
    '#title' => $this->t('Fields to leave empty'),
    '#description' => $this->t('Enter the field names as a comma-separated list. These will be skipped and have a default value in the generated content.'),
    '#default_value' => NULL,
  ];
  $form['base_fields'] = [
    '#type' => 'textfield',
    '#title' => $this->t('Base fields to populate'),
    '#description' => $this->t('Enter the field names as a comma-separated list. These will be populated.'),
    '#default_value' => NULL,
  ];
  $form['add_type_label'] = [
    '#type' => 'checkbox',
    '#title' => $this->t('Prefix the title with the content type label.'),
    '#description' => $this->t('This will not count against the maximum number of title words specified above.'),
    '#default_value' => $this->getSetting('add_type_label'),
  ];
  $form['add_alias'] = [
    '#type' => 'checkbox',
    '#disabled' => !$this->moduleHandler
      ->moduleExists('path'),
    '#description' => $this->t('Requires path.module'),
    '#title' => $this->t('Add an url alias for each node.'),
    '#default_value' => FALSE,
  ];
  $form['add_statistics'] = [
    '#type' => 'checkbox',
    '#title' => $this->t('Add statistics for each node (node_counter table).'),
    '#default_value' => TRUE,
    '#access' => $this->moduleHandler
      ->moduleExists('statistics'),
  ];
  // Add the language and translation options.
  $form += $this->getLanguageForm('nodes');
  // Add the user selection checkboxes.
  $author_header = [
    'id' => $this->t('User ID'),
    'user' => $this->t('Name'),
    'role' => $this->t('Role(s)'),
  ];
  $num_users = $this->database
    ->select('users')
    ->countQuery()
    ->execute()
    ->fetchField();
  $author_form_limit = 50;
  $query = $this->database
    ->select('users', 'u')
    ->fields('u', [
    'uid',
  ])
    ->range(0, $author_form_limit)
    ->orderBy('uid');
  $uids = $query->execute()
    ->fetchCol();
  $author_rows = [];
  foreach ($uids as $uid) {
    /** @var \Drupal\user\UserInterface $user */
    $user = $this->userStorage
      ->load($uid);
    $author_rows[$user->id()] = [
      'id' => [
        '#markup' => $user->id(),
      ],
      'user' => [
        '#markup' => $user->getAccountName(),
      ],
      'role' => [
        '#markup' => implode(", ", $user->getRoles()),
      ],
    ];
  }
  $form['authors-wrap'] = [
    '#type' => 'details',
    '#title' => $this->t('Users'),
    '#open' => FALSE,
    '#description' => $this->t('Select users for randomly assigning as authors of the generated content.') . ($num_users > $author_form_limit ? ' ' . $this->t('The site has @num_users users, only the first @$author_form_limit are shown and selectable here.', [
      '@num_users' => $num_users,
      '@$author_form_limit' => $author_form_limit,
    ]) : ''),
  ];
  $form['authors-wrap']['authors'] = [
    '#type' => 'tableselect',
    '#header' => $author_header,
    '#options' => $author_rows,
  ];
  $role_rows = [];
  $roles = array_map(static fn($role): string => $role->label(), $this->roleStorage
    ->loadMultiple());
  foreach ($roles as $role_id => $role_name) {
    $role_rows[$role_id] = [
      'id' => [
        '#markup' => $role_id,
      ],
      'role' => [
        '#markup' => $role_name,
      ],
    ];
  }
  $form['authors-wrap']['roles'] = [
    '#type' => 'tableselect',
    '#header' => [
      'id' => $this->t('Role ID'),
      'role' => $this->t('Role Description'),
    ],
    '#options' => $role_rows,
    '#prefix' => $this->t('Specify the roles that randomly selected authors must have.'),
    '#suffix' => $this->t('You can select users and roles. Authors will be randomly selected that match at least one of the criteria. Leave <em>both</em> selections unchecked to use a random selection of @$author_form_limit users, including Anonymous.', [
      '@$author_form_limit' => $author_form_limit,
    ]),
  ];
  $form['#redirect'] = FALSE;
  return $form;
}