has overridden settings and/or properties and can not be saved. in Drupal\webform\Entity\Webform->preSave() (line 2296 of modules\contrib\webform\src\Entity\Webform.php).

Drupal\Core\Entity\EntityStorageBase->doPreSave(Object) (Line: 521)
Drupal\Core\Entity\EntityStorageBase->save(Object) (Line: 253)
Drupal\Core\Config\Entity\ConfigEntityStorage->save(Object) (Line: 108)
Drupal\webform\WebformEntityStorage->save(Object) (Line: 339)
Drupal\Core\Entity\EntityBase->save() (Line: 607)
Drupal\Core\Config\Entity\ConfigEntityBase->save() (Line: 410)
initiateNewElements(Object, Array, 'sind_sie_bereits_angemeldet', 2) (Line: 408)
initiateNewElements(Object, Array, 'sind_sie_bereits_angemeldet_', 1) (Line: 408)
initiateNewElements(Object, Array) (Line: 170)
plaing_inquiry_webform_submission_prepare_form(Object, 'add', Object)
call_user_func_array('plaing_inquiry_webform_submission_prepare_form', Array) (Line: 397)
Drupal\Core\Entity\EntityForm->prepareInvokeAll('webform_submission_prepare_form', Object) (Line: 129)
Drupal\Core\Entity\EntityForm->init(Object) (Line: 287)
Drupal\Core\Entity\ContentEntityForm->init(Object) (Line: 263)
Drupal\webform\WebformSubmissionForm->init(Object) (Line: 96)
Drupal\Core\Entity\EntityForm->buildForm(Array, Object) (Line: 641)
Drupal\webform\WebformSubmissionForm->buildForm(Array, Object)
call_user_func_array(Array, Array) (Line: 531)
Drupal\Core\Form\FormBuilder->retrieveForm('webform_submission_anfrage_hausbau_node_166_add_form', Object) (Line: 278)
Drupal\Core\Form\FormBuilder->buildForm(Object, Object) (Line: 48)
Drupal\Core\Entity\EntityFormBuilder->getForm(Object, 'add') (Line: 1233)
Drupal\webform\Entity\Webform->getSubmissionForm(Array) (Line: 78)
Drupal\webform\Element\Webform::preRenderWebformElement(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 772)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 363)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 201)
Drupal\Core\Render\Renderer->render(Array) (Line: 463)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 87)
__TwigTemplate_534b64befb20c328181389f53b781359605db6c13d66dbf85d022add486d2e84->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/vanipro/templates/field/field.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 422)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 435)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 201)
Drupal\Core\Render\Renderer->render(Array) (Line: 463)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 149)
__TwigTemplate_c2f7c9a79fee9c520e8a2de15d26828e629f859836cf11de675bc09a3d5f02fc->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/vanipro/templates/content/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 422)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 201)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 241)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 564)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 163)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 80)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 106)
Drupal\page_cache\StackMiddleware\PageCache->pass(Object, 1, 1) (Line: 85)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 708)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)

Comments

arsibux created an issue. See original summary.

jrockowitz’s picture

Status: Active » Postponed (maintainer needs more info)

Please provide the steps required to reproduce this issue.

If you can create a simple example webform that replicates the problem, export it, and attach it here that would be very helpful.

arshadsahjavi’s picture

Task: Add CARD to all existing webforms at specific position in hook install

 // Get the submission's Webform.
  $webform = $webform_submission->getWebform();
  // need to add Card "sind_sie_bereits_angemeldet_" to all webforms at specific position
  $new_card = [
    'sind_sie_bereits_angemeldet_' => [
      '#type' => 'webform_card',
      '#title' => 'Sind Sie bereits angemeldet?',
      '#prev_button_label' => 'Zurück',
      '#next_button_label' => 'Weiter',
      // '#webform_plugin_id'=>
      '#access_create_roles' => [
        'anonymous',
      ],
      'sind_sie_bereits_angemeldet' => [
        '#type' => 'radios',
        '#title' => 'Sind Sie bereits angemeldet?',
        '#title_display' => 'invisible',
        '#options' => [
          'yes' => 'Ja, ich bin schon angemeldet',
          'no' => 'Nein, leider noch nicht',
        ],
        '#options_display' => 'buttons_vertical',
        '#required' => 1,
      ],
    ],
  ];
  $existing_cards = $webform->getElementsDecoded();
  if (!in_array('sind_sie_bereits_angemeldet_', $existing_cards)) {
    $total_number_cards = count($existing_cards);
    $insert_position = $total_number_cards > 2 ? $total_number_cards - 2 : 0;
    if ($insert_position > 1) {
      $cards = array_merge(array_slice($existing_cards, 0, $insert_position), $new_card, array_slice($existing_cards, $insert_position));
      // Handle create element.
      $webform->setElements($cards)->save();
    }
  }
jrockowitz’s picture

I cannot use your example to replicate any issue because the code is specific to your project.

I am not sure where the $webform_submission object is coming from and why you would not be loading the $webform directly using its id.

arshadsahjavi’s picture

Thank you so much for immdiate and quick response and guidlines.

why you would not be loading the $webform directly using its id.

Now working fine. Thank you

jrockowitz’s picture

Status: Postponed (maintainer needs more info) » Closed (won't fix)
arshadsahjavi’s picture

/**
 * Implements hook_install().
 */
function modulename_install()
{

  // Card need to add in all webform except contact
  $card = [
    'sind_sie_bereits_angemeldet_' => [
      '#type' => 'webform_card',
      '#title' => 'Sind Sie bereits angemeldet?',
      '#prev_button_label' => 'Zurück',
      '#next_button_label' => 'Weiter',
      '#access_create_roles' => [
        'anonymous',
      ],
      'sind_sie_bereits_angemeldet' => [
        '#type' => 'radios',
        '#title' => 'Sind Sie bereits angemeldet?',
        '#title_display' => 'invisible',
        '#options' => [
          'yes' => 'Ja, ich bin schon angemeldet',
          'no' => 'Nein, leider noch nicht',
        ],
        '#options_display' => 'buttons_vertical',
        '#required' => 1,
      ],
    ],
  ];


  // Getting All existing webform IDs except contact webform.
  $webform_ids = \Drupal::entityQuery('webform')
    ->condition('webform_id',  'contact', "!=")
    ->execute();
  foreach ($webform_ids as $webform_id) {
    // Get existing webform
    $webform = \Drupal\webform\Entity\Webform::load($webform_id);
    // Getting webform all Cards
    $existing_cards = $webform->getElementsDecoded();
    if ($existing_cards == null)
      continue;
    // If card already not exist.
    if (!in_array('sind_sie_bereits_angemeldet_', $existing_cards)) {
      $total_number_cards = count($existing_cards);
      // at specific position
      $insert_position = $total_number_cards > 2 ? $total_number_cards - 2 : 0;
      if ($insert_position > 1) {
        $cards = array_merge(array_slice($existing_cards, 0, $insert_position), $card, array_slice($existing_cards, $insert_position));
        $webform->setElements($cards)->save();
      }
    }
  }
}