function smarty_function_display_field_type_settings_dropdown($params, &$smarty) { global $LANG; $field_type_id = $params["field_type_id"]; $default_value = isset($params["default"]) ? $params["default"] : ""; $attribute_whitelist = array("name", "id", "onchange", "onkeyup", "onfocus", "tabindex", "class"); $attributes = array(); foreach ($attribute_whitelist as $attribute_name) { if (isset($params[$attribute_name]) && !empty($params[$attribute_name])) { $attributes[] = "{$attribute_name}=\"{$params[$attribute_name]}\""; } } $attribute_str = implode(" ", $attributes); $field_type_settings = ft_get_field_type_settings($field_type_id); $rows = array(); foreach ($field_type_settings as $setting_info) { $field_setting_identifier = $setting_info["field_setting_identifier"]; $field_setting_label = htmlspecialchars(ft_eval_smarty_string($setting_info["field_label"])); $selected = $default_value == $field_setting_identifier ? " selected" : ""; $rows[] = "<option value=\"{$field_setting_identifier}\"{$selected}>{$field_setting_label}</option>"; } $dd = "<select {$attribute_str}>" . join("\n", $rows) . "</select>"; return $dd; }
/** * Used in the ft_update_submission function. This retrieves all setting information for a * field - including the field type settings that weren't overridden. * * @param $field_ids * @return array a hash of [field_id][identifier] = values */ function ft_get_form_field_field_type_settings($field_ids = array(), $form_fields) { global $g_table_prefix; if (empty($field_ids)) { return array(); } $field_id_str = implode(",", $field_ids); // get the overridden settings $query = mysql_query("\n\t\tSELECT fts.field_type_id, fs.field_id, fts.field_setting_identifier, fs.setting_value\n\t\tFROM {$g_table_prefix}field_type_settings fts, {$g_table_prefix}field_settings fs\n\t\tWHERE fts.setting_id = fs.setting_id AND\n\t\t\t\t\t fs.field_id IN ({$field_id_str})\n\t\tORDER BY fs.field_id\n\t"); $overridden_settings = array(); while ($row = mysql_fetch_assoc($query)) { $overridden_settings[$row["field_id"]][$row["field_setting_identifier"]] = $row["setting_value"]; } // now figure out what field_type_ids we're concerned about $relevant_field_type_ids = array(); $field_id_to_field_type_id_map = array(); foreach ($form_fields as $field_info) { if (!in_array($field_info["field_id"], $field_ids)) { continue; } if (!in_array($field_info["field_type_id"], $relevant_field_type_ids)) { $relevant_field_type_ids[] = $field_info["field_type_id"]; } $field_id_to_field_type_id_map[$field_info["field_id"]] = $field_info["field_type_id"]; } // this returns ALL the default field type settings. The function is "dumb": it doesn't evaluate // any of the dynamic default values - that's done below $default_field_type_settings = ft_get_field_type_settings($relevant_field_type_ids); // now overlay the two and return all field settings for all fields $results = array(); foreach ($field_ids as $field_id) { $results[$field_id] = array(); if (!isset($field_id_to_field_type_id_map[$field_id]) || !isset($default_field_type_settings[$field_id_to_field_type_id_map[$field_id]])) { continue; } $field_type_settings = $default_field_type_settings[$field_id_to_field_type_id_map[$field_id]]; foreach ($field_type_settings as $setting_info) { $identifier = $setting_info["field_setting_identifier"]; $default_value_type = $setting_info["default_value_type"]; if ($default_value_type == "static") { $value = $setting_info["default_value"]; } else { $parts = explode(",", $setting_info["default_value"]); // dynamic setting values should ALWAYS be of the form "setting_name,module_folder/'core'". If they're // not, just ignore it if (count($parts) != 2) { $value = ""; } else { $value = ft_get_settings($parts[0], $parts[1]); } } if (isset($overridden_settings[$field_id]) && isset($overridden_settings[$field_id][$identifier])) { $value = $overridden_settings[$field_id][$identifier]; } $results[$field_id][$identifier] = $value; } } return $results; }
/** * Deletes an option list from the database. Note: it only deletes lists that don't have any * form fields assigned to them; generally this is prevented from being called unless that condition is * met, but it also checks here just in case. * * @param integer $list_id * @return array [0] T/F<br /> * [1] error/success message */ function ft_delete_option_list($list_id) { global $g_table_prefix, $LANG; // slight behavioural change in 2.1.0. Now you CAN delete Option Lists that are used by one or more fields. // It just clears any references, thus leaving those fields incompletely configured (which isn't the end of // the world!) $fields = ft_get_fields_using_option_list($list_id); foreach ($fields as $field_info) { $field_id = $field_info["field_id"]; $field_type_id = $field_info["field_type_id"]; $settings = ft_get_field_type_settings($field_type_id); $setting_ids = array(); foreach ($settings as $setting_info) { if ($setting_info["field_type"] == "option_list_or_form_field") { $setting_ids[] = $setting_info["setting_id"]; } } if (empty($setting_ids)) { continue; } $setting_id_str = implode(",", $setting_ids); // now we delete any entries in the field_settings table with field_id, setting_id and a NUMERIC value for the // setting_value column. That column is also mysql_query("\n DELETE FROM {$g_table_prefix}field_settings\n WHERE field_id = {$field_id} AND\n setting_id IN ({$setting_id_str}) AND\n setting_value NOT LIKE 'form_field%'\n "); } mysql_query("DELETE FROM {$g_table_prefix}field_options WHERE list_id = {$list_id}"); mysql_query("DELETE FROM {$g_table_prefix}option_lists WHERE list_id = {$list_id}"); mysql_query("DELETE FROM {$g_table_prefix}list_groups WHERE group_type = 'option_list_{$list_id}'"); $success = true; $message = $LANG["notify_option_list_deleted"]; extract(ft_process_hook_calls("end", compact("list_id"), array("success", "message")), EXTR_OVERWRITE); return array(true, $message); }
/** * ft_get_extended_field_settings() doesn't quite do what I need, so I added this secondary function. It's * similar to ft_get_form_field_field_type_settings(), except for a single field. * * All it does is return all settings for a form field TAKING INTO ACCOUNT what's been overridden. * * Note: it returns the information as a hash of identifier => value pairs. This is fine, because no two field * settings for a single field type may have the same identifier. * * @param $field_id * @return array a hash of [identifier] = values */ function ft_get_field_settings($field_id) { global $g_table_prefix; if (empty($field_id) || !is_numeric($field_id)) { return array(); } // get the overridden settings $query = "\n SELECT fts.field_type_id, fs.field_id, fts.field_setting_identifier, fs.setting_value\n FROM {$g_table_prefix}field_type_settings fts, {$g_table_prefix}field_settings fs\n WHERE fts.setting_id = fs.setting_id AND\n fs.field_id = {$field_id}\n ORDER BY fs.field_id\n "; $result = mysql_query($query); $overridden_settings = array(); while ($row = mysql_fetch_assoc($result)) { $overridden_settings[$row["field_setting_identifier"]] = $row["setting_value"]; } $field_type_id = ft_get_field_type_id_by_field_id($field_id); $default_field_type_settings = ft_get_field_type_settings($field_type_id); // now overlay the two and return all field settings for all fields $complete_settings = array(); foreach ($default_field_type_settings as $setting_info) { $identifier = $setting_info["field_setting_identifier"]; $default_value_type = $setting_info["default_value_type"]; if ($default_value_type == "static") { $value = $setting_info["default_value"]; } else { $parts = explode(",", $setting_info["default_value"]); // dynamic setting values should ALWAYS be of the form "setting_name,module_folder/'core'". If they're // not, just ignore it if (count($parts) != 2) { $value = ""; } else { $value = ft_get_settings($parts[0], $parts[1]); } } // if the field has been overwritten use that instead! if (isset($overridden_settings[$identifier])) { $value = $overridden_settings[$identifier]; } $complete_settings[$identifier] = $value; } return $complete_settings; }