X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Fdrupalmoduleupgrader%2Fsrc%2FUtility%2FFormConverter.php;fp=web%2Fmodules%2Fcontrib%2Fdrupalmoduleupgrader%2Fsrc%2FUtility%2FFormConverter.php;h=9baf2accf2546c8304b50af26d921ade6621b71e;hp=0000000000000000000000000000000000000000;hb=8acec36f19c470dfcda1ae2336826a782f41874c;hpb=e0411c4e83ba0d079034db83c3f7f55be24a0e35 diff --git a/web/modules/contrib/drupalmoduleupgrader/src/Utility/FormConverter.php b/web/modules/contrib/drupalmoduleupgrader/src/Utility/FormConverter.php new file mode 100644 index 000000000..9baf2accf --- /dev/null +++ b/web/modules/contrib/drupalmoduleupgrader/src/Utility/FormConverter.php @@ -0,0 +1,178 @@ +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; + } + + /** + * @return \Pharborist\Objects\ClassNode + */ + 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; + } + + /** + * @return \Pharborist\Objects\ClassNode + */ + 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; + } + + /** + * @return \Pharborist\Objects\ClassMethodNode + */ + protected function addMethod(FunctionDeclarationNode $function, ClassNode $class, $alias = NULL) { + $method = ClassMethodNode::fromFunction($function); + if ($alias) { + $method->setName($alias); + } + $class->appendMethod($method); + + // Add the parameters required for FormInterface conformance. + $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]); + } + + // The $form parameter must have the array type hint. + $parameters[0]->setTypeHint('array'); + + // The form state is never passed by reference. + $parameters[1]->setReference(FALSE); + + // Additional parameters MUST have a default value of NULL in order to conform + // to FormInterface. + for ($i = 2; $i < sizeof($parameters); $i++) { + $parameters[$i]->setValue(new TokenNode(T_STRING, 'NULL')); + } + + $this->formStateRewriter->rewrite($parameters[1]); + + return $method; + } + +}