diff --git a/phpBB/adm/style/acp_attachments.html b/phpBB/adm/style/acp_attachments.html
index 77a89ff571..78d937b967 100644
--- a/phpBB/adm/style/acp_attachments.html
+++ b/phpBB/adm/style/acp_attachments.html
@@ -51,15 +51,8 @@
{options.TITLE_EXPLAIN}
-
- {% if options.CONTENT.tag %}
- {% if options.CONTENT.tag == 'input' %}
- {{ form_macros.input(options.CONTENT) }}
- {% elseif options.CONTENT.tag == 'dimension' %}
- {{ form_macros.dimension(options.CONTENT) }}
- {% elseif options.CONTENT.tag == 'radio' %}
- {{ form_macros.radio_buttons(options.CONTENT) }}
- {% endif %}
- {% if options.CONTENT.append %}{{ options.CONTENT.append }}{% endif %}
+ {% if options.CONTENT is iterable %}
+ {{ form_macros.build_template(options.CONTENT)}}
{% else %}
{options.CONTENT}
{% endif %}
diff --git a/phpBB/adm/style/acp_board.html b/phpBB/adm/style/acp_board.html
index 3cc5d2dea2..8d539de10c 100644
--- a/phpBB/adm/style/acp_board.html
+++ b/phpBB/adm/style/acp_board.html
@@ -29,15 +29,8 @@
{options.TITLE_EXPLAIN}
-
- {% if options.CONTENT.tag %}
- {% if options.CONTENT.tag == 'input' %}
- {{ form_macros.input(options.CONTENT) }}
- {% elseif options.CONTENT.tag == 'dimension' %}
- {{ form_macros.dimension(options.CONTENT) }}
- {% elseif options.CONTENT.tag == 'radio' %}
- {{ form_macros.radio_buttons(options.CONTENT) }}
- {% endif %}
- {% if options.CONTENT.append %}{{ options.CONTENT.append }}{% endif %}
+ {% if options.CONTENT is iterable %}
+ {{ form_macros.build_template(options.CONTENT)}}
{% else %}
{{ options.CONTENT }}
{% endif %}
diff --git a/phpBB/adm/style/acp_bots.html b/phpBB/adm/style/acp_bots.html
index 603d7c0ab0..94103e0ec9 100644
--- a/phpBB/adm/style/acp_bots.html
+++ b/phpBB/adm/style/acp_bots.html
@@ -30,13 +30,10 @@
-
{L_BOT_LANG_EXPLAIN}
+
{L_BOT_LANG_EXPLAIN}
-
-
+ {% import "form_macros.twig" as form_macros %}
+ {{ form_macros.select(LANG_OPTIONS) }}
diff --git a/phpBB/adm/style/acp_users_prefs.html b/phpBB/adm/style/acp_users_prefs.html
index cdac6891e5..0cf21e19a6 100644
--- a/phpBB/adm/style/acp_users_prefs.html
+++ b/phpBB/adm/style/acp_users_prefs.html
@@ -41,13 +41,10 @@
-
+
-
-
+ {% import "form_macros.twig" as form_macros %}
+ {{ form_macros.select(LANG_OPTIONS) }}
diff --git a/phpBB/adm/style/form_macros.twig b/phpBB/adm/style/form_macros.twig
index 847b8b5f07..0937a10b4b 100644
--- a/phpBB/adm/style/form_macros.twig
+++ b/phpBB/adm/style/form_macros.twig
@@ -33,3 +33,26 @@
{% endmacro %}
+
+{% macro select(form_data) %}
+
+{% endmacro %}
+
+{% macro build_template(form_data) %}
+ {% if form_data.tag == 'input' %}
+ {{ _self.input(form_data) }}
+ {% elseif form_data.tag == 'dimension' %}
+ {{ _self.dimension(form_data) }}
+ {% elseif form_data.tag == 'radio' %}
+ {{ _self.radio_buttons(form_data) }}
+ {% elseif form_data[0] %}
+ {% for element in form_data %}
+ {{ _self.build_template(element) }}
+ {% endfor %}
+ {% endif %}
+ {% if form_data.append %}{{ form_data.append }}{% endif %}
+{% endmacro %}
diff --git a/phpBB/includes/acp/acp_bots.php b/phpBB/includes/acp/acp_bots.php
index 8c296e180a..323dd1baee 100644
--- a/phpBB/includes/acp/acp_bots.php
+++ b/phpBB/includes/acp/acp_bots.php
@@ -330,7 +330,7 @@ class acp_bots
}
$style_select = style_select($bot_row['bot_style'], true);
- phpbb_language_select($db, $template, $bot_row['bot_lang']);
+ $lang_options = phpbb_language_select($db, $bot_row['bot_lang']);
$l_title = ($action == 'edit') ? 'EDIT' : 'ADD';
@@ -347,9 +347,13 @@ class acp_bots
'S_EDIT_BOT' => true,
'S_ACTIVE_OPTIONS' => $s_active_options,
'S_STYLE_OPTIONS' => $style_select,
+ 'LANG_OPTIONS' => [
+ 'id' => 'bot_lang',
+ 'name' => 'bot_lang',
+ 'options' => $lang_options,
+ ],
'S_ERROR' => (count($error)) ? true : false,
- )
- );
+ ));
return;
diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php
index d75b866bd5..9aa3333e77 100644
--- a/phpBB/includes/acp/acp_users.php
+++ b/phpBB/includes/acp/acp_users.php
@@ -1796,7 +1796,7 @@ class acp_users
}
phpbb_timezone_select($template, $user, $data['tz'], true);
- phpbb_language_select($db, $template, $data['lang']);
+ $lang_options = phpbb_language_select($db, $data['lang']);
$user_prefs_data = array(
'S_PREFS' => true,
@@ -1833,6 +1833,11 @@ class acp_users
'DEFAULT_DATEFORMAT' => $config['default_dateformat'],
'A_DEFAULT_DATEFORMAT' => addslashes($config['default_dateformat']),
+ 'LANG_OPTIONS' => [
+ 'id' => 'lang',
+ 'name' => 'lang',
+ 'options' => $lang_options,
+ ],
'S_STYLE_OPTIONS' => style_select($data['style']),
);
diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php
index 48ac572295..ae8b978c69 100644
--- a/phpBB/includes/functions.php
+++ b/phpBB/includes/functions.php
@@ -270,7 +270,7 @@ function phpbb_version_compare(string $version1, string $version2, string $opera
* @param string $default Language ISO code to be selected by default in the dropdown list
* @param array $langdata Language data in format of array(array('lang_iso' => string, lang_local_name => string), ...)
*/
-function phpbb_language_select(\phpbb\db\driver\driver_interface $db, \phpbb\template\template $template, string $default = '', array $langdata = []): void
+function phpbb_language_select(\phpbb\db\driver\driver_interface $db, string $default = '', array $langdata = []): array
{
if (empty($langdata))
{
@@ -282,14 +282,17 @@ function phpbb_language_select(\phpbb\db\driver\driver_interface $db, \phpbb\tem
$db->sql_freeresult($result);
}
+ $lang_options = [];
foreach ($langdata as $row)
{
- $template->assign_block_vars('lang_options', [
- 'SELECTED' => $row['lang_iso'] == $default,
- 'LANG_ISO' => $row['lang_iso'],
- 'LANG_LOCAL_NAME' => $row['lang_local_name']
- ]);
+ $lang_options[] = [
+ 'value' => $row['lang_iso'],
+ 'label' => $row['lang_local_name'],
+ 'selected' => $row['lang_iso'] === $default,
+ ];
}
+
+ return $lang_options;
}
/**
diff --git a/phpBB/includes/ucp/ucp_prefs.php b/phpBB/includes/ucp/ucp_prefs.php
index 9a51cc65b2..625ade741c 100644
--- a/phpBB/includes/ucp/ucp_prefs.php
+++ b/phpBB/includes/ucp/ucp_prefs.php
@@ -177,7 +177,7 @@ class ucp_prefs
$db->sql_freeresult($result);
$s_more_styles = count($styles_row) > 1;
- phpbb_language_select($db, $template, $data['lang'], $lang_row);
+ $lang_options = phpbb_language_select($db, $data['lang'], $lang_row);
$template->assign_vars(array(
'ERROR' => (count($error)) ? implode('
', $error) : '',
@@ -200,6 +200,11 @@ class ucp_prefs
'S_MORE_LANGUAGES' => $s_more_languages,
'S_MORE_STYLES' => $s_more_styles,
+ 'LANG_OPTIONS' => [
+ 'id' => 'lang',
+ 'name' => 'lang',
+ 'options' => $lang_options,
+ ],
'S_STYLE_OPTIONS' => ($config['override_user_style']) ? '' : style_select($data['user_style'], false, $styles_row),
'S_CAN_HIDE_ONLINE' => ($auth->acl_get('u_hideonline')) ? true : false,
'S_SELECT_NOTIFY' => ($config['jab_enable'] && $user->data['user_jabber'] && @extension_loaded('xml')) ? true : false)
diff --git a/phpBB/includes/ucp/ucp_register.php b/phpBB/includes/ucp/ucp_register.php
index 9601582f51..bdece67890 100644
--- a/phpBB/includes/ucp/ucp_register.php
+++ b/phpBB/includes/ucp/ucp_register.php
@@ -157,7 +157,7 @@ class ucp_register
$lang_row = (array) $db->sql_fetchrowset($result);
$db->sql_freeresult($result);
- phpbb_language_select($db, $template, $user_lang, $lang_row);
+ $lang_options = phpbb_language_select($db, $user_lang, $lang_row);
if ($coppa === false && $config['coppa_enable'])
{
@@ -169,6 +169,11 @@ class ucp_register
unset($now);
$template_vars = array(
+ 'LANG_OPTIONS' => [
+ 'id' => 'lang',
+ 'name' => 'lang',
+ 'options' => $lang_options,
+ ],
'L_COPPA_NO' => $user->lang('UCP_COPPA_BEFORE', $coppa_birthday),
'L_COPPA_YES' => $user->lang('UCP_COPPA_ON_AFTER', $coppa_birthday),
@@ -183,6 +188,11 @@ class ucp_register
else
{
$template_vars = array(
+ 'LANG_OPTIONS' => [
+ 'id' => 'lang',
+ 'name' => 'lang',
+ 'options' => $lang_options,
+ ],
'L_TERMS_OF_USE' => sprintf($user->lang['TERMS_OF_USE_CONTENT'], $config['sitename'], generate_board_url()),
'S_SHOW_COPPA' => false,
@@ -626,7 +636,7 @@ class ucp_register
$lang_row = (array) $db->sql_fetchrowset($result);
$db->sql_freeresult($result);
- phpbb_language_select($db, $template, $data['lang'], $lang_row);
+ $lang_options = phpbb_language_select($db, $data['lang'], $lang_row);
$template_vars = array(
'USERNAME' => $data['username'],
@@ -638,6 +648,11 @@ class ucp_register
'L_USERNAME_EXPLAIN' => $user->lang($config['allow_name_chars'] . '_EXPLAIN', $user->lang('CHARACTERS', (int) $config['min_name_chars']), $user->lang('CHARACTERS', (int) $config['max_name_chars'])),
'L_PASSWORD_EXPLAIN' => $user->lang($config['pass_complex'] . '_EXPLAIN', $user->lang('CHARACTERS', (int) $config['min_pass_chars'])),
+ 'LANG_OPTIONS' => [
+ 'id' => 'lang',
+ 'name' => 'lang',
+ 'options' => $lang_options,
+ ],
'S_TZ_PRESELECT' => !$submit,
'S_CONFIRM_REFRESH' => ($config['enable_confirm'] && $config['confirm_refresh']) ? true : false,
'S_REGISTRATION' => true,
diff --git a/phpBB/phpbb/message/topic_form.php b/phpBB/phpbb/message/topic_form.php
index befc9791dc..e8344417ef 100644
--- a/phpBB/phpbb/message/topic_form.php
+++ b/phpBB/phpbb/message/topic_form.php
@@ -154,11 +154,16 @@ class topic_form extends form
$this->user->add_lang('viewtopic');
- phpbb_language_select($this->db, $template, $this->recipient_lang);
+ $lang_options = phpbb_language_select($this->db, $this->recipient_lang);
$template->assign_vars(array(
'EMAIL' => $this->recipient_address,
'NAME' => $this->recipient_name,
+ 'LANG_OPTIONS' => [
+ 'id' => 'lang',
+ 'name' => 'lang',
+ 'options' => $lang_options,
+ ],
'MESSAGE' => $this->body,
'L_EMAIL_BODY_EXPLAIN' => $this->user->lang['EMAIL_TOPIC_EXPLAIN'],
diff --git a/phpBB/styles/all/template/macros/form_macros.twig b/phpBB/styles/all/template/macros/form_macros.twig
new file mode 100644
index 0000000000..0937a10b4b
--- /dev/null
+++ b/phpBB/styles/all/template/macros/form_macros.twig
@@ -0,0 +1,58 @@
+{% macro input(form_data) %}
+
+{% endmacro %}
+
+{% macro dimension(form_data) %}
+ {{ _self.input(form_data.width) }} x {{ _self.input(form_data.height) }}
+{% endmacro %}
+
+{% macro textarea(form_data) %}
+
+{% endmacro %}
+
+{% macro radio_buttons(form_data) %}
+
+
+{% endmacro %}
+
+{% macro select(form_data) %}
+
+{% endmacro %}
+
+{% macro build_template(form_data) %}
+ {% if form_data.tag == 'input' %}
+ {{ _self.input(form_data) }}
+ {% elseif form_data.tag == 'dimension' %}
+ {{ _self.dimension(form_data) }}
+ {% elseif form_data.tag == 'radio' %}
+ {{ _self.radio_buttons(form_data) }}
+ {% elseif form_data[0] %}
+ {% for element in form_data %}
+ {{ _self.build_template(element) }}
+ {% endfor %}
+ {% endif %}
+ {% if form_data.append %}{{ form_data.append }}{% endif %}
+{% endmacro %}
diff --git a/phpBB/styles/prosilver/template/ucp_agreement.html b/phpBB/styles/prosilver/template/ucp_agreement.html
index 5891bbe60e..69458e198a 100644
--- a/phpBB/styles/prosilver/template/ucp_agreement.html
+++ b/phpBB/styles/prosilver/template/ucp_agreement.html
@@ -2,15 +2,12 @@
-{% if lang_options|length > 0 %}
+{% if LANG_OPTIONS %}
@@ -21,7 +18,7 @@
/**
* Change language on change
*/
- document.querySelector('#lang').addEventListener('change', (event) => {
+ document.querySelector("{{ '#' ~ LANG_OPTIONS.id }}").addEventListener('change', (event) => {
const langIso = event.target.value;
document.cookie = '{{ COOKIE_NAME }}_lang=' + langIso + '; path={{ COOKIE_PATH }}';
document.forms['register'].change_lang.value = langIso;
diff --git a/phpBB/styles/prosilver/template/ucp_prefs_personal.html b/phpBB/styles/prosilver/template/ucp_prefs_personal.html
index 120c9b146c..2c5ff918e5 100644
--- a/phpBB/styles/prosilver/template/ucp_prefs_personal.html
+++ b/phpBB/styles/prosilver/template/ucp_prefs_personal.html
@@ -52,13 +52,10 @@
-
+
-
-
+ {% import "macros/form_macros.twig" as form_macros %}
+ {{ form_macros.select(LANG_OPTIONS) }}
diff --git a/phpBB/styles/prosilver/template/ucp_register.html b/phpBB/styles/prosilver/template/ucp_register.html
index 1b92ad7c15..ad45812ab0 100644
--- a/phpBB/styles/prosilver/template/ucp_register.html
+++ b/phpBB/styles/prosilver/template/ucp_register.html
@@ -57,17 +57,23 @@
- {% if lang_options|length > 0 %}
+ {% if LANG_OPTIONS %}
-
+
-
-
+ {% import "macros/form_macros.twig" as form_macros %}
+ {{ form_macros.select(LANG_OPTIONS) }}
+
{% endif %}
diff --git a/tests/functions/language_select_test.php b/tests/functions/language_select_test.php
index e41a42c6b6..5445866fd8 100644
--- a/tests/functions/language_select_test.php
+++ b/tests/functions/language_select_test.php
@@ -25,14 +25,14 @@ class phpbb_functions_language_select_test extends phpbb_database_test_case
'',
[
[
- 'SELECTED' => false,
- 'LANG_ISO' => 'cs',
- 'LANG_LOCAL_NAME' => 'Čeština',
+ 'selected' => false,
+ 'value' => 'cs',
+ 'label' => 'Čeština',
],
[
- 'SELECTED' => false,
- 'LANG_ISO' => 'en',
- 'LANG_LOCAL_NAME' => 'English',
+ 'selected' => false,
+ 'value' => 'en',
+ 'label' => 'English',
],
]
],
@@ -40,14 +40,14 @@ class phpbb_functions_language_select_test extends phpbb_database_test_case
'en',
[
[
- 'SELECTED' => false,
- 'LANG_ISO' => 'cs',
- 'LANG_LOCAL_NAME' => 'Čeština',
+ 'selected' => false,
+ 'value' => 'cs',
+ 'label' => 'Čeština',
],
[
- 'SELECTED' => true,
- 'LANG_ISO' => 'en',
- 'LANG_LOCAL_NAME' => 'English',
+ 'selected' => true,
+ 'value' => 'en',
+ 'label' => 'English',
],
]
],
@@ -55,14 +55,14 @@ class phpbb_functions_language_select_test extends phpbb_database_test_case
'cs',
[
[
- 'SELECTED' => true,
- 'LANG_ISO' => 'cs',
- 'LANG_LOCAL_NAME' => 'Čeština',
+ 'selected' => true,
+ 'value' => 'cs',
+ 'label' => 'Čeština',
],
[
- 'SELECTED' => false,
- 'LANG_ISO' => 'en',
- 'LANG_LOCAL_NAME' => 'English',
+ 'selected' => false,
+ 'value' => 'en',
+ 'label' => 'English',
],
]
],
@@ -70,14 +70,14 @@ class phpbb_functions_language_select_test extends phpbb_database_test_case
'de',
[
[
- 'SELECTED' => false,
- 'LANG_ISO' => 'cs',
- 'LANG_LOCAL_NAME' => 'Čeština',
+ 'selected' => false,
+ 'value' => 'cs',
+ 'label' => 'Čeština',
],
[
- 'SELECTED' => false,
- 'LANG_ISO' => 'en',
- 'LANG_LOCAL_NAME' => 'English',
+ 'selected' => false,
+ 'value' => 'en',
+ 'label' => 'English',
],
]
],
@@ -91,19 +91,9 @@ class phpbb_functions_language_select_test extends phpbb_database_test_case
{
global $db;
$db = $this->new_dbal();
- $template = $this->getMockBuilder('\phpbb\template\base')
- ->disableOriginalConstructor()
- ->getMock();
- $template_data = [];
- $template->expects($this->any())
- ->method('assign_block_vars')
- ->willReturnCallback(function ($blockname, array $vararray) use (&$template_data) {
- $template_data[$blockname][] = $vararray;
- return null;
- });
- phpbb_language_select($db, $template, $default);
+ $lang_options = phpbb_language_select($db, $default);
- $this->assertEquals($expected, $template_data['lang_options']);
+ $this->assertEquals($expected, $lang_options);
}
}