FormConverter.php in Drupal 7 to 8/9 Module Upgrader 8
File
src/Utility/FormConverter.php
View source
<?php
namespace Drupal\drupalmoduleupgrader\Utility;
use Drupal\drupalmoduleupgrader\RewriterInterface;
use Drupal\drupalmoduleupgrader\TargetInterface;
use Pharborist\Filter;
use Pharborist\Functions\FunctionCallNode;
use Pharborist\Functions\FunctionDeclarationNode;
use Pharborist\Functions\ParameterNode;
use Pharborist\Objects\ClassMethodNode;
use Pharborist\Objects\ClassNode;
use Pharborist\Parser;
use Pharborist\Token;
use Pharborist\TokenNode;
class FormConverter {
use StringTransformTrait;
protected $target;
protected $formID;
protected $builder;
protected $validator;
protected $submitHandler;
protected $isConfig;
protected $formStateRewriter;
protected $controller;
public function __construct(TargetInterface $target, $form_id, RewriterInterface $rewriter) {
$indexer = $target
->getIndexer('function');
$this->target = $target;
$this->formID = $form_id;
$this->builder = $indexer
->get($form_id);
$validator = $form_id . '_validate';
if ($indexer
->has($validator)) {
$this->validator = $indexer
->get($validator);
}
$submit_handler = $form_id . '_submit';
if ($indexer
->has($submit_handler)) {
$this->submitHandler = $indexer
->get($submit_handler);
}
$this->isConfig = $this->builder
->has(Filter::isFunctionCall('system_settings_form'));
$this->formStateRewriter = $rewriter;
}
public function render() {
if (empty($this->controller)) {
$render = [
'#theme' => 'dmu_form',
'#module' => $this->target
->id(),
'#form_id' => $this->formID,
'#class' => $this
->toTitleCase($this->formID),
'#config' => $this->isConfig,
];
$source = \Drupal::service('renderer')
->renderPlain($render);
$this->controller = Parser::parseSource($source)
->find(Filter::isClass($render['#class']))
->get(0);
}
return $this->controller;
}
public function build() {
$controller = $this
->render();
$builder = $this
->addMethod($this->builder, $controller, 'buildForm');
if ($this->isConfig) {
$builder
->find(Filter::isFunctionCall('system_settings_form'))
->each(function (FunctionCallNode $call) {
$call
->setName('parent::buildForm')
->appendArgument(Token::variable('$form_state'));
});
}
if ($this->validator) {
$this
->addMethod($this->validator, $controller, 'validateForm')
->getParameterAtIndex(0)
->setReference(TRUE)
->setTypeHint('array');
}
if ($this->submitHandler) {
$this
->addMethod($this->submitHandler, $controller, $this->isConfig ? '_submitForm' : 'submitForm')
->getParameterAtIndex(0)
->setReference(TRUE)
->setTypeHint('array');
}
return $controller;
}
protected function addMethod(FunctionDeclarationNode $function, ClassNode $class, $alias = NULL) {
$method = ClassMethodNode::fromFunction($function);
if ($alias) {
$method
->setName($alias);
}
$class
->appendMethod($method);
$parameters = $method
->getParameters()
->toArray();
if (empty($parameters)) {
$parameters[0] = ParameterNode::create('$form');
$method
->appendParameter($parameters[0]);
}
if (sizeof($parameters) == 1) {
$parameters[1] = ParameterNode::create('$form_state');
$method
->appendParameter($parameters[1]);
}
$parameters[0]
->setTypeHint('array');
$parameters[1]
->setReference(FALSE);
for ($i = 2; $i < sizeof($parameters); $i++) {
$parameters[$i]
->setValue(new TokenNode(T_STRING, 'NULL'));
}
$this->formStateRewriter
->rewrite($parameters[1]);
return $method;
}
}