Перенаправление страницы в пользовательской базе данных WebformHandlerBase


Я написал пользовательскую базу веб-форм и прикрепил ее к многостраничной веб-форме. Благодаря этому я могу получить значения в пользовательский обработчик, как только пользователь нажмет на следующую страницу> кнопка

class MyFormHandler extends WebformHandlerBase {
     public function submitForm(array &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {

         $form_id = 'webform_submission_' . $webform_submission->getWebform()->id() . '_form';

         if($form_id == 'webform_submission_registration_content_form') {
            $values = $webform_submission->getData();
            /* custom code to calculate the score based on the values */
             $eligible_to_participate = 1;
             if ($score >= x && $score <= y) {
                  $eligible_to_participate = 1;
              }
             else
             {
                 $eligible_to_participate = 0;
             }
             if($eligible_to_participate == 0) {
                  // This user is not eligible so redirect to 'finish page'
                  /* The below code is not working 
                   * how-ever the same code is working in hook_form_FORM_ID_alter()
                   */
                  $url = Url::fromRoute('entity.node.canonical', ['node' => 78]); 
                  $response = new RedirectResponse($url->toString()); 
                  $response->send();
              }
          }
      }
 }

На основе выбранных пользователем значений мне нужно перенаправить пользователя на другую страницу, и код для этого выглядит следующим образом

 use Drupal\Core\Url;
 use Symfony\Component\HttpFoundation\RedirectResponse;

 $url = Url::fromRoute('entity.node.canonical', ['node' => 78]);
 $response = new RedirectResponse($url->toString());
 $response->send(); 

Теперь проблема в том, что этот код не работает в пользовательской функции обработчика. Если я напишу тот же код в hook_form_FORM_ID_alter() работает нормально.

Есть идеи, где я делаю неправильно? Любая помощь будет очень признательна.

 2
Author: rdev, 2017-09-06

1 answers

<?php
namespace Drupal\sa_webform\Plugin\WebformHandler;

use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Serialization\Yaml;
use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\Plugin\WebformHandlerBase;
use Drupal\webform\webformSubmissionInterface;

/**
 * Form submission handler.
 *
 * @WebformHandler(
 *   id = "my_webform_handler",
 *   label = @Translation("My webform handler"),
 *   category = @Translation("Webform Handler"),
 *   description = @Translation("Calculate the score with webform 
 *                                                     submissions"),
 *   cardinality = 
 *       \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_SINGLE,
 *   results = 
 *    \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
 * )
 */

 class MyWebformHandler extends WebformHandlerBase {
 /**
  * {@inheritdoc}
  */
    public function submitForm(array &$form, FormStateInterface $form_state, 
                           WebformSubmissionInterface $webform_submission) {

       $form_id = 'webform_submission_' . $webform_submission->getWebform()-
               >id() . '_form';
       if($form_id == 'webform_submission_xxx_form') {
         $values = $webform_submission->getData();  
         /* Take the action based on the Webform submission values */   
       }    
    }

    public function confirmForm(array &$form, FormStateInterface 
          $form_state, WebformSubmissionInterface $webform_submission) {
       $form_id = 'webform_submission_' . $webform_submission->getWebform()-
                                                  >id() . '_form';
       if($form_id == 'webform_submission_xxx_form')
       {
          if(based_on_some_condition) {
          /* Here 12 is the node id where i wanted to redirect to */
          $form_state->setRedirect('entity.node.canonical',['node' => 12]);
       }
    }
}   
?>

Для получения дополнительных примеров обратитесь к коду src модулей веб-формы, расположенному по адресу webform\src\Plugin\Webformhandler

BrokenWebformHandler.php

DebugWebformHandler.php

EmailWebformHandler.php

RemotePostWebformHandler.php

 8
Author: rdev, 2017-10-21 23:20:42