backdrop / backdrop-issues

Issue tracker for Backdrop core.
144 stars 40 forks source link

[D8][DX] FAPI: Allow easy sorting of the translated options of select elements #5824

Open klonos opened 2 years ago

klonos commented 2 years ago

This is effectively to implement the same feature that went into Drupal core v8.8.x with https://www.drupal.org/project/drupal/issues/3065903 (change record: Options sorting ability has been added to Select form element)

Consider this code:

$options = array(
  'something' => t('One thing'),
  'something_else' => t('Another thing'),
  'yet_another' => t('Yet another thing'),
);
asort($options); // Sort options here, before adding the "nothing" option as the first option.
$form['select_element'] = array(
  '#type' => 'select',
  '#title' => t('Select something'),
  '#options' => array(
    'none' => t('Nothing'),
  ) + $options,
);

This would result in a select element in the form, with its options listed alphabetically, but with the "nothing" option being first (intentionally not included in the sorting):

Now consider the translations of the options in Greek: "Nothing" → "Τίποτα" "Another thing" → "Κάτι άλλο" "One thing" → "Κάτι" "Yet another thing" → "Κάτι ακόμη"

Actual order (not alphabetical, because the sorting has happened in asort() for the English strings 👎🏼 ):

Expected order (properly alphabetical, in the translated language - not according to the source language):

How things should work ideally:

$options = array(
  'something' => t('One thing'),
  'something_else' => t('Another thing'),
  'yet_another' => t('Yet another thing'),
);
$form['select_element'] = array(
  '#type' => 'select',
  '#title' => t('Select something'),
  '#options' => array(
    'none' => t('Nothing'),
  ) + $options,
  '#sort_options' => TRUE, // Options are sorted, by their respective translated labels.
  '#sort_start' => 1, // Start sorting after the 1st option ("nothing"), which needs to remain at the top of the list.
);
klonos commented 2 years ago

Noting that there is this follow-up issue in d.o: https://www.drupal.org/project/drupal/issues/3069844. It is to add other useful functionality to select FAPI elements, such as '#sort_direction', '#sort_natural', '#sort_end', and '#sort_unique'. I believe that the direction one at the very least should be implemented, as it seems like a no-brainer.