Ты можешь использовать hook_entity_operation
чтобы добавить пользовательскую операцию сущности для отправки веб-форм. С Интеграция представлений веб-форм модуль, вы уже должны быть в состоянии добавить поле «Операции» в свое представление.В нем перечислены операции по умолчанию в зависимости от уровней доступа (Редактировать, Удалить и т. д.). Там появится ваша пользовательская операция.
МОЙ МОДУЛЬ.модуль
<?php
/**
* @файл
* Хуки реализованы модулем MYMODULE.
*/
используйте Drupal\Core\Entity\EntityInterface;
используйте Drupal\webform\WebformSubmissionInterface;
/**
* Реализует hook_entity_operation().
*/
функция MYMODULE_entity_operation (EntityInterface $submission) {
$операции = [];
if ($submission instanceof WebformSubmissionInterface) {
если ($submission->getElementData('MY_HIDDEN_REVIEW_ELEMENT') !== 'одобрено') {
$operations['одобрить'] = [
'название' => т('Утвердить'),
'вес' => 15,
'url' => Url::fromRoute('MYMODULE.webform_submission_approve', [
'представление' => $представление->id(),
], [
'запрос' => \Drupal::destination()->getAsArray(),
]),
];
}
}
вернуть $операции;
}
МОЙ МОДУЛЬ.routing.yml
МОЙ МОДУЛЬ.webform_submission_approve:
путь: '/admin/MYMODULE/submission/{submission}/approve'
значения по умолчанию:
_controller: '\Drupal\MYMODULE\Controller\WebformSubmissionApproveController::approve'
параметры:
параметры:
подчинение:
тип: 'сущность: webform_submission'
требования:
_custom_access: '\Drupal\MYMODULE\Controller\WebformSubmissionApproveController::access'
src/Контроллер/WebformSubmissionApproveController.php
<?php
пространство имен Drupal\MYMODULE\Controller;
используйте Drupal\Core\Access\AccessResult;
используйте Drupal\Core\Controller\ControllerBase;
используйте Drupal\webform\Entity\WebformSubmission;
используйте Symfony\Component\HttpFoundation\RedirectResponse;
используйте Symfony\Component\HttpFoundation\Request;
/**
* Класс WebformSubmissionApproveController.
*
* @пакет Drupal\MYMODULE\Контроллер
*/
class WebformSubmissionApproveController расширяет ControllerBase {
/**
* Утвердить метод.
*
* @param \Drupal\webform\Entity\WebformSubmission $submission
* Представление веб-формы.
* @param\Symfony\Component\HttpFoundation\Request $request
* Текущий HTTP-запрос.
*
* @return array|\Symfony\Component\HttpFoundation\RedirectResponse
* Ответ.
*
* @throws\Drupal\Core\Entity\EntityStorageException
*/
публичная функция одобряет (WebformSubmission $submission, Request $request) {
$submission->setElementData('MY_HIDDEN_REVIEW_ELEMENT', 'одобрено');
$представление->сохранить();
$this->messenger()->addMessage($this->t('Отправка @serial одобрена.', [
'@serial' => $submission->serial(),
]));
вернуть $request->query->get('destination') ? новый RedirectResponse($request->query->get('destination')) : [];
}
/**
* Проверяет доступ по конкретному запросу.
*
* @возврат \Drupal\Core\Access\AccessResult
* Результат доступа.
*
* @throws\Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws\Drupal\Component\Plugin\Exception\PluginNotFoundException
*/
доступ к общедоступной функции (WebformSubmission $submission) {
return AccessResult::allowedIf(!$submission->isDraft() && in_array('administrator', $this->currentUser()->getRoles()));
}
}