#php #drupal
#php #drupal
Вопрос:
Я очень новичок в Drupal, и меня просят создать форму с кнопкой отправки и службой, которая отправляет запрос get в API со значениями из формы. API — это простой API, в котором пользователь может ввести страну, и он вернет ответ с правильным приветствием из этой страны.
Это мой файл маршрутизации:
hello_world.salutation:
path: '/hello'
defaults:
_controller: Drupalhello_worldControllerHelloWorldSalutation::salutation
_form: Drupalhello_worldFormGreetingForm
_title: 'Get a greeting from a different language'
requirements:
_permission: 'administer site configuration'
Первая проблема заключается в том, что я не знаю, как создать форму и контроллер в одном и том же маршруте,
а во-вторых, я не знаю, как вызвать эту службу, когда пользователь ввел submit.
Вот мой файл служб:
services:
hello_world.salutation:
class: Drupalhello_worldHelloWorldSalutation
arguments: [ '@config.factory' ,'@tempstore.private']
cache.nameofbin:
class: DrupalCoreCacheCacheBackendInterface
tags:
- { name: cache.bin }
factory: [ '@cache_factory', 'get' ]
arguments: [ nameofbin ]
Я пропущу некоторые строки из класса GreetingFrom, чтобы упростить его, но я могу добавить их, если это необходимо.
Вот функция submitForm из класса GreetingForm . Идея состоит в том, чтобы поместить входные данные в глобальное временное хранилище, чтобы я мог получить доступ к значениям из контроллера, я думаю.
public function submitForm(array amp;$form, FormStateInterface $form_state)
{
$search_str = $form_state->getValue('greeting');
// check the input
$params['items'] = $form_state->getValue('greeting');
// 2. Create a PrivateTempStore object with the collection 'greetingForm_values'.
$tempstore = $this->tempStoreFactory->get('greetingForm_values');
// 3. Store the $params array with the key 'params'.
try {
$tempstore->set('params', $params);
} catch (Exception $error) {
// dump the error for now, read error, --fix this!
dpm($error);
}
}
И функция приветствия из контроллера выглядит так:
public function salutation()
{
$tempstore = $this->tempStoreFactory->get('greetingForm_values');
$params = $tempstore->get('params'); // this value should come from the search form
return [
'#markup' => $this->salutation->getGreeting($params),
];
}
Любая помощь приветствуется, и, пожалуйста, запросите дополнительную информацию, если она необходима.
Ответ №1:
Файл маршрутизации
В вашем случае использования, я полагаю, вы можете придерживаться использования формы. Пожалуйста, удалите спецификацию контроллера из вашего hello_world.salutation
маршрута, потому что это должно быть или _form
или _controller
, а не оба для одного маршрута.
Вызов метода службы
Для вашего определения службы вы можете сделать это, либо статически вызвав службу как:
$salutation_service = Drupal::service('hello_world.salutation');
$salutation_service->somePublicMethodCall();
или через внедрение зависимостей, которое, я полагаю, вы уже делаете, когда я смотрю this->salutation->getGreeting($params)
?
Контроллер формы x
Из предоставленных сведений я не могу точно сказать, зачем вам нужен контроллер, но если вам нужно перенаправить на контроллер, вы можете создать отдельный маршрут для своего HelloWorldSalutation::salutation()
метода и перенаправить на него с GreetingForm ::submitForm()
помощью $form_state
объекта:
$url = DrupalCoreUrl::fromRoute('hello_world.salutation');
$form_state->setRedirectUrl($url);