You are here

class WizardFactory in Chaos Tool Suite (ctools) 8.3

The wizard factory.

Hierarchy

Expanded class hierarchy of WizardFactory

1 string reference to 'WizardFactory'
ctools.services.yml in ./ctools.services.yml
ctools.services.yml
1 service uses WizardFactory
ctools.wizard.factory in ./ctools.services.yml
Drupal\ctools\Wizard\WizardFactory

File

src/Wizard/WizardFactory.php, line 13

Namespace

Drupal\ctools\Wizard
View source
class WizardFactory implements WizardFactoryInterface {

  /**
   * The Form Builder.
   *
   * @var \Drupal\Core\Form\FormBuilderInterface
   */
  protected $builder;

  /**
   * The event dispatcher.
   *
   * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
   */
  protected $dispatcher;

  /**
   * The object renderer.
   *
   * @var \Drupal\Core\Render\RendererInterface
   */
  protected $renderer;

  /**
   * The construct method.
   *
   * @param \Drupal\Core\Form\FormBuilderInterface $form_builder
   *   The form builder.
   * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher
   *   The event dispatcher.
   * @param \Drupal\Core\Render\RendererInterface $renderer
   *   The object renderer.
   */
  public function __construct(FormBuilderInterface $form_builder, EventDispatcherInterface $event_dispatcher, RendererInterface $renderer) {
    $this->builder = $form_builder;
    $this->dispatcher = $event_dispatcher;
    $this->renderer = $renderer;
  }

  /**
   * {@inheritdoc}
   */
  public function getWizardForm(FormWizardInterface $wizard, array $parameters = [], $ajax = FALSE) {
    $form_state = $this
      ->getFormState($wizard, $parameters, $ajax);
    $form = $this->builder
      ->buildForm($wizard, $form_state);
    if ($ajax) {
      $form['#attached']['library'][] = 'core/drupal.dialog.ajax';
      $status_messages = [
        '#type' => 'status_messages',
      ];
      if ($messages = $this->renderer
        ->renderRoot($status_messages)) {
        if (!empty($form['#prefix'])) {

          // Form prefix is expected to be a string. Prepend the messages to
          // that string.
          $form['#prefix'] = '<div class="wizard-messages">' . $messages . '</div>' . $form['#prefix'];
        }
      }
    }
    return $form;
  }

  /**
   * Create form wizard.
   *
   * @param string $class
   *   A class name implementing FormWizardInterface.
   * @param array $parameters
   *   The array of parameters specific to this wizard.
   *
   * @return \Drupal\ctools\Wizard\FormWizardInterface
   *   Return form Wizard.
   */
  public function createWizard($class, array $parameters) {
    $arguments = [];
    $reflection = new \ReflectionClass($class);
    $constructor = $reflection
      ->getMethod('__construct');
    foreach ($constructor
      ->getParameters() as $parameter) {
      if (array_key_exists($parameter->name, $parameters)) {
        $arguments[] = $parameters[$parameter->name];
      }
      elseif ($parameter
        ->isDefaultValueAvailable()) {
        $arguments[] = $parameter
          ->getDefaultValue();
      }
    }

    /** @var $wizard \Drupal\ctools\Wizard\FormWizardInterface */
    $wizard = $reflection
      ->newInstanceArgs($arguments);
    return $wizard;
  }

  /**
   * Get the wizard form state.
   *
   * @param \Drupal\ctools\Wizard\FormWizardInterface $wizard
   *   The form wizard.
   * @param array $parameters
   *   The array of parameters specific to this wizard.
   * @param bool $ajax
   *   Is ajax or not.
   *
   * @return \Drupal\Core\Form\FormState
   *   Return the form state.
   */
  public function getFormState(FormWizardInterface $wizard, array $parameters, $ajax = FALSE) {
    $form_state = new FormState();

    // If a wizard has no values, initialize them.
    if (!$wizard
      ->getMachineName() || !$wizard
      ->getTempstore()
      ->get($wizard
      ->getMachineName())) {
      $cached_values = $wizard
        ->initValues();

      // Save the cached values that were initialized.
      if ($wizard
        ->getMachineName()) {
        $wizard
          ->getTempstore()
          ->set($wizard
          ->getMachineName(), $cached_values);
      }
    }
    else {
      $cached_values = $wizard
        ->getTempstore()
        ->get($wizard
        ->getMachineName());
    }
    $form_state
      ->setTemporaryValue('wizard', $cached_values);
    $form_state
      ->set('ajax', $ajax);
    $parameters['form'] = [];
    $parameters['form_state'] = $form_state;
    $method = new \ReflectionMethod($wizard, 'buildForm');
    $arguments = [];
    foreach ($method
      ->getParameters() as $parameter) {
      if (array_key_exists($parameter->name, $parameters)) {
        $arguments[] = $parameters[$parameter->name];
      }
      elseif ($parameter
        ->isDefaultValueAvailable()) {
        $arguments[] = $parameter
          ->getDefaultValue();
      }
    }
    unset($parameters['form'], $parameters['form_state']);

    // Remove $form and $form_state from the arguments, and re-index them.
    unset($arguments[0], $arguments[1]);
    $form_state
      ->addBuildInfo('args', array_values($arguments));
    return $form_state;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
WizardFactory::$builder protected property The Form Builder.
WizardFactory::$dispatcher protected property The event dispatcher.
WizardFactory::$renderer protected property The object renderer.
WizardFactory::createWizard public function Create form wizard. Overrides WizardFactoryInterface::createWizard
WizardFactory::getFormState public function Get the wizard form state. Overrides WizardFactoryInterface::getFormState
WizardFactory::getWizardForm public function Get the wizard form. Overrides WizardFactoryInterface::getWizardForm
WizardFactory::__construct public function The construct method.