Elgg  Version master
select.php
Go to the documentation of this file.
1 <?php
25 $vars['class'] = elgg_extract_class($vars, ['elgg-input-select']);
26 
28  'disabled' => false,
29  'value' => '',
30 ];
31 
32 $vars = array_merge($defaults, $vars);
33 
35 
36 // turn options into options_values
37 $options = elgg_extract('options', $vars, []);
38 unset($vars['options']);
39 
40 foreach ($options as $option) {
41  if (is_array($option)) {
42  if (!isset($option['value'])) {
43  $option['value'] = elgg_extract('text', $option);
44  }
45  } else {
46  $option = [
47  'text' => $option,
48  'value' => $option,
49  ];
50  }
51 
52  $options_values[] = $option;
53 }
54 
55 // provided options_values trump options
57 unset($vars['options_values']);
58 
60  foreach ($options as $key => $option) {
61  if (!is_array($option)) {
62  $option = [
63  'text' => $option,
64  'value' => $key,
65  ];
66  }
67 
68  $optgroup = elgg_extract('options', $option);
69  if (is_array($optgroup)) {
70  $option['options'] = $normalize_options($optgroup);
71  }
72 
73  $options[$key] = $option;
74  }
75 
76  return $options;
77 };
78 
80 
81 $value = is_array($vars['value']) ? $vars['value'] : [$vars['value']];
82 $value = array_map('strval', $value);
83 unset($vars['value']);
84 
85 $vars['multiple'] = !empty($vars['multiple']);
86 
87 // Add trailing [] to name if multiple is enabled to allow the form to send multiple values
88 if ($vars['multiple'] && !empty($vars['name']) && is_string($vars['name'])) {
89  if (!str_ends_with($vars['name'], '[]')) {
90  $vars['name'] = elgg_extract('name', $vars) . '[]';
91  }
92 }
93 
94 $render_option = function($option) use ($value) {
95  $opt_value = elgg_extract('value', $option);
96 
97  $text = elgg_extract('text', $option);
98  unset($option['text']);
99 
100  if (!is_string($text) && !is_numeric($text)) {
101  elgg_log('No text defined for input/select option with value "' . $opt_value . '"', 'NOTICE');
102  }
103 
104  if (!isset($option['selected'])) {
105  $option['selected'] = isset($opt_value) && in_array((string) $opt_value, $value);
106  }
107 
108  if (!isset($option['title'])) {
109  $option['title'] = $text;
110  }
111 
112  return elgg_format_element('option', $option, $text);
113 };
114 
116 
117 foreach ($options_values as $option) {
118  $options = elgg_extract('options', $option);
119 
120  if (is_array($options)) {
121  $optgroup_attrs = $option;
122  unset($optgroup_attrs['options']);
123 
124  $optgroup = '';
125  foreach ($options as $group_option) {
126  $optgroup .= $render_option($group_option);
127  }
128 
129  $options_list .= elgg_format_element('optgroup', $optgroup_attrs, $optgroup);
130  } else {
131  $options_list .= $render_option($option);
132  }
133 }
134 
135 echo elgg_format_element('select', $vars, $options_list);
$defaults
Definition: select.php:27
$value
Definition: select.php:81
$options_list
Definition: select.php:115
elgg_extract_class(array $array, $existing=[], $extract_key= 'class')
Extract class names from an array, optionally merging into a preexisting set.
Definition: elgglib.php:276
$options_values
Definition: select.php:34
$options
Definition: select.php:37
elgg_extract($key, $array, $default=null, bool $strict=true)
Checks for $array[$key] and returns its value if it exists, else returns $default.
Definition: elgglib.php:254
$normalize_options
Definition: select.php:59
elgg_log($message, $level=\Psr\Log\LogLevel::NOTICE)
Log a message.
Definition: elgglib.php:86
if($container instanceof ElggGroup &&$container->guid!=elgg_get_page_owner_guid()) $key
Definition: summary.php:44
$vars['class']
Elgg select input Displays a select input field.
Definition: select.php:25
elgg_format_element(string $tag_name, array $attributes=[], string $text= '', array $options=[])
Format an HTML element.
Definition: output.php:145
if($vars['multiple']&&!empty($vars['name'])&&is_string($vars['name'])) $render_option
Definition: select.php:94
$text
Definition: button.php:32