简体   繁体   中英

Drupal 8 - Reading node fields values within a custom module

I am using Drupal 8.2.6 and I would like to create a block that would appear on a custom content type page.

It is kind of a booking block which sends an e-mail to the site admin that a visitor would like to book a product (the custom content type).

I assume I would need a form which only consists of a submit button and a block which renders the form.

But the real point would be sending the mail with the product's reference to the site admin.

As I found here , I could get the values I need using this snippet:

if ($node = \Drupal::routeMatch()->getParameter('node')) {
  $field_my_custom_value = $node->field_my_custom_value->value;
}

But I am not sure in which scope of my code I should use it. This example was for rendering the values within a custom block, where as my case would be sending a mail with the values.

And could anyone remind me as well how to send a mail from a custom module in Drupal 8?

Thanks a lot

So, after solving it myself after a day's whole worth of documentation, here are the solutions, as I am going to revert back my question to earlier revisions, in case anyone needs it.

So, given the snippet in the question above, I declared the variables in the buildForm() function

public function buildForm(array $form, FormStateInterface $form_state) {
  $field_value = '';
  if ($node = \Drupal::routeMatch()->getParameter('node')) {
    $field_value = $node->field_name->value;
  }

  $form['field_value'] = array(
    '#type' => 'value',
    '#value' => $field_value,
  );
  // And then you add the definition for other form items and submit button
}

And for sending the mail using the value, you retrieve the value using $form_state like this:

public function submitForm(array &$form, FormStateInterface $form_state) {
  $module = 'your_module_name';
  $key = 'any_key_you_would_like';
  $to = 'receiver@email.address';
  $langcode = 'en';
  $params = array(
    'body' => 'Node is booked',
    'subject' => $form_state->getValue('field_value'),
  );

  $mailer = \Drupal::service('plugin.manager.mail');
  $mailer->mail($module, $key, $to, $langcode, $params, NULL, TRUE);
}

Some values are quite tricky to get from the node, such as the node title which uses $node->getTitle() instead of $node->field_name->value so you would like to check your fields using Drupal 8's Devel + Kint module to know what attributes and methods to use.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM