Problem/Motivation
Hello project maintainers,
I got warnings in the logs.
Warning: Undefined array key "element" in template_preprocess_input() (line 345 of /var/www/docroot/core/includes/form.inc)
#0 /var/www/docroot/core/includes/bootstrap.inc(164): _drupal_error_handler_real(2, 'Undefined array...', '/var/www/docroo...', 345)
#1 /var/www/docroot/core/includes/form.inc(345): _drupal_error_handler(2, 'Undefined array...', '/var/www/docroo...', 345)
#2 [internal function]: template_preprocess_input(Array, 'input__tree', Array)
Warning: Trying to access array offset on value of type null in template_preprocess_input() (line 350 of /var/www/docroot/core/includes/form.inc)
#0 /var/www/docroot/core/includes/bootstrap.inc(164): _drupal_error_handler_real(2, 'Trying to acces...', '/var/www/docroo...', 350)
#1 /var/www/docroot/core/includes/form.inc(350): _drupal_error_handler(2, 'Trying to acces...', '/var/www/docroo...', 350)
#2 [internal function]: template_preprocess_input(Array, 'input__tree', Array)
and next one (related to the previos one).
I did investifate it and see that it happens in form.inc (core/includes/form.inc)
function template_preprocess_input(&$variables) {
$element = $variables['element'];
// Remove name attribute if empty, for W3C compliance.
if (isset($variables['attributes']['name']) && empty((string) $variables['attributes']['name'])) {
unset($variables['attributes']['name']);
}
$variables['children'] = $element['#children'];
}
It happens because array keys 'element' and '#children' wasnt created.
Steps to reproduce
Core version 10.2.7
PHP 8.1.14
Web Apache/2.4.53 (Unix) OpenSSL/1.1.1n
1. Enable warnings visible (by default it enabled).
2. Install module. Version 1.0.0 or 1.0.1.
3. Copy template input--tree.html.twig to the theme and add changes (in my case I added title attr into 'label' + added trim for long menu item title)
5. Open node create/edit form.
5. Check internal drupal logs.
Proposed resolution
I can fix it via hard way and patch form.inc file
like this one
function template_preprocess_input(&$variables) {
$element = $variables['element'] ?? [];
// Remove name attribute if empty, for W3C compliance.
if (isset($variables['attributes']['name']) && empty((string) $variables['attributes']['name'])) {
unset($variables['attributes']['name']);
}
$variables['children'] = $element['#children'] ?? [];
}
But seems need to find the way to fix in on module level.
Second way
Change menu_tree_theme function from
function menu_tree_theme($existing, $type, $theme, $path) {
$module_path = \Drupal::service('extension.list.module')->getPath('menu_tree');
return [
'input__tree' => [
'variables' => [
'id' => NULL,
'menus' => NULL,
'exclude' => NULL,
],
'template' => 'input--tree',
'path' => $module_path . '/templates',
],
];
}
to
function menu_tree_theme($existing, $type, $theme, $path) {
$module_path = \Drupal::service('extension.list.module')->getPath('menu_tree');
return [
'input__tree' => [
'variables' => [
'id' => NULL,
'menus' => NULL,
'exclude' => NULL,
'element' => [
'#children' => [],
],
],
'template' => 'input--tree',
'path' => $module_path . '/templates',
],
];
}
In shoer, I added missed default variables into theme hook.
Any ideas are welcome. Thanks!