Problem/Motivation
With Config Enforce Devel installed, some forms with Ajax behaviours silently fail when interacted with. Upon checking the database log, fatal errors can be found. Reproducible examples include:
- Entity field view display (e.g.
admin/structure/types/manage/page/display
for page nodes)
- Entity field form display (e.g.
admin/structure/types/manage/page/form-display
for page nodes)
- Paragraphs add/edit buttons on node edit forms (and likely on any entity edit form paragraphs are on)
Steps to reproduce
- Install using Standard profile
- Go to
admin/structure/types/manage/page/display
- Try changing the Body format to something else, e.g. from "Default" to "Summary or trimmed".
- Notice that the spinner and Ajax request never finishes. Checking the browser console should show an Ajax error. Checking the site's database log, an error similar to this should be found:
Location https://generic-drupal-test.local/admin/structure/types/manage/page/display?_wrapper_format=drupal_ajax&ajax_form=1
Referrer https://generic-drupal-test.local/admin/structure/types/manage/page/display
Error: Unknown named parameter $form_id in call_user_func_array() (line 531 of E:\Web\Drupal\generic_test_site\web\core\lib\Drupal\Core\Form\FormBuilder.php)
#0 E:\Web\Drupal\generic_test_site\web\core\lib\Drupal\Core\Form\FormBuilder.php(531): call_user_func_array(Array, Array)
#1 E:\Web\Drupal\generic_test_site\web\core\lib\Drupal\Core\Form\FormBuilder.php(370): Drupal\Core\Form\FormBuilder->retrieveForm('entity_view_dis...', Object(Drupal\Core\Form\FormState))
#2 E:\Web\Drupal\generic_test_site\web\core\lib\Drupal\Core\Form\FormBuilder.php(628): Drupal\Core\Form\FormBuilder->rebuildForm('entity_view_dis...', Object(Drupal\Core\Form\FormState), Array)
#3 E:\Web\Drupal\generic_test_site\web\core\lib\Drupal\Core\Form\FormBuilder.php(320): Drupal\Core\Form\FormBuilder->processForm('entity_view_dis...', Array, Object(Drupal\Core\Form\FormState))
#4 E:\Web\Drupal\generic_test_site\web\core\lib\Drupal\Core\Controller\FormController.php(73): Drupal\Core\Form\FormBuilder->buildForm(Object(Drupal\field_ui\Form\EntityViewDisplayEditForm), Object(Drupal\Core\Form\FormState))
#5 [internal function]: Drupal\Core\Controller\FormController->getContentResult(Object(Symfony\Component\HttpFoundation\Request), Object(Drupal\Core\Routing\RouteMatch))
#6 E:\Web\Drupal\generic_test_site\web\core\lib\Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber.php(123): call_user_func_array(Array, Array)
#7 E:\Web\Drupal\generic_test_site\web\core\lib\Drupal\Core\Render\Renderer.php(564): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}()
#8 E:\Web\Drupal\generic_test_site\web\core\lib\Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber.php(124): Drupal\Core\Render\Renderer->executeInRenderContext(Object(Drupal\Core\Render\RenderContext), Object(Closure))
#9 E:\Web\Drupal\generic_test_site\web\core\lib\Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber.php(97): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext(Array, Array)
#10 E:\Web\Drupal\generic_test_site\vendor\symfony\http-kernel\HttpKernel.php(158): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}()
#11 E:\Web\Drupal\generic_test_site\vendor\symfony\http-kernel\HttpKernel.php(80): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
#12 E:\Web\Drupal\generic_test_site\web\core\lib\Drupal\Core\StackMiddleware\Session.php(58): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#13 E:\Web\Drupal\generic_test_site\web\core\lib\Drupal\Core\StackMiddleware\KernelPreHandle.php(48): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#14 E:\Web\Drupal\generic_test_site\web\core\modules\page_cache\src\StackMiddleware\PageCache.php(106): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#15 E:\Web\Drupal\generic_test_site\web\core\modules\page_cache\src\StackMiddleware\PageCache.php(85): Drupal\page_cache\StackMiddleware\PageCache->pass(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#16 E:\Web\Drupal\generic_test_site\web\core\lib\Drupal\Core\StackMiddleware\ReverseProxyMiddleware.php(48): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#17 E:\Web\Drupal\generic_test_site\web\core\lib\Drupal\Core\StackMiddleware\NegotiationMiddleware.php(51): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#18 E:\Web\Drupal\generic_test_site\vendor\stack\builder\src\Stack\StackedHttpKernel.php(23): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#19 E:\Web\Drupal\generic_test_site\web\core\lib\Drupal\Core\DrupalKernel.php(702): Stack\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#20 E:\Web\Drupal\generic_test_site\web\index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))
#21 {main}
Proposed resolution
Ideally, try to find why the $form_id
parameter isn't being found, which ought to be the root cause of this. A short term bandaid can be to add the affected forms to the deny list so that they work correctly, but will make enforcing those configs a bit more tedious for users.
Relevant form IDs to add to deny list:
entity_form_display_edit_form
entity_view_display_edit_form
- Node edit forms; this is trickier because there doesn't seem to be a single
node_edit_form
ID but an ID for each node type is generated, such as node_page_edit_form
for nodes of type page
from the Standard install profile for example.
Remaining tasks
See above.
User interface changes
Will remove the embedded enforce form for the above for the bandaid solution, until the root cause is fixed.
API changes
None?
Data model changes
None?