function wpcf7_select_form_tag_handler($tag) { $tag = new WPCF7_FormTag($tag); if (empty($tag->name)) { return ''; } $validation_error = wpcf7_get_validation_error($tag->name); $class = wpcf7_form_controls_class($tag->type); if ($validation_error) { $class .= ' wpcf7-not-valid'; } $atts = array(); $atts['class'] = $tag->get_class_option($class); $atts['id'] = $tag->get_id_option(); $atts['tabindex'] = $tag->get_option('tabindex', 'int', true); if ($tag->is_required()) { $atts['aria-required'] = 'true'; } $atts['aria-invalid'] = $validation_error ? 'true' : 'false'; $multiple = $tag->has_option('multiple'); $include_blank = $tag->has_option('include_blank'); $first_as_label = $tag->has_option('first_as_label'); $values = $tag->values; $labels = $tag->labels; if ($data = (array) $tag->get_data_option()) { $values = array_merge($values, array_values($data)); $labels = array_merge($labels, array_values($data)); } $defaults = array(); $default_choice = $tag->get_default_option(null, 'multiple=1'); foreach ($default_choice as $value) { $key = array_search($value, $values, true); if (false !== $key) { $defaults[] = (int) $key + 1; } } if ($matches = $tag->get_first_match_option('/^default:([0-9_]+)$/')) { $defaults = array_merge($defaults, explode('_', $matches[1])); } $defaults = array_unique($defaults); $shifted = false; if ($include_blank || empty($values)) { array_unshift($labels, '---'); array_unshift($values, ''); $shifted = true; } elseif ($first_as_label) { $values[0] = ''; } $html = ''; $hangover = wpcf7_get_hangover($tag->name); foreach ($values as $key => $value) { $selected = false; if ($hangover) { if ($multiple) { $selected = in_array(esc_sql($value), (array) $hangover); } else { $selected = $hangover == esc_sql($value); } } else { if (!$shifted && in_array((int) $key + 1, (array) $defaults)) { $selected = true; } elseif ($shifted && in_array((int) $key, (array) $defaults)) { $selected = true; } } $item_atts = array('value' => $value, 'selected' => $selected ? 'selected' : ''); $item_atts = wpcf7_format_atts($item_atts); $label = isset($labels[$key]) ? $labels[$key] : $value; $html .= sprintf('<option %1$s>%2$s</option>', $item_atts, esc_html($label)); } if ($multiple) { $atts['multiple'] = 'multiple'; } $atts['name'] = $tag->name . ($multiple ? '[]' : ''); $atts = wpcf7_format_atts($atts); $html = sprintf('<span class="wpcf7-form-control-wrap %1$s"><select %2$s>%3$s</select>%4$s</span>', sanitize_html_class($tag->name), $atts, $html, $validation_error); return $html; }
function wpcf7_checkbox_form_tag_handler($tag) { $tag = new WPCF7_FormTag($tag); if (empty($tag->name)) { return ''; } $validation_error = wpcf7_get_validation_error($tag->name); $class = wpcf7_form_controls_class($tag->type); if ($validation_error) { $class .= ' wpcf7-not-valid'; } $label_first = $tag->has_option('label_first'); $use_label_element = $tag->has_option('use_label_element'); $exclusive = $tag->has_option('exclusive'); $free_text = $tag->has_option('free_text'); $multiple = false; if ('checkbox' == $tag->basetype) { $multiple = !$exclusive; } else { // radio $exclusive = false; } if ($exclusive) { $class .= ' wpcf7-exclusive-checkbox'; } $atts = array(); $atts['class'] = $tag->get_class_option($class); $atts['id'] = $tag->get_id_option(); $tabindex = $tag->get_option('tabindex', 'int', true); if (false !== $tabindex) { $tabindex = absint($tabindex); } $html = ''; $count = 0; $values = (array) $tag->values; $labels = (array) $tag->labels; if ($data = (array) $tag->get_data_option()) { if ($free_text) { $values = array_merge(array_slice($values, 0, -1), array_values($data), array_slice($values, -1)); $labels = array_merge(array_slice($labels, 0, -1), array_values($data), array_slice($labels, -1)); } else { $values = array_merge($values, array_values($data)); $labels = array_merge($labels, array_values($data)); } } $defaults = array(); $default_choice = $tag->get_default_option(null, 'multiple=1'); foreach ($default_choice as $value) { $key = array_search($value, $values, true); if (false !== $key) { $defaults[] = (int) $key + 1; } } if ($matches = $tag->get_first_match_option('/^default:([0-9_]+)$/')) { $defaults = array_merge($defaults, explode('_', $matches[1])); } $defaults = array_unique($defaults); $hangover = wpcf7_get_hangover($tag->name, $multiple ? array() : ''); foreach ($values as $key => $value) { $class = 'wpcf7-list-item'; $checked = false; if ($hangover) { if ($multiple) { $checked = in_array(esc_sql($value), (array) $hangover); } else { $checked = $hangover == esc_sql($value); } } else { $checked = in_array($key + 1, (array) $defaults); } if (isset($labels[$key])) { $label = $labels[$key]; } else { $label = $value; } $item_atts = array('type' => $tag->basetype, 'name' => $tag->name . ($multiple ? '[]' : ''), 'value' => $value, 'checked' => $checked ? 'checked' : '', 'tabindex' => $tabindex ? $tabindex : ''); $item_atts = wpcf7_format_atts($item_atts); if ($label_first) { // put label first, input last $item = sprintf('<span class="wpcf7-list-item-label">%1$s</span><input %2$s />', esc_html($label), $item_atts); } else { $item = sprintf('<input %2$s /><span class="wpcf7-list-item-label">%1$s</span>', esc_html($label), $item_atts); } if ($use_label_element) { $item = '<label>' . $item . '</label>'; } if (false !== $tabindex) { $tabindex += 1; } $count += 1; if (1 == $count) { $class .= ' first'; } if (count($values) == $count) { // last round $class .= ' last'; if ($free_text) { $free_text_name = sprintf('_wpcf7_%1$s_free_text_%2$s', $tag->basetype, $tag->name); $free_text_atts = array('name' => $free_text_name, 'class' => 'wpcf7-free-text', 'tabindex' => $tabindex ? $tabindex : ''); if (wpcf7_is_posted() && isset($_POST[$free_text_name])) { $free_text_atts['value'] = wp_unslash($_POST[$free_text_name]); } $free_text_atts = wpcf7_format_atts($free_text_atts); $item .= sprintf(' <input type="text" %s />', $free_text_atts); $class .= ' has-free-text'; } } $item = '<span class="' . esc_attr($class) . '">' . $item . '</span>'; $html .= $item; } $atts = wpcf7_format_atts($atts); $html = sprintf('<span class="wpcf7-form-control-wrap %1$s"><span %2$s>%3$s</span>%4$s</span>', sanitize_html_class($tag->name), $atts, $html, $validation_error); return $html; }