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;
}
示例#2
0
/**
 * 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);
}
示例#4
0
文件: fields.php 项目: jdearaujo/core
/**
 * 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;
}