it-swarm.com.de

Wie kann ich einem vorhandenen Webformular programmgesteuert Webformularelemente hinzufügen?

Ich habe ein Webformular, das sehr einfach ist, es ist ein Fragebogen. Es ist an einen Inhaltstyp namens "Ereignis" angehängt. z.B.

discussion_1:
  '#type': likert
  '#title': 'Discussion 1'
  '#questions':
    'Question 1': 'Question 1'
    'Question 2': 'Question 2'
    'Question 3': 'Question 3'
  '#answers': likert_five_scale

Ist es möglich, dieses Webformular zu ändern, wenn das Webformular gerendert wird, indem die Fragen aus einer anderen Quelle wie einer Ansicht ausgefüllt werden?

d.h. es wird eine variable Anzahl von Diskussionen mit variabler Anzahl von Fragen geben.

Ich versuche, ein Webformular dynamisch basierend auf Daten zu erstellen, die von dem Knoten stammen, an den das Webformular angehängt ist

1
Tim C

Sie müssen hook_webform_load () verwenden und die Elemente eines Webformulars über \Drupal\webform\Entity\Webform::setElements Ändern. Wenn Sie versuchen, die Webform-Elemente basierend auf dem Knoten (auch bekannt als Quellentität) zu ändern, müssen Sie möglicherweise hook_webform_submission_load () verwenden und dann das Element des Webforms über \Drupal\webform\Entity\WebformSubmission::getWebform Ändern.

2
jrockowitz

Also habe ich einen ganzen Tag lang nach etwas Ähnlichem gesucht. Ein großes Lob an @jrockowitz für die richtige Richtung. Unten ist etwas, das ich geschrieben habe, um zu arbeiten.

$webforms = \Drupal::entityTypeManager()
  ->getStorage('webform')
  ->loadByProperties([]);

$new_field = [
   'new_field'=>[ '#type' => 'textfield',
     '#title' => 'Question one',]];

foreach ($webforms as $webform) {
     // Applying to all forms.
      if (!in_array('new_field', $webform->getElementsDecoded())) {
        // $webform->getElementsDecoded() will get all the previous elements of the webform.
        $new_element_arrangment = array_merge($webform->getElementsDecoded(), $new_field);
        $webform->setElements($new_element_arrangment)->save();
    }
}
2
Harsh Vashisht

Erstellen Sie ein benutzerdefiniertes Modul und verwenden Sie hook_form_alter , um neue Felder hinzuzufügen und Standardwerte festzulegen.

function YOURMODULENAME_form_alter($form_id, &$form) {
  if ($form_id == 'YOUR_FORM_ID') { 
        $form['yourmodule'] = array(
        '#type' => 'checkbox',
        '#options' => t('Test'),
        '#title' => t('Title),
        '#description' => t('Description.'),
        '#weight' => 100,
    );
  }
}
0
electric.larry