View source
<?php
namespace Drupal\http_client_manager\Form;
use Drupal\Core\Entity\EntityForm;
use Drupal\Core\Form\FormStateInterface;
use Drupal\http_client_manager\HttpClientManagerFactoryInterface;
use Drupal\http_client_manager\HttpServiceApiHandlerInterface;
use Guzzle\Service\Description\Parameter;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class HttpConfigRequestForm extends EntityForm {
protected $request;
protected $httpServicesApi;
protected $httpClientFactory;
public function __construct(RequestStack $requestStack, HttpServiceApiHandlerInterface $http_services_api, HttpClientManagerFactoryInterface $http_client_manager_factory) {
$this->request = $requestStack
->getCurrentRequest();
$this->httpServicesApi = $http_services_api;
$this->httpClientFactory = $http_client_manager_factory;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('request_stack'), $container
->get('http_client_manager.http_services_api'), $container
->get('http_client_manager.factory'));
}
public function form(array $form, FormStateInterface $form_state) {
$form = parent::form($form, $form_state);
$serviceApi = $this->request
->get('serviceApi');
$commandName = $this->request
->get('commandName');
$http_config_request = $this->entity;
$form['label'] = array(
'#type' => 'textfield',
'#title' => $this
->t('Label'),
'#maxlength' => 255,
'#default_value' => $http_config_request
->label(),
'#description' => $this
->t("Label for the Http Config Request."),
'#required' => TRUE,
);
$form['id'] = array(
'#type' => 'machine_name',
'#default_value' => $http_config_request
->id(),
'#machine_name' => array(
'exists' => '\\Drupal\\http_client_manager\\Entity\\HttpConfigRequest::load',
),
'#disabled' => !$http_config_request
->isNew(),
);
$form['service_api'] = [
'#type' => 'value',
'#value' => $serviceApi,
];
$form['command_name'] = [
'#type' => 'value',
'#value' => $commandName,
];
$form['parameters'] = [
'#type' => 'fieldset',
'#title' => $this
->t('parameters'),
'#tree' => TRUE,
];
$client = $this->httpClientFactory
->get($serviceApi);
$parameters = $http_config_request
->get('parameters');
foreach ($client
->getCommand($commandName)
->getParams() as $param) {
$name = $param
->getName();
$form['parameters'][$name] = [
'#command_param' => $param,
'#title' => $this
->t($name),
'#type' => 'textarea',
'#rows' => 1,
'#required' => $param
->getRequired(),
'#default_value' => $parameters[$name] ? $parameters[$name] : $param
->getDefault(),
'#description' => $param
->getDescription() ? $this
->t($param
->getDescription()) : '',
];
switch ($param
->getType()) {
case 'integer':
$form['parameters'][$name]['#type'] = 'number';
$form['parameters'][$name]['#value_callback'] = [
$this,
'integerValue',
];
break;
case 'array':
$form['parameters'][$name]['#type'] = 'textarea';
$form['parameters'][$name]['#rows'] = 3;
$placeholder = $this
->t('Enter a list of values (one value per row).');
$form['parameters'][$name]['#attributes']['placeholder'] = $placeholder;
$form['parameters'][$name]['#value_callback'] = [
$this,
'arrayValue',
];
break;
}
}
$form['token_help'] = array(
'#theme' => 'token_tree_link',
);
return $form;
}
public function integerValue(&$element, $input, FormStateInterface $form_state) {
if ($input !== FALSE && $input !== NULL) {
return (int) $input;
}
return NULL;
}
public function arrayValue(&$element, $input, FormStateInterface $form_state) {
if ($input !== FALSE && $input !== NULL) {
$input = trim($input);
if (empty($input)) {
return [];
}
$value_callback = $this
->getValueCallback($element['#command_param']);
$items = explode("\n", $input);
foreach ($items as &$item) {
$item = trim($item);
if ($value_callback) {
$item = $this
->{$value_callback}($element, $item, $form_state);
}
}
return $items;
}
return !empty($element['#default_value']) ? implode("\n", $element['#default_value']) : NULL;
}
protected function getValueCallback(Parameter $param) {
$callback = $param
->getItems()
->getType() . 'Value';
return method_exists($this, $callback) ? $callback : FALSE;
}
public function save(array $form, FormStateInterface $form_state) {
$http_config_request = $this->entity;
$status = $http_config_request
->save();
switch ($status) {
case SAVED_NEW:
drupal_set_message($this
->t('Created the %label Http Config Request.', [
'%label' => $http_config_request
->label(),
]));
break;
default:
drupal_set_message($this
->t('Saved the %label Http Config Request.', [
'%label' => $http_config_request
->label(),
]));
}
$form_state
->setRedirectUrl($http_config_request
->toUrl('collection'));
}
}