diff --git a/src/Plugin/DevelGenerate/MessageDevelGenerate.php b/src/Plugin/DevelGenerate/MessageDevelGenerate.php new file mode 100644 index 0000000..4cfc13f --- /dev/null +++ b/src/Plugin/DevelGenerate/MessageDevelGenerate.php @@ -0,0 +1,217 @@ +messageStorage = $entity_storage; + $this->messageTypeStorage = $message_type_storage; + $this->urlGenerator = $url_generator; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $configuration, $plugin_id, $plugin_definition, + $container->get('entity_type.manager')->getStorage('message'), + $container->get('entity_type.manager')->getStorage('message_template'), + $container->get('url_generator') + ); + } + + /** + * {@inheritdoc} + */ + public function settingsForm(array $form, FormStateInterface $form_state) { + $types = $this->messageTypeStorage->loadMultiple(); + + if (empty($types)) { + $create_url = $this->urlGenerator->generateFromRoute('message.type_add'); + $this->setMessage($this->t('You do not have any content types that can be generated. Go create a new content type', [':create-type' => $create_url]), 'error', FALSE); + return; + } + + $options = []; + + foreach ($types as $type) { + $options[$type->id()] = [ + 'type' => ['#markup' => $type->label()], + ]; + } + $header = [ + 'type' => $this->t('Message type'), + ]; + + $form['template'] = [ + '#type' => 'tableselect', + '#header' => $header, + '#options' => $options, + '#required' => TRUE, + ]; + + $form['num'] = [ + '#type' => 'number', + '#title' => $this->t('Number of messages?'), + '#default_value' => $this->getSetting('num'), + '#required' => TRUE, + '#min' => 0, + ]; + $form['kill'] = [ + '#type' => 'checkbox', + '#title' => $this->t('Delete existing messages before generating new ones.'), + '#default_value' => $this->getSetting('kill'), + ]; + + return $form; + } + + /** + * {@inheritdoc} + */ + public function generateElements(array $values) { + if ($values['kill']) { + $this->deleteMessages(); + $this->setMessage($this->t('Deleted existing messages.')); + } + + $new_messages = $this->generateMessages($values['num'], $values['template']); + if (!empty($new_messages)) { + $this->setMessage($this->t('Created the following new messages: @mess', ['@mess' => implode(', ', $new_messages)])); + } + } + + /** + * Deletes all messages. + */ + protected function deleteMessages() { + $messages = $this->messageStorage->loadMultiple(); + $this->messageStorage->delete($messages); + } + + /** + * Generates messages. + * + * @param int $records + * Number of messages to create. + * @param array $message_template + * List of message templates to use. + * + * @return array + * Array containing the generated messages id. + */ + protected function generateMessages($records, $message_template) { + $messages = []; + + $message_template = array_filter($message_template); + + // Insert new data: + for ($i = 1; $i <= $records; $i++) { + $template = array_rand($message_template); + $message = $this->messageStorage->create([ + 'template' => $template, + 'langcode' => Language::LANGCODE_NOT_SPECIFIED, + ]); + + // Populate all fields with sample values. + $this->populateFields($message); + $message->save(); + + $messages[] = $message->id(); + unset($message); + } + + return $messages; + } + + /** + * {@inheritdoc} + */ + public function validateDrushParams(array $args, array $options = []) { + $values = [ + 'num' => array_shift($args), + 'kill' => $options['kill'], + ]; + + if ($this->isNumber($values['num']) == FALSE) { + throw new \Exception(dt('Invalid number of messages: @num.', ['@num' => $values['num']])); + } + + return $values; + } + +}