function smarty_function_display_field_type_name($params, &$smarty) { $field_type_id = isset($params["field_type_id"]) ? $params["field_type_id"] : ""; if (empty($field_type_id)) { return; } $field_type_info = ft_get_field_type($field_type_id); echo ft_eval_smarty_string($field_type_info["field_type_name"]); }
function smarty_function_themes_dropdown($params, &$smarty) { global $LANG; if (empty($params["name_id"])) { $smarty->trigger_error("assign: missing 'name_id' parameter. This is used to give the select field a name and id value."); return; } $default_value = isset($params["default"]) ? $params["default"] : ""; $default_swatch = isset($params["default_swatch"]) ? $params["default_swatch"] : ""; $onchange = isset($params["onchange"]) ? $params["onchange"] : ""; // we always give theme dropdowns a special "ft_themes_dropdown" class. This is used to dynamically // add the event handlers to hide/show the appropriate swatch dropdown $attributes = array("id" => $params["name_id"], "name" => $params["name_id"], "class" => "ft_themes_dropdown", "onchange" => $onchange); $attribute_str = ""; while (list($key, $value) = each($attributes)) { if (!empty($value)) { $attribute_str .= " {$key}=\"{$value}\""; } } $themes = ft_get_themes(); $html = "<select {$attribute_str}>\n <option value=\"\">{$LANG["phrase_please_select"]}</option>"; $swatch_info = array(); foreach ($themes as $theme) { if ($theme["is_enabled"] == "no") { continue; } $selected = $theme["theme_folder"] == $default_value ? "selected" : ""; $html .= "<option value=\"{$theme["theme_folder"]}\" {$selected}>{$theme["theme_name"]}</option>"; if ($theme["uses_swatches"] == "yes") { $swatch_info[$theme["theme_folder"]] = $theme["swatches"]; } } $html .= "</select>"; // now generate swatch dropdowns for all themes that have them. This is by far the simplest solution, // since there will always be very few themes and even fewer that have while (list($theme_folder, $swatches) = each($swatch_info)) { $classes = array("{$params["name_id"]}_swatches"); if ($theme_folder != $default_value) { $classes[] = "hidden"; } $class_str = implode(" ", $classes); $html .= "<select name=\"{$theme_folder}_{$params["name_id"]}_swatches\" id=\"{$theme_folder}_{$params["name_id"]}_swatches\" class=\"{$class_str}\">" . "<option value=\"\">{$LANG["phrase_select_swatch"]}</option>"; $pairs = explode("|", $swatches); foreach ($pairs as $pair) { list($swatch, $swatch_label) = explode(",", $pair); $selected = ""; if ($theme_folder == $default_value && $default_swatch == $swatch) { $selected = "selected"; } $swatch_label = ft_eval_smarty_string($swatch_label); $html .= "<option value=\"{$swatch}\" {$selected}>{$swatch_label}</option>"; } $html .= "</select>"; } return $html; }
function smarty_function_eval_smarty_string($params, &$smarty) { global $LANG; if (empty($params["placeholder_str"])) { $smarty->trigger_error("assign: missing 'placeholder_str' parameter."); return; } $placeholders = $params; unset($placeholders["placeholder_str"]); $placeholder_str = $params["placeholder_str"]; return ft_eval_smarty_string($placeholder_str, $placeholders); }
/** * Adds new form field(s) to the database. This was totally re-written in 2.1.0, for the new Edit Fields * page. * * @param integer $infohash a hash containing the contents of the Edit Form Advanced -> Add Fields page. * @param integer $form_id The unique form ID * @return array Returns array with indexes:<br/> * [0]: true/false (success / failure)<br/> * [1]: message string<br/> */ function ft_add_form_fields($form_id, $fields) { global $g_debug, $g_table_prefix, $LANG, $g_field_sizes; $success = true; $message = ""; $fields = ft_sanitize($fields); foreach ($fields as $field_info) { $field_name = $field_info["form_field_name"]; $field_size = $field_info["field_size"]; $field_type_id = $field_info["field_type_id"]; $display_name = $field_info["display_name"]; $include_on_redirect = $field_info["include_on_redirect"]; $list_order = $field_info["list_order"]; $col_name = $field_info["col_name"]; $is_new_sort_group = $field_info["is_new_sort_group"]; // in order for the field to be added, it needs to have the label, name, size and column name. Otherwise they're // ignored if (empty($display_name) || empty($field_name) || empty($field_size) || empty($col_name)) { continue; } // add the new field to form_fields $query = "\n INSERT INTO {$g_table_prefix}form_fields (form_id, field_name, field_size, field_type_id,\n data_type, field_title, col_name, list_order, is_new_sort_group, include_on_redirect)\n VALUES ({$form_id}, '{$field_name}', '{$field_size}', {$field_type_id},\n 'string', '{$display_name}', '{$col_name}', {$list_order}, '{$is_new_sort_group}', '{$include_on_redirect}')\n "; $result = mysql_query($query) or ft_handle_error("Failed query in <b>" . __FUNCTION__ . "</b>, line " . __LINE__ . ": <i>{$query}</i>", mysql_error()); $new_field_id = mysql_insert_id(); $new_field_size = $g_field_sizes[$field_size]["sql"]; list($is_success, $err_message) = _ft_add_table_column("{$g_table_prefix}form_{$form_id}", $col_name, $new_field_size); // if the alter table didn't work, return with an error message and remove the entry we just added to the form_fields table if (!$is_success) { if (!empty($new_field_id) && is_numeric($new_field_id)) { mysql_query("\n DELETE FROM {$g_table_prefix}form_fields\n WHERE field_id = {$new_field_id}\n LIMIT 1\n "); } $success = false; $replacement_info = array("fieldname" => $field_name); $message = ft_eval_smarty_string($LANG["notify_form_field_not_added"], $replacement_info); if ($g_debug) { $message .= " <i>\"{$err_message}\"</i>"; } return array($success, $message); } } extract(ft_process_hook_calls("end", compact("infohash", "form_id"), array("success", "message")), EXTR_OVERWRITE); return array($success, $message); }
function smarty_function_display_field_types_dropdown($params, &$smarty) { global $LANG; $default_value = isset($params["default"]) ? $params["default"] : ""; // this option controls whether the option values are field_type_ids or identifiers $value_type = isset($params["value_type"]) ? $params["value_type"] : "field_type_id"; $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); $grouped_field_types = ft_get_grouped_field_types(); $rows = array(); foreach ($grouped_field_types as $grouped_field_type) { $group_name = ft_eval_smarty_string($grouped_field_type["group"]["group_name"]); $rows[] = "<optgroup label=\"" . htmlspecialchars($group_name) . "\">"; foreach ($grouped_field_type["field_types"] as $field_type_info) { $field_type_id = $field_type_info["field_type_id"]; $field_type_identifier = $field_type_info["field_type_identifier"]; $field_type_name = htmlspecialchars(ft_eval_smarty_string($field_type_info["field_type_name"])); if ($value_type == "field_type_id") { $selected = $default_value == $field_type_id ? " selected" : ""; $rows[] = "<option value=\"{$field_type_id}\"{$selected}>{$field_type_name}</option>"; } else { $selected = $default_value == $field_type_identifier ? " selected" : ""; $rows[] = "<option value=\"{$field_type_identifier}\"{$selected}>{$field_type_name}</option>"; } } $rows[] = "</optgroup>"; } $dd = "<select {$attribute_str}>" . implode("", $rows) . "</select>"; return $dd; }
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; }
/** * Helper function to return a human friendly version of the available theme swatches. * * @param string $str the serialized swatch string found in the theme tables "swatches" field. */ function ft_get_theme_swatch_list($str) { $swatch_list = array(); $pairs = explode("|", $str); foreach ($pairs as $pair) { list($swatch, $swatch_label) = explode(",", $pair); $swatch_list[] = ft_eval_smarty_string($swatch_label); } $swatch_list_str = implode(", ", $swatch_list); return $swatch_list_str; }
/** * This is the main server-side validation function, called whenever updating a submission. The current version (Core 2.1.9) * only performs a subset of the total validation rules; namely, those non-custom ones that * * @param array $editable_field_ids - this contains ALL editable field IDs in the form * @param array $request * @return array an array of errors, or an empty array if no errors */ function ft_validate_submission($form_id, $editable_field_ids, $request) { if (empty($editable_field_ids)) { return array(); } // get the validation rules for the current page. The use of $request["field_ids"] is a fix for bug #339; this should be handled // a lot better. The calling page (edit_submission.php amongst other) should be figuring out what fields are editable on that particular // page and passing THAT info as $editable_field_ids $editable_field_ids_on_tab = explode(",", $request["field_ids"]); // return all validation rules for items on tab, including those marked as editable == "no" $rules = ft_get_php_field_validation_rules($editable_field_ids_on_tab); // gets all form fields in this View $form_fields = ft_get_view_fields($request["view_id"]); // reorganize $form_fields to be a hash of field_id => array(form_name => "", field_tield => "") $field_info = array(); foreach ($form_fields as $curr_field_info) { $field_info[$curr_field_info["field_id"]] = array("field_name" => $curr_field_info["field_name"], "field_title" => $curr_field_info["field_title"], "is_editable" => $curr_field_info["is_editable"]); } // construct the RSV-friendly validation $validation = array(); foreach ($rules as $rule_info) { $rule = $rule_info["rsv_rule"]; $field_id = $rule_info["field_id"]; $field_name = $field_info[$field_id]["field_name"]; $field_title = $field_info[$field_id]["field_title"]; $error_message = $rule_info["error_message"]; // if this field is marked as non-editable, ignore it. We don't need to validate it if ($field_info[$field_id]["is_editable"] == "no") { continue; } $placeholders = array("field" => $field_title, "field_name" => $field_name); $error_message = ft_eval_smarty_string($error_message, $placeholders); $validation[] = "{$rule},{$field_name},{$error_message}"; } $errors = array(); if (!empty($validation)) { $form_vals = ft_sanitize($request); $errors = validate_fields($form_vals, $validation); } return $errors; }
/** * Used by the "forget password?" page to have a client's login information sent to them. * * @param array $info the $_POST containing a "username" key. That value is used to find the user * account information to email them. * @return array [0]: true/false (success / failure) * [1]: message string */ function ft_send_password($info) { global $g_root_url, $g_root_dir, $g_table_prefix, $LANG; $info = ft_sanitize($info); extract(ft_process_hook_calls("start", compact("info"), array("info")), EXTR_OVERWRITE); $success = true; $message = $LANG["notify_login_info_emailed"]; if (!isset($info["username"]) || empty($info["username"])) { $success = false; $message = $LANG["validation_no_username_or_js"]; return array($success, $message); } $username = $info["username"]; $query = mysql_query("\r\n SELECT *\r\n FROM {$g_table_prefix}accounts\r\n WHERE username = '******'\r\n "); // not found if (!mysql_num_rows($query)) { $success = false; $message = $LANG["validation_account_not_recognized_info"]; return array($success, $message); } $account_info = mysql_fetch_assoc($query); $email = $account_info["email"]; // one final check: confirm the email is defined & valid if (empty($email) || !ft_is_valid_email($email)) { $success = false; $message = $LANG["validation_email_not_found_or_invalid"]; return array($success, $message); } $account_id = $account_info["account_id"]; $username = $account_info["username"]; $new_password = ft_generate_password(); $encrypted_password = md5(md5($new_password)); // update the database with the new password (encrypted). As of 2.1.0 there's a second field to store the // temporary generated password, leaving the original password intact. This prevents a situation arising when // someone other than the admin / client uses the "Forget Password" feature and invalidates a valid, known password. // Any time the user successfully logs in, mysql_query("\r\n UPDATE {$g_table_prefix}accounts\r\n SET temp_reset_password = '******'\r\n WHERE account_id = {$account_id}\r\n "); // now build and sent the email // 1. build the email content $placeholders = array("login_url" => "{$g_root_url}/?id={$account_id}", "email" => $email, "username" => $username, "new_password" => $new_password); $smarty_template_email_content = file_get_contents("{$g_root_dir}/global/emails/forget_password.tpl"); $email_content = ft_eval_smarty_string($smarty_template_email_content, $placeholders); // 2. build the email subject line $placeholders = array("program_name" => ft_get_settings("program_name")); $smarty_template_email_subject = file_get_contents("{$g_root_dir}/global/emails/forget_password_subject.tpl"); $email_subject = trim(ft_eval_smarty_string($smarty_template_email_subject, $placeholders)); // if Swift Mailer is enabled, send the emails with that. In case there's a problem sending the message with // Swift, it falls back the default mail() function. $swift_mail_error = false; $swift_mail_enabled = ft_check_module_enabled("swift_mailer"); if ($swift_mail_enabled) { $sm_settings = ft_get_module_settings("", "swift_mailer"); if ($sm_settings["swiftmailer_enabled"] == "yes") { ft_include_module("swift_mailer"); // get the admin info. We'll use that info for the "from" and "reply-to" values. Note // that we DON'T use that info for the regular mail() function. This is because retrieving // the password is important functionality and we don't want to cause problems that could // prevent the email being sent. Many servers don't all the 4th headers parameter of the mail() // function $admin_info = ft_get_admin_info(); $admin_email = $admin_info["email"]; $email_info = array(); $email_info["to"] = array(); $email_info["to"][] = array("email" => $email); $email_info["from"] = array(); $email_info["from"]["email"] = $admin_email; $email_info["subject"] = $email_subject; $email_info["text_content"] = $email_content; list($success, $sm_message) = swift_send_email($email_info); // if the email couldn't be sent, display the appropriate error message. Otherwise // the default success message is used if (!$success) { $swift_mail_error = true; $message = $sm_message; } } } // if there was an error sending with Swift, or if it wasn't installed, send it by mail() if (!$swift_mail_enabled || $swift_mail_error) { // send email [note: the double quotes around the email recipient and content are intentional: some systems fail without it] if (!@mail("{$email}", $email_subject, $email_content)) { $success = false; $message = $LANG["notify_email_not_sent"]; return array($success, $message); } } extract(ft_process_hook_calls("end", compact("success", "message", "info"), array("success", "message")), EXTR_OVERWRITE); return array($success, $message); }
/** * Called by the administrator from the Themes settings page. It updates the list of enabled * themes, and which theme is assigned to the administrator and (default) client accounts. Note: * it doesn't disable any themes that are already assigned to a user account. If that happens, * it returns a message listing the accounts (each clickable) and an option to bulk assign them * to a different theme. * * @param array $infohash this parameter should be a hash (e.g. $_POST or $_GET) containing the * various fields from the main settings admin page. * @return array Returns array with indexes:<br/> * [0]: true/false (success / failure)<br/> * [1]: message string<br/> */ function ft_update_theme_settings($infohash) { global $g_table_prefix, $g_root_url, $g_root_dir, $LANG; // lots to validate! First, check the default admin & client themes have been entered $rules = array(); $rules[] = "required,admin_theme,{$LANG["validation_no_admin_theme"]}"; $rules[] = "required,default_client_theme,{$LANG["validation_no_default_client_theme"]}"; $errors = validate_fields($infohash, $rules); if (!isset($infohash["is_enabled"])) { $errors[] = $LANG["validation_no_enabled_themes"]; } if (!empty($errors)) { $success = false; array_walk($errors, create_function('&$el', '$el = "• " . $el;')); $message = join("<br />", $errors); return array($success, $message); } $enabled_themes = $infohash["is_enabled"]; // next, check that both the admin and default client themes are enabled $admin_theme = $infohash["admin_theme"]; $default_client_theme = $infohash["default_client_theme"]; if (!in_array($admin_theme, $enabled_themes) || !in_array($default_client_theme, $enabled_themes)) { return array(false, $LANG["validation_default_admin_and_client_themes_not_enabled"]); } // lastly, if there are already client accounts assigned to disabled themes, we need to sort it out. // We handle it the same way as deleting the client menus: if anyone is assigned to this theme, // we generate a list of their names, each a link to their account page (in a _blank link). We // then inform the user of what's going on, and underneath the name list, give them the option of // assigning ALL affected accounts to another (enabled) theme. $theme_clauses = array(); foreach ($enabled_themes as $theme) { $theme_clauses[] = "theme != '{$theme}'"; } $theme_clause = join(" AND ", $theme_clauses); $query = mysql_query("\n SELECT account_id, first_name, last_name\n FROM {$g_table_prefix}accounts\n WHERE {$theme_clause}\n "); $client_info = array(); while ($row = mysql_fetch_assoc($query)) { $client_info[] = $row; } if (!empty($client_info)) { $message = $LANG["notify_disabled_theme_already_assigned"]; $placeholder_str = $LANG["phrase_assign_all_listed_client_accounts_to_theme"]; $themes = ft_get_themes(true); $dd = "<select id=\"mass_update_client_theme\">"; foreach ($themes as $theme) { $dd .= "<option value=\"{$theme["theme_id"]}\">{$theme["theme_name"]}</option>"; } $dd .= "</select>"; // a bit bad (hardcoded HTML!), but organize the account list in 3 columns $client_links_table = "<table cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">\n<tr>"; $num_affected_clients = count($client_info); for ($i = 0; $i < $num_affected_clients; $i++) { $account_info = $client_info[$i]; $client_id = $account_info["account_id"]; $first_name = $account_info["first_name"]; $last_name = $account_info["last_name"]; $client_ids[] = $client_id; if ($i != 0 && $i % 3 == 0) { $client_links_table .= "</tr>\n<tr>"; } $client_links_table .= "<td width=\"33%\">• <a href=\"{$g_root_url}/admin/clients/edit.php?page=settings&client_id={$client_id}\" target=\"_blank\">{$first_name} {$last_name}</a></td>\n"; } $client_id_str = join(",", $client_ids); // close the table if ($num_affected_clients % 3 == 1) { $client_links_table .= "<td colspan=\"2\" width=\"66%\"> </td>"; } else { if ($num_affected_clients % 3 == 2) { $client_links_table .= "<td width=\"33%\"> </td>"; } } $client_links_table .= "</tr></table>"; $submit_button = "<input type=\"button\" value=\"{$LANG["phrase_update_accounts"]}\" onclick=\"window.location='index.php?page=themes&mass_assign=1&accounts={$client_id_str}&theme_id=' + \$('#mass_update_client_theme').val()\" />"; $placeholders = array("theme_dropdown" => $dd, "submit_button" => $submit_button); $mass_assign_html = "<div class=\"margin_top_large margin_bottom_large\">" . ft_eval_smarty_string($placeholder_str, $placeholders) . "</div>"; $html = $message . $mass_assign_html . $client_links_table; return array(false, $html); } // hoorah! Validation complete, let's update the bloomin' database at last // update the admin settings $admin_id = $_SESSION["ft"]["account"]["account_id"]; $admin_swatch = ""; if (isset($infohash["{$admin_theme}_admin_theme_swatches"])) { $admin_swatch = $infohash["{$admin_theme}_admin_theme_swatches"]; } mysql_query("\n UPDATE {$g_table_prefix}accounts\n SET theme = '{$admin_theme}',\n swatch = '{$admin_swatch}'\n WHERE account_id = {$admin_id}\n "); $_SESSION["ft"]["account"]["theme"] = $admin_theme; $_SESSION["ft"]["account"]["swatch"] = $admin_swatch; $default_client_swatch = ""; if (isset($infohash["{$default_client_theme}_default_client_theme_swatches"])) { $default_client_swatch = $infohash["{$default_client_theme}_default_client_theme_swatches"]; } // update the default client theme & swatch $new_settings = array("default_theme" => $default_client_theme, "default_client_swatch" => $default_client_swatch); ft_set_settings($new_settings); // finally, update the enabled themes list. Only set the theme as enabled if the // cache folder is writable mysql_query("UPDATE {$g_table_prefix}themes SET is_enabled = 'no'"); foreach ($enabled_themes as $theme) { $cache_folder = "{$g_root_dir}/themes/{$theme}/cache"; // try and set the cache folder as writable if (!is_writable($cache_folder)) { @chmod($cache_folder, 0777); } if (!is_writable($cache_folder)) { continue; } mysql_query("\n UPDATE {$g_table_prefix}themes\n SET is_enabled = 'yes'\n WHERE theme_folder = '{$theme}'\n "); } // reset the settings in sessions $_SESSION["ft"]["settings"] = ft_get_settings(); $success = true; $message = $LANG["notify_themes_settings_updated"]; extract(ft_process_hook_calls("end", compact("infohash"), array("success", "message")), EXTR_OVERWRITE); return array($success, $message); }
$password_special_chars = preg_quote($g_password_special_chars); $conditional_validation[] = "rules.push(\"if:password!=,reg_exp,password,[{$password_special_chars}],{$error}\")"; } $conditional_rules = implode("\n", $conditional_validation); // define info for template $page_vars["page"] = "main"; $page_vars["page_url"] = ft_get_page_url("edit_client_main", array("client_id" => $client_id)); $page_vars["head_title"] = "{$LANG["phrase_edit_client"]} - {$LANG["word_main"]}"; $page_vars["client_info"] = $client_info; $page_vars["client_id"] = $client_id; $page_vars["required_password_chars"] = $required_password_chars; $page_vars["password_special_chars"] = $g_password_special_chars; $page_vars["has_extra_password_requirements"] = !empty($client_info["settings"]["required_password_chars"]) || !empty($client_info["settings"]["min_password_length"]); $page_vars["has_min_password_length"] = !empty($client_info["settings"]["min_password_length"]); $page_vars["password_special_char"] = ft_eval_smarty_string($LANG["phrase_password_special_char"], array("chars" => $g_password_special_chars)); $page_vars["phrase_password_min"] = ft_eval_smarty_string($LANG["phrase_password_min"], array("length" => $client_info["settings"]["min_password_length"])); $page_vars["head_js"] = <<<END var rules = []; rules.push("required,first_name,{$LANG['validation_no_client_first_name']}"); rules.push("required,last_name,{$LANG['validation_no_client_last_name']}"); rules.push("required,email,{$LANG['validation_no_client_email']}"); rules.push("valid_email,email,{$LANG['validation_invalid_email']}"); rules.push("required,username,{$LANG['validation_no_client_username']}"); rules.push("function,validate_username"); rules.push("if:password!=,required,password_2,{$LANG["validation_no_account_password_confirmed2"]}"); rules.push("if:password!=,same_as,password,password_2,{$LANG["validation_passwords_different"]}"); {$conditional_rules} function validate_username() { var username = \$("input[name=username]").val(); if (username.match(/[^\\.@a-zA-Z0-9_]/)) {
<?php require "../../../global/session_start.php"; ft_check_permission("admin"); // delete any temporary Smart Fill uploaded files if (isset($_SESSION["ft"]["smart_fill_tmp_uploaded_files"]) && !empty($_SESSION["ft"]["smart_fill_tmp_uploaded_files"])) { foreach ($_SESSION["ft"]["smart_fill_tmp_uploaded_files"] as $file) { @unlink($file); } } $_SESSION["ft"]["method"] = ""; $form_id = ft_load_field("form_id", "add_form_form_id", ""); unset($_SESSION["ft"]["add_form_form_id"]); // ------------------------------------------------------------------------------------------------ // compile the header information $page_vars["page"] = "add_form6"; $page_vars["page_url"] = ft_get_page_url("add_form6"); $page_vars["head_title"] = "{$LANG['phrase_add_form']} - {$LANG["phrase_step_5"]}"; $page_vars["form_id"] = $form_id; $page_vars["text_add_form_step_5_para"] = ft_eval_smarty_string($LANG["text_add_form_step_5_para_3"], array("editformlink" => "../edit.php?form_id={$form_id}")); $page_vars["text_add_form_step_5_para_4"] = ft_eval_smarty_string($LANG["text_add_form_step_5_para_4"], array("editformlink" => "../edit.php?form_id={$form_id}")); $page_vars["uploading_files"] = $_SESSION["ft"]["uploading_files"]; $page_vars["head_css"] = ""; ft_display_page("admin/forms/add/step6.tpl", $page_vars);
if ($settings["release_type"] == "alpha") { $new_version = "{$settings['program_version']}-alpha-{$settings['release_date']}"; } else { if ($settings["release_type"] == "beta") { $new_version = "{$settings['program_version']}-beta-{$settings['release_date']}"; } } $replacements = array("version" => $new_version); $page_vars["upgrade_notification"] = ft_eval_smarty_string($LANG["text_upgraded"], $replacements, $g_theme); } else { $g_success = false; $g_message = $g_upgrade_info["message"]; } } $replacements = array("program_name" => $settings["program_name"], "forgot_password_link" => "forget_password.php"); $page_vars["text_login"] = ft_eval_smarty_string($LANG["text_login"], $replacements, $g_theme); $page_vars["program_name"] = $settings["program_name"]; $page_vars["login_heading"] = sprintf("%s %s", $settings['program_name'], $LANG["word_administration"]); $page_vars["username"] = $username; $page_vars["is_logged_in"] = false; $page_vars["head_js"] = "\$(function() { document.login.username.focus(); });"; $page_vars["head_string"] = "<noscript><style type=\"text/css\">.login_outer_table { display: none; }</style></noscript>"; if (!isset($g_upgrade_info["message"]) && isset($_GET["message"])) { $g_success = false; if (array_key_exists($_GET["message"], $LANG)) { $g_message = $LANG[$_GET["message"]]; } else { $g_message = strip_tags($_GET["message"]); } } ft_display_page("index.tpl", $page_vars, $g_theme, $g_swatch);
$submission_ids = ft_get_search_submission_ids($form_id, $view_id, $search["results_per_page"], $search["order"], $search["search_fields"], $searchable_columns); $_SESSION["ft"]["form_{$form_id}_view_{$view_id}_submissions"] = $submission_ids; $_SESSION["ft"]["new_search"] = "no"; } list($prev_link_html, $search_results_link_html, $next_link_html) = _ft_code_get_link_html($form_id, $view_id, $submission_id, $search["results_per_page"]); // construct the page label $submission_placeholders = ft_get_submission_placeholders($form_id, $submission_id); $edit_submission_page_label = ft_eval_smarty_string($form_info["edit_submission_page_label"], $submission_placeholders); $validation_js = ft_generate_submission_js_validation($grouped_fields); // get all the shared resources $settings = ft_get_settings("", "core"); $shared_resources_list = $settings["edit_submission_onload_resources"]; $shared_resources_array = explode("|", $shared_resources_list); $shared_resources = ""; foreach ($shared_resources_array as $resource) { $shared_resources .= ft_eval_smarty_string($resource, array("g_root_url" => $g_root_url)) . "\n"; } // ------------------------------------------------------------------------------------------------ // compile the header information $page_vars = array(); $page_vars["page"] = "admin_edit_submission"; $page_vars["page_url"] = ft_get_page_url("admin_edit_submission"); $page_vars["head_title"] = $edit_submission_page_label; $page_vars["form_info"] = $form_info; $page_vars["form_id"] = $form_id; $page_vars["view_id"] = $view_id; $page_vars["submission_id"] = $submission_id; $page_vars["tabs"] = $tabs; $page_vars["settings"] = $settings; $page_vars["tab_number"] = $tab_number; $page_vars["grouped_fields"] = $grouped_fields;
/** * Smarty plugin * ------------------------------------------------------------- * File: function.edit_custom_field * Type: function * Name: edit_custom_field * Purpose: This is used on the Edit Submission pages. It does all the clever stuff needed to generate the * actual markup for a single field, with whatever user-defined settings have been employed. * * It's strongly coupled to the ft_get_grouped_view_fields function (when called with the form ID & * submission ID params) to ensure that all data is efficiently returned for use by this function. * ------------------------------------------------------------- */ function smarty_function_edit_custom_field($params, &$smarty) { global $LANG, $g_root_url, $g_root_dir, $g_multi_val_delimiter, $g_table_prefix; if (empty($params["form_id"])) { $smarty->trigger_error("assign: missing 'form_id' parameter."); return; } if (empty($params["field_info"])) { $smarty->trigger_error("assign: missing 'field_info' parameter."); return; } if (empty($params["field_types"])) { $smarty->trigger_error("assign: missing 'field_types' parameter."); return; } if (empty($params["settings"])) { $smarty->trigger_error("assign: missing 'settings' parameter."); return; } $form_id = $params["form_id"]; $field_info = $params["field_info"]; $field_types = $params["field_types"]; $settings = $params["settings"]; $submission_id = isset($params["submission_id"]) ? $params["submission_id"] : ""; // loop through the field types and store the one we're interested in in $field_type_info $field_type_info = array(); foreach ($field_types as $curr_field_type) { if ($field_info["field_type_id"] == $curr_field_type["field_type_id"]) { $field_type_info = $curr_field_type; break; } } if ($field_info["is_editable"] == "no") { $markup_with_placeholders = trim($field_type_info["view_field_smarty_markup"]); if (empty($markup_with_placeholders)) { echo $field_info["submission_info"]["value"]; return; } } else { $markup_with_placeholders = $field_type_info["edit_field_smarty_markup"]; } // now construct all available placeholders $placeholders = array("FORM_ID" => $form_id, "VIEW_ID" => $field_info["view_id"], "SUBMISSION_ID" => $submission_id, "FIELD_ID" => $field_info["field_id"], "NAME" => $field_info["field_name"], "COLNAME" => $field_info["col_name"], "VALUE" => isset($field_info["submission_value"]) ? $field_info["submission_value"] : "", "SETTINGS" => $settings, "CONTEXTPAGE" => "edit_submission", "ACCOUNT_INFO" => isset($_SESSION["ft"]["account"]) ? $_SESSION["ft"]["account"] : array(), "g_root_url" => $g_root_url, "g_root_dir" => $g_root_dir, "g_multi_val_delimiter" => $g_multi_val_delimiter); // add in all field type settings and their replacements foreach ($field_type_info["settings"] as $setting_info) { $curr_setting_id = $setting_info["setting_id"]; $curr_setting_field_type = $setting_info["field_type"]; $default_value_type = $setting_info["default_value_type"]; $value = $setting_info["default_value"]; $identifier = $setting_info["field_setting_identifier"]; foreach ($field_info["field_settings"] as $setting) { $found = false; while (list($setting_id, $setting_value) = each($setting)) { if ($setting_id == $curr_setting_id) { $value = $setting_value; break; } } reset($setting); if ($found) { break; } } // next, if the setting is dynamic, convert the stored value if ($default_value_type == "dynamic") { // dynamic setting values should ALWAYS be of the form "setting_name,module_folder/'core'". If they're not, just ignore it $parts = explode(",", $value); if (count($parts) == 2) { $value = ft_get_settings($parts[0], $parts[1]); } } // if this setting type is a dropdown list and $value is non-empty, get the list of options if ($curr_setting_field_type == "option_list_or_form_field" && !empty($value)) { if (preg_match("/^form_field/", $value)) { $value = ft_get_mapped_form_field_data($value); } else { $value = ft_get_option_list($value); } } $placeholders[$identifier] = $value; } echo ft_eval_smarty_string($markup_with_placeholders, $placeholders); }
/** * This function is tightly coupled with ft_get_email_components and has gotten increasingly more awful as * time passed. It examines the content of an email template and detects any field and file attachments. * Field attachments are files that have been uploaded through a form field; file attachments are just files * on the server that want to be sent out. It then returns the updated email template (i.e. minus the * attachment string) and information about the attachment (file name, location, mimetype) for use by the * emailing function (only Swift Mailer module at this time). * * @param string $template_str the email template (HTML or text) * @param integer $form_id * @param array $submission_placeholders */ function _ft_extract_email_attachment_info($template_str, $form_id, $submission_placeholders) { global $g_root_dir; // see if there are any filename placeholders (i.e. uploaded files in this submission) $file_field_name_to_filename_hash = array(); while (list($placeholder, $value) = each($submission_placeholders)) { if (!preg_match("/^FILENAME_/", $placeholder)) { continue; } $field_name = preg_replace("/^FILENAME_/", "", $placeholder); $file_field_name_to_filename_hash[$field_name] = $value; } $attachment_info = array(); if (!empty($file_field_name_to_filename_hash)) { // if there are any fields marked as attachments, store them and remove the attachment string $field_attachments_regexp = '/\\{\\$attachment\\s+field=("|\')(.+)("|\')\\}/'; if (preg_match_all($field_attachments_regexp, $template_str, $matches)) { foreach ($matches[2] as $field_name) { $field_id = ft_get_form_field_id_by_field_name($field_name, $form_id); if (!empty($field_name) && array_key_exists($field_name, $file_field_name_to_filename_hash)) { $field_settings = ft_get_field_settings($field_id); $file_upload_dir = $field_settings["folder_path"]; $file_and_path = "{$file_upload_dir}/{$file_field_name_to_filename_hash[$field_name]}"; if (is_file($file_and_path)) { $info = array("field_name" => $field_name, "file_and_path" => $file_and_path, "filename" => $file_field_name_to_filename_hash[$field_name], "mimetype" => mime_content_type($file_and_path)); $attachment_info[] = $info; } } } $template_str = preg_replace($field_attachments_regexp, "", $template_str); } } $file_attachments_regexp = '/\\{\\$attachment\\s+file=("|\')(.+)("|\')\\}/'; if (preg_match_all($file_attachments_regexp, $template_str, $matches)) { foreach ($matches[2] as $file_and_relative_path) { if (is_file("{$g_root_dir}/{$file_and_relative_path}")) { $pathinfo = pathinfo($file_and_relative_path); $file_name = $pathinfo["basename"]; $info = array("file_and_path" => "{$g_root_dir}/{$file_and_relative_path}", "filename" => $file_name); $attachment_info[] = $info; } } $template_str = preg_replace($file_attachments_regexp, "", $template_str); } $file_attachments_regexp = '/\\{\\$attachment\\s+fieldvalue=("|\')(.+)("|\')\\}/'; if (preg_match_all($file_attachments_regexp, $template_str, $matches)) { foreach ($matches[2] as $file_and_relative_path) { $file_and_relative_path = ft_eval_smarty_string("{\$" . $file_and_relative_path . "}", $submission_placeholders); if (is_file("{$g_root_dir}/{$file_and_relative_path}")) { $pathinfo = pathinfo($file_and_relative_path); $file_name = $pathinfo["basename"]; $info = array("file_and_path" => "{$g_root_dir}/{$file_and_relative_path}", "filename" => $file_name); $attachment_info[] = $info; } } $template_str = preg_replace($file_attachments_regexp, "", $template_str); } return array($template_str, $attachment_info); }
// get a list of all existing Option Lists; this is used to ensure the uniqueness of the option list names // (necessary only from a user point of view) $lists = ft_get_option_lists("all"); $list_names = array(); foreach ($lists["results"] as $curr_list_info) { if ($list_id == $curr_list_info["list_id"]) { continue; } $list_names[] = "\"" . htmlspecialchars($curr_list_info["option_list_name"]) . "\""; } $list_names = implode(",", $list_names); $existing_option_list_names_js = "page_ns.option_list_names = [{$list_names}];"; // ------------------------------------------------------------------------------------------------ // compile template info $page_vars["list_info"] = $list_info; $page_vars["text_option_list_used_by_fields"] = ft_eval_smarty_string($LANG["text_option_list_used_by_fields"], $placeholders); $page_vars["tabs"] = $tabs; $page_vars["page_url"] = ft_get_page_url("edit_option_list"); $page_vars["head_title"] = $LANG["phrase_edit_option_list"]; $page_vars["num_fields_using_option_list"] = $num_fields; $page_vars["total_options"] = $total_options; $page_vars["sortable_id"] = $sortable_id; $page_vars["js_messages"] = array("word_delete", "validation_no_smart_fill_values", "validation_invalid_url", "validation_smart_fill_no_field_found", "validation_smart_fill_cannot_fill", "validation_smart_fill_invalid_field_type", "validation_smart_fill_upload_all_pages", "validation_upload_html_files_only", "validation_smart_fill_no_page", "validation_no_option_list_name", "validation_option_list_name_taken", "validation_num_rows_to_add", "word_error", "word_okay", "phrase_please_confirm", "word_yes", "word_no", "confirm_delete_group", "phrase_create_group", "word_cancel", "notify_field_options_smart_filled"); $page_vars["head_string"] = <<<END <script src="{$g_root_url}/global/scripts/manage_option_lists.js"></script> <script src="{$g_root_url}/global/scripts/sortable.js?v=2"></script> END; $page_vars["head_js"] = <<<END var page_ns = {}; page_ns.page_initialized = false; page_ns.ungroup_options_dialog = \$("<div></div>");
list($g_success, $g_message) = ft_update_account_settings($request); } // if required, update the list of available languages if (isset($_GET["refresh_lang_list"])) { list($g_success, $g_message) = ft_refresh_language_list(); } $replacement_info = array("datefunctionlink" => '<a href="http://ca3.php.net/manual/en/function.date.php" target="_blank">date()</a>'); // ------------------------------------------------------------------------------------------------ // compile the theme vars $page_vars = array(); $page_vars["page"] = "accounts"; $page_vars["page_url"] = ft_get_page_url("settings_accounts"); $page_vars["tabs"] = $tabs; $page_vars["head_title"] = "{$LANG["word_settings"]} - {$LANG["word_accounts"]}"; $page_vars["text_date_formatting_link"] = ft_eval_smarty_string($LANG["text_date_formatting_link"], $replacement_info); $page_vars["phrase_one_special_char"] = ft_eval_smarty_string($LANG["phrase_one_special_char"], array("chars" => $g_password_special_chars)); $page_vars["head_js"] = <<<END var rules = []; rules.push("required,default_page_titles,{$LANG["validation_no_page_titles"]}"); rules.push("required,default_client_menu_id,{$LANG["validation_no_menu_id"]}"); rules.push("required,default_theme,{$LANG["validation_no_theme"]}"); rules.push("function,validate_swatch"); rules.push("required,default_login_page,{$LANG["validation_no_login_page"]}"); rules.push("required,default_logout_url,{$LANG["validation_no_logout_url"]}"); rules.push("required,default_language,{$LANG["validation_no_default_language"]}"); rules.push("required,default_sessions_timeout,{$LANG["validation_no_default_sessions_timeout"]}"); rules.push("digits_only,default_sessions_timeout,{$LANG["validation_invalid_default_sessions_timeout"]}"); rules.push("required,default_date_format,{$LANG["validation_no_date_format"]}"); function validate_swatch() { var theme = \$("#default_theme").val();
/** * This function upgrades the Form Tools Core. As of 2.0.3, it works very simply: this gets called * every time a person goes to the login page, the function is called. It contains all the * updates made to the script since the original release and based on the release date of the users * current build, only upgrades the more recent changes. Since $g_release_date was only added in 2.0.3, * there's a helper function that contains the dates of the main releases, to ensure those are updated * properly. * * The changes here are listed in the changelog: http://docs.formtools.org/changelog.php * * @return array a hash with the following keys: * "upgraded" => (boolean) true if the script did just attempt to upgrade, false otherwise * "success" => (boolean) if an upgrade attempt was made, this determines whether it was * successful or not * "message" => the error message, if unsuccessful */ function ft_upgrade_form_tools() { global $g_table_prefix, $g_current_version, $g_release_type, $g_release_date, $LANG, $g_default_datetime_format; $upgrade_attempted = false; $success = ""; $message = ""; $old_version_info = ft_get_core_version_info(); // upgrading to 2.1.0 can take a while (not THIS long, but this should be safe) set_time_limit(600); // ---------------------------------------------------------------------------------------------- // 2.0.0 beta updates if ($old_version_info["release_date"] < 20090113) { // add the Hooks table @mysql_query("\r\n CREATE TABLE {$g_table_prefix}hooks (\r\n hook_id mediumint(8) unsigned NOT NULL auto_increment,\r\n action_location enum('start','end') NOT NULL,\r\n module_folder varchar(255) NOT NULL,\r\n core_function varchar(255) NOT NULL,\r\n hook_function varchar(255) NOT NULL,\r\n priority tinyint(4) NOT NULL default '50',\r\n PRIMARY KEY (hook_id)\r\n ) DEFAULT CHARSET=utf8\r\n "); } if ($old_version_info["release_date"] < 20090301) { @mysql_query("\r\n ALTER TABLE {$g_table_prefix}email_templates\r\n CHANGE email_reply_to email_reply_to\r\n ENUM('none', 'admin', 'client', 'user', 'custom')\r\n CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL\r\n "); } if ($old_version_info["release_date"] < 20090317) { @mysql_query("\r\n ALTER TABLE {$g_table_prefix}views\r\n ADD may_add_submissions ENUM('yes', 'no') NOT NULL DEFAULT 'no'\r\n "); } if ($old_version_info["release_date"] < 20090402) { @mysql_query("\r\n ALTER TABLE {$g_table_prefix}hooks\r\n ADD hook_type ENUM('code', 'template') NOT NULL DEFAULT 'code' AFTER hook_id\r\n "); @mysql_query("\r\n ALTER TABLE {$g_table_prefix}hooks\r\n CHANGE action_location action_location VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL\r\n "); @mysql_query("\r\n ALTER TABLE {$g_table_prefix}account_settings\r\n CHANGE setting_value setting_value MEDIUMTEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL\r\n "); } if ($old_version_info["release_date"] < 20090510) { @mysql_query("\r\n ALTER TABLE {$g_table_prefix}view_fields\r\n ADD is_searchable ENUM('yes','no') NOT NULL DEFAULT 'yes' AFTER is_editable\r\n "); } // bug #117 if ($old_version_info["release_date"] < 20090627) { @mysql_query("\r\n ALTER TABLE {$g_table_prefix}view_filters\r\n CHANGE operator operator ENUM('equals', 'not_equals', 'like', 'not_like', 'before', 'after')\r\n CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'equals'\r\n "); } if ($old_version_info["release_date"] < 20090815) { @mysql_query("\r\n ALTER TABLE {$g_table_prefix}forms\r\n ADD edit_submission_page_label TEXT NULL\r\n "); // for upgrades, for maximum language compatibility set all the form Edit Submission Labels to // $LANG.phrase_edit_submission. They can always change it to English or whatever language they // want. New installations will have that value set to the administrator's language $forms = ft_get_forms(); foreach ($forms as $form_info) { $form_id = $form_info["form_id"]; @mysql_query("\r\n UPDATE {$g_table_prefix}forms\r\n SET edit_submission_page_label = '{\$LANG.phrase_edit_submission|upper}'\r\n WHERE form_id = {$form_id}\r\n "); } } if ($old_version_info["release_date"] < 20090826) { // bug fix for previous version which had a syntax error $query = mysql_query("SHOW COLUMNS FROM {$g_table_prefix}forms"); $has_edit_submission_page_label_field = false; while ($row = mysql_fetch_assoc($query)) { if ($row["Field"] == "edit_submission_page_label") { $has_edit_submission_page_label_field = true; } } if (!$has_edit_submission_page_label_field) { @mysql_query("ALTER TABLE {$g_table_prefix}forms ADD edit_submission_page_label TEXT NULL"); $forms = ft_get_forms(); foreach ($forms as $form_info) { $form_id = $form_info["form_id"]; @mysql_query("\r\n UPDATE {$g_table_prefix}forms\r\n SET edit_submission_page_label = '{\$LANG.phrase_edit_submission|upper}'\r\n WHERE form_id = {$form_id}\r\n "); } } } if ($old_version_info["release_date"] < 20091113) { @mysql_query("ALTER TABLE {$g_table_prefix}view_filters ADD filter_type ENUM('standard', 'client_map') NOT NULL DEFAULT 'standard' AFTER view_id"); @mysql_query("ALTER TABLE {$g_table_prefix}views ADD has_standard_filter ENUM('yes', 'no') NOT NULL DEFAULT 'no'"); @mysql_query("ALTER TABLE {$g_table_prefix}views ADD has_client_map_filter ENUM('yes', 'no') NOT NULL DEFAULT 'no'"); // set the has_standard_filter value to "yes" for any Views that have a filter defined $query = @mysql_query("SELECT view_id FROM {$g_table_prefix}view_filters GROUP BY view_id"); while ($row = mysql_fetch_assoc($query)) { $view_id = $row["view_id"]; @mysql_query("UPDATE {$g_table_prefix}views SET has_standard_filter = 'yes' WHERE view_id = {$view_id}"); } } // this version introduced an improved "form email fields" feature that lets you mark multiple email // fields as having significance for the email mechanism. All DB changes relate to this new feature. if ($old_version_info["release_date"] < 20100118) { // [1] misc DB column updates @mysql_query("\r\n ALTER TABLE {$g_table_prefix}email_templates\r\n ADD email_from_form_email_id MEDIUMINT UNSIGNED NULL AFTER email_from_account_id\r\n "); @mysql_query("\r\n ALTER TABLE {$g_table_prefix}email_templates\r\n ADD email_reply_to_form_email_id MEDIUMINT UNSIGNED NULL AFTER email_reply_to_account_id\r\n "); // [2] email_from DB field update $email_from_query = mysql_query("\r\n SELECT email_id\r\n FROM {$g_table_prefix}email_templates\r\n WHERE email_from = 'user'\r\n "); @mysql_query("\r\n ALTER TABLE {$g_table_prefix}email_templates\r\n CHANGE email_from email_from ENUM('admin', 'client', 'form_email_field', 'custom', 'none')\r\n CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL\r\n "); while ($row = mysql_fetch_assoc($email_from_query)) { $email_id = $row["email_id"]; mysql_query("\r\n UPDATE {$g_table_prefix}email_templates\r\n SET email_from = 'form_email_field'\r\n WHERE email_id = {$email_id}\r\n "); } // [3] email_reply_to DB field update $email_reply_to_query = mysql_query("\r\n SELECT email_id\r\n FROM {$g_table_prefix}email_templates\r\n WHERE email_reply_to = 'user'\r\n "); @mysql_query("\r\n ALTER TABLE {$g_table_prefix}email_templates\r\n CHANGE email_reply_to email_reply_to ENUM('admin', 'client', 'form_email_field', 'custom', 'none')\r\n CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL\r\n "); while ($row = mysql_fetch_assoc($email_reply_to_query)) { $email_id = $row["email_id"]; mysql_query("\r\n UPDATE {$g_table_prefix}email_templates\r\n SET email_reply_to = 'form_email_field'\r\n WHERE email_id = {$email_id}\r\n "); } // [4] create our new form_email_fields table @mysql_query("\r\n CREATE TABLE {$g_table_prefix}form_email_fields (\r\n form_email_id MEDIUMINT unsigned NOT NULL auto_increment,\r\n form_id MEDIUMINT UNSIGNED NOT NULL,\r\n email_field VARCHAR( 255 ) NOT NULL,\r\n first_name_field VARCHAR( 255 ) NULL,\r\n last_name_field VARCHAR( 255 ) NULL,\r\n PRIMARY KEY (form_email_id)\r\n ) DEFAULT CHARSET=utf8\r\n "); // [5] rename the "recipient_user_type" enum options to call the "user" option "form_email_field" instead, // but first, store all the recipient_ids so we can update them after the DB change $recipients_id_query = @mysql_query("\r\n SELECT recipient_id\r\n FROM {$g_table_prefix}email_template_recipients\r\n WHERE recipient_user_type = 'user'\r\n "); @mysql_query("\r\n ALTER TABLE {$g_table_prefix}email_template_recipients\r\n CHANGE recipient_user_type recipient_user_type ENUM('admin', 'client', 'form_email_field', 'custom')\r\n CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL\r\n "); @mysql_query("\r\n ALTER TABLE {$g_table_prefix}email_template_recipients\r\n ADD form_email_id MEDIUMINT UNSIGNED NULL AFTER account_id\r\n "); while ($row = mysql_fetch_assoc($recipients_id_query)) { // we can safely set the form_email_id to 1 for these because after upgrading they will // have one and only one form email ID $recipient_id = $row["recipient_id"]; mysql_query("\r\n UPDATE {$g_table_prefix}email_template_recipients\r\n SET recipient_user_type = 'form_email_field',\r\n form_email_id = 1\r\n WHERE recipient_id = {$recipient_id}\r\n "); } // [6] now update the old "user" email field data to the new "form email field" table // and update the corresponding DB tables $forms_query = @mysql_query("SELECT form_id, user_email_field, user_first_name_field, user_last_name_field FROM {$g_table_prefix}forms"); while ($form_info = mysql_fetch_assoc($forms_query)) { $form_id = $form_info["form_id"]; $user_email_field = $form_info["user_email_field"]; $user_first_name_field = $form_info["user_first_name_field"]; $user_last_name_field = $form_info["user_last_name_field"]; if (!empty($user_email_field)) { // create the new email field @mysql_query("\r\n INSERT INTO {$g_table_prefix}form_email_fields (form_id, email_field, first_name_field, last_name_field)\r\n VALUES ({$form_id}, '{$user_email_field}', '{$user_first_name_field}', '{$user_last_name_field}')\r\n "); $form_email_id = mysql_insert_id(); // "from" @mysql_query("\r\n UPDATE {$g_table_prefix}email_templates\r\n SET email_from_form_email_id = {$form_email_id}\r\n WHERE form_id = {$form_id} AND\r\n email_from = 'form_email_field'\r\n "); // "reply-to" @mysql_query("\r\n UPDATE {$g_table_prefix}email_templates\r\n SET email_reply_to_form_email_id = {$form_email_id}\r\n WHERE form_id = {$form_id} AND\r\n email_reply_to = 'form_email_field'\r\n "); // "to" @mysql_query("\r\n UPDATE {$g_table_prefix}email_template_recipients\r\n SET form_email_id = {$form_email_id}\r\n WHERE form_id = {$form_id} AND\r\n recipient_user_type = 'form_email_field'\r\n "); } } // delete the old fields in the forms table. They're not needed any more @mysql_query("ALTER TABLE {$g_table_prefix}forms DROP COLUMN user_email_field"); @mysql_query("ALTER TABLE {$g_table_prefix}forms DROP COLUMN user_first_name_field"); @mysql_query("ALTER TABLE {$g_table_prefix}forms DROP COLUMN user_last_name_field"); } // ---------------------------------------------------------------------------------------------- // 2.0.3 beta updates if ($old_version_info["release_date"] < 20100731) { // add the default security setting fields $settings = array("default_max_failed_login_attempts" => "", "min_password_length" => "", "required_password_chars" => "", "num_password_history" => "", "clients_may_edit_max_failed_login_attempts" => ""); ft_set_settings($settings); // now set the default values for all clients. This sucks, obviously - but eventually the // whole inheritance model for client account settings will be overhauled and replaced with a // "Client Group" system $client_settings = array("min_password_length" => "", "num_failed_login_attempts" => 0, "num_password_history" => "", "required_password_chars" => "", "may_edit_max_failed_login_attempts" => ""); $clients = ft_get_client_list(); foreach ($clients as $client_info) { // add the current password to the password history queue $client_settings["password_history"] = $client_info["password"]; ft_set_account_settings($client_info["account_id"], $client_settings); } } if ($old_version_info["release_date"] < 20100908) { // convert all core tables to MyISAM $core_tables = array("accounts", "account_settings", "client_forms", "client_views", "email_templates", "email_template_edit_submission_views", "email_template_recipients", "field_options", "field_option_groups", "field_settings", "forms", "form_email_fields", "form_fields", "hooks", "menus", "menu_items", "modules", "module_menu_items", "multi_page_form_urls", "public_form_omit_list", "public_view_omit_list", "settings", "sessions", "themes", "views", "view_fields", "view_filters", "view_tabs"); foreach ($core_tables as $table) { @mysql_query("ALTER TABLE {$g_table_prefix}{$table} TYPE=MyISAM"); @mysql_query("ALTER TABLE {$g_table_prefix}{$table} ENGINE=MyISAM"); } // convert all the custom tables to MyISAM as well $forms = ft_get_forms(); foreach ($forms as $form_info) { $form_id = $form_info["form_id"]; @mysql_query("ALTER TABLE {$g_table_prefix}form_{$form_id} TYPE=MyISAM"); @mysql_query("ALTER TABLE {$g_table_prefix}form_{$form_id} ENGINE=MyISAM"); } } // ---------------------------------------------------------------------------------------------- // 2.1.0 if ($old_version_info["release_date"] < 20110509) { // create the new 2.1.0 tables (this is only ever done once!) $check_tables_query = mysql_query("SHOW TABLES"); $existing_tables = array(); while ($row = mysql_fetch_array($check_tables_query)) { $existing_tables[] = $row[0]; } if (!in_array("{$g_table_prefix}field_type_setting_options", $existing_tables)) { $query = mysql_query("\r\n CREATE TABLE {$g_table_prefix}field_type_setting_options (\r\n setting_id mediumint(9) NOT NULL,\r\n option_text varchar(255) default NULL,\r\n option_value varchar(255) default NULL,\r\n option_order smallint(6) NOT NULL,\r\n is_new_sort_group enum('yes','no') NOT NULL,\r\n PRIMARY KEY (setting_id,option_order)\r\n ) DEFAULT CHARSET=utf8\r\n "); // textbox - size mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (1, 'Tiny', 'cf_size_tiny', 1, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (1, 'Small', 'cf_size_small', 2, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (1, 'Medium', 'cf_size_medium', 3, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (1, 'Large', 'cf_size_large', 4, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (1, 'Full Width', 'cf_size_full_width', 5, 'yes')"); // textbox - highlight mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (3, 'Orange', 'cf_colour_orange', 3, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (3, 'Yellow', 'cf_colour_yellow', 4, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (3, 'Red', 'cf_colour_red', 2, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (3, 'None', '', 1, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (3, 'Green', 'cf_colour_green', 5, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (3, 'Blue', 'cf_colour_blue', 6, 'yes')"); // textarea - height mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (5, 'Tiny (30px)', 'cf_size_tiny', 1, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (5, 'Small (80px)', 'cf_size_small', 2, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (5, 'Medium (150px)', 'cf_size_medium', 3, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (5, 'Large (300px)', 'cf_size_large', 4, 'yes')"); // textarea - highlight mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (6, 'None', '', 1, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (6, 'Red', 'cf_colour_red', 2, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (6, 'Orange', 'cf_colour_orange', 3, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (6, 'Yellow', 'cf_colour_yellow', 4, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (6, 'Green', 'cf_colour_green', 5, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (6, 'Blue', 'cf_colour_blue', 6, 'yes')"); // textarea - input length mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (7, 'No Limit', '', 1, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (7, 'Words', 'words', 2, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (7, 'Characters', 'chars', 3, 'yes')"); // radios mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (17, 'Horizontal', 'horizontal', 1, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (17, 'Vertical', 'vertical', 2, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (17, '2 Columns', 'cf_option_list_2cols', 3, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (17, '3 Columns', 'cf_option_list_3cols', 4, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (17, '4 Columns', 'cf_option_list_4cols', 5, 'yes')"); // checkboxes mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (20, 'Horizontal', 'horizontal', 1, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (20, 'Vertical', 'vertical', 2, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (20, '2 Columns', 'cf_option_list_2cols', 3, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (20, '3 Columns', 'cf_option_list_3cols', 4, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (20, '4 Columns', 'cf_option_list_4cols', 5, 'yes')"); // date mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (22, '2011-11-30', 'yy-mm-dd', 1, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (22, '30/11/2011 (dd/mm/yyyy)', 'dd/mm/yy', 2, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (22, '11/30/2011 (mm/dd/yyyy)', 'mm/dd/yy', 3, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (22, 'Nov 30, 2011', 'M d, yy', 4, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (22, 'November 30, 2011', 'MM d, yy', 5, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (22, 'Wed Nov 30, 2011 ', 'D M d, yy', 6, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (22, 'Wednesday, November 30, 2011', 'DD, MM d, yy', 7, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (22, '30. 08. 2011.', 'dd. mm. yy.', 8, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (22, '30/11/2011 8:00 PM', 'datetime:dd/mm/yy|h:mm TT|ampm`true', 9, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (22, '11/30/2011 8:00 PM', 'datetime:mm/dd/yy|h:mm TT|ampm`true', 10, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (22, '2011-11-30 8:00 PM', 'datetime:yy-mm-dd|h:mm TT|ampm`true', 11, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (22, '2011-11-30 20:00', 'datetime:yy-mm-dd|hh:mm', 12, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (22, '2011-11-30 20:00:00', 'datetime:yy-mm-dd|hh:mm:ss|showSecond`true', 13, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (22, '30. 08. 2011. 20:00', 'datetime:dd. mm. yy.|hh:mm', 14, 'yes')"); // time mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (24, '8:00 AM', 'h:mm TT|ampm`true', 1, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (24, '16:00', 'hh:mm|ampm`false', 2, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (24, '16:00:00', 'hh:mm:ss|showSecond`true|ampm`false', 3, 'yes')"); // code / markup mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (28, 'CSS', 'CSS', 1, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (28, 'HTML', 'HTML', 2, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (28, 'JavaScript', 'JavaScript', 3, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (28, 'XML', 'XML', 4, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (29, 'Tiny (50px)', '50', 1, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (29, 'Small (100px)', '100', 2, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (29, 'Medium (200px)', '200', 3, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES (29, 'Large (400px)', '400', 4, 'yes')"); } if (!in_array("{$g_table_prefix}field_type_settings", $existing_tables)) { $query = mysql_query("\r\n CREATE TABLE {$g_table_prefix}field_type_settings (\r\n setting_id mediumint(8) unsigned NOT NULL auto_increment,\r\n field_type_id mediumint(8) unsigned NOT NULL,\r\n field_label varchar(255) NOT NULL,\r\n field_setting_identifier varchar(50) NOT NULL,\r\n field_type enum('textbox','textarea','radios','checkboxes','select','multi-select','option_list_or_form_field') NOT NULL,\r\n field_orientation enum('horizontal','vertical','na') NOT NULL default 'na',\r\n default_value_type enum('static','dynamic') NOT NULL default 'static',\r\n default_value varchar(255) default NULL,\r\n list_order smallint(6) NOT NULL,\r\n PRIMARY KEY (setting_id)\r\n ) DEFAULT CHARSET=utf8\r\n "); // textbox mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (1, 1, 'Size', 'size', 'select', 'na', 'static', 'cf_size_medium', 1)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (2, 1, 'Max Length', 'maxlength', 'textbox', 'na', 'static', '', 2)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (3, 1, 'Highlight', 'highlight', 'select', 'na', 'static', '', 4)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (4, 1, 'Field Comments', 'comments', 'textarea', 'na', 'static', '', 3)"); // textarea mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (5, 2, 'Height', 'height', 'select', 'na', 'static', 'cf_size_small', 1)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (6, 2, 'Highlight Colour', 'highlight_colour', 'select', 'na', 'static', '', 3)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (7, 2, 'Input length limit', 'input_length', 'radios', 'horizontal', 'static', '', 4)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (8, 2, '- Max length (words/chars)', 'maxlength', 'textbox', 'na', 'static', '', 5)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (9, 2, 'Field Comments', 'comments', 'textarea', 'na', 'static', '', 2)"); // password mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (10, 3, 'Field Comments', 'comments', 'textarea', 'na', 'static', '', 1)"); // dropdown mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (11, 4, 'Option List / Contents', 'contents', 'option_list_or_form_field', 'na', 'static', '', 1)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (12, 4, 'Field Comments', 'comments', 'textarea', 'na', 'static', '', 2)"); // multi-select dropdown mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (13, 5, 'Option List / Contents', 'contents', 'option_list_or_form_field', 'na', 'static', '', 1)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (14, 5, 'Num Rows', 'num_rows', 'textbox', 'na', 'static', '5', 2)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (15, 5, 'Field Comments', 'comments', 'textarea', 'na', 'static', '', 3)"); // radios mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (16, 6, 'Option List / Contents', 'contents', 'option_list_or_form_field', 'na', 'static', '', 1)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (17, 6, 'Formatting', 'formatting', 'select', 'na', 'static', 'horizontal', 2)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (18, 6, 'Field Comments', 'comments', 'textarea', 'na', 'static', '', 3)"); // checkboxes mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (19, 7, 'Option List / Contents', 'contents', 'option_list_or_form_field', 'na', 'static', '', 1)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (20, 7, 'Formatting', 'formatting', 'select', 'na', 'static', 'horizontal', 2)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (21, 7, 'Field Comments', 'comments', 'textarea', 'na', 'static', '', 3)"); // date mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (22, 8, 'Custom Display Format', 'display_format', 'select', 'na', 'static', 'yy-mm-dd', 1)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (23, 8, 'Field Comments', 'comments', 'textarea', 'na', 'static', '', 2)"); // time mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (24, 9, 'Custom Display Format', 'display_format', 'select', 'na', 'static', 'h:mm TT|ampm`true', 1)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (25, 9, 'Field Comments', 'comments', 'textarea', 'na', 'static', '', 2)"); // phone number mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (26, 10, 'Phone Number Format', 'phone_number_format', 'textbox', 'na', 'static', '(xxx) xxx-xxxx', 1)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (27, 10, 'Field Comments', 'comments', 'textarea', 'na', 'static', '', 2)"); // code / markup mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (28, 11, 'Code / Markup Type', 'code_markup', 'select', 'na', 'static', 'HTML', 1)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (29, 11, 'Height', 'height', 'select', 'na', 'static', '200', 2)"); mysql_query("INSERT INTO {$g_table_prefix}field_type_settings VALUES (30, 11, 'Field Comments', 'comments', 'textarea', 'na', 'static', '', 3)"); } if (!in_array("{$g_table_prefix}field_types", $existing_tables)) { $query = mysql_query("\r\n CREATE TABLE {$g_table_prefix}field_types (\r\n field_type_id mediumint(8) unsigned NOT NULL auto_increment,\r\n is_editable enum('yes','no') NOT NULL,\r\n non_editable_info mediumtext,\r\n managed_by_module_id mediumint(9) default NULL,\r\n field_type_name varchar(255) NOT NULL,\r\n field_type_identifier varchar(50) NOT NULL,\r\n group_id smallint(6) NOT NULL,\r\n is_file_field enum('yes','no') NOT NULL default 'no',\r\n is_date_field enum('yes','no') NOT NULL default 'no',\r\n raw_field_type_map varchar(50) default NULL,\r\n raw_field_type_map_multi_select_id mediumint(9) default NULL,\r\n list_order smallint(6) NOT NULL,\r\n compatible_field_sizes varchar(255) NOT NULL,\r\n view_field_smarty_markup mediumtext NOT NULL,\r\n edit_field_smarty_markup mediumtext NOT NULL,\r\n php_processing mediumtext NOT NULL,\r\n resources_css mediumtext,\r\n resources_js mediumtext,\r\n PRIMARY KEY (field_type_id)\r\n ) DEFAULT CHARSET=utf8\r\n "); mysql_query("INSERT INTO {$g_table_prefix}field_types VALUES (1, 'no', '{\$LANG.text_non_deletable_fields}', NULL, '{\$LANG.word_textbox}', 'textbox', 1, 'no', 'no', 'textbox', NULL, 1, '1char,2chars,tiny,small,medium,large,very_large', '\r\n', '<input type=\"text\" name=\"{\$NAME}\" value=\"{\$VALUE|escape}\" \r\n class=\"{\$size}{if \$highlight} {\$highlight}{/if}\" \r\n {if \$maxlength}maxlength=\"{\$maxlength}\"{/if} />\r\n \r\n{if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments}</div>\r\n{/if}\r\n', '\r\n', 'input.cf_size_tiny {\r\n width: 30px; \r\n}\r\ninput.cf_size_small {\r\n width: 80px; \r\n}\r\ninput.cf_size_medium {\r\n width: 150px; \r\n}\r\ninput.cf_size_large {\r\n width: 250px;\r\n}\r\ninput.cf_size_full_width {\r\n width: 99%; \r\n}\r\n\r\n', '')"); mysql_query("INSERT INTO {$g_table_prefix}field_types VALUES (2, 'yes', NULL, NULL, '{\$LANG.word_textarea}', 'textarea', 1, 'no', 'no', 'textarea', NULL, 2, 'medium,large,very_large', '{\$VALUE|nl2br}', '{* figure out all the classes *}\r\n{assign var=classes value=\$height}\r\n{if \$highlight_colour}\r\n {assign var=classes value=\"`\$classes` `\$highlight_colour`\"}\r\n{/if}\r\n{if \$input_length == \"words\" && \$maxlength != \"\"}\r\n {assign var=classes value=\"`\$classes` cf_wordcounter max`\$maxlength`\"}\r\n{else if \$input_length == \"chars\" && \$maxlength != \"\"}\r\n {assign var=classes value=\"`\$classes` cf_textcounter max`\$maxlength`\"}\r\n{/if}\r\n\r\n<textarea name=\"{\$NAME}\" id=\"{\$NAME}_id\" class=\"{\$classes}\">{\$VALUE}</textarea>\r\n\r\n{if \$input_length == \"words\" && \$maxlength != \"\"}\r\n <div class=\"cf_counter\" id=\"{\$NAME}_counter\">\r\n {\$maxlength} word limit. <span></span> remaining words\r\n </div>\r\n{elseif \$input_length == \"chars\" && \$max_length != \"\"}\r\n <div class=\"cf_counter\" id=\"{\$NAME}_counter\">\r\n {\$maxlength} characters limit. <span></span> remaining characters\r\n </div>\r\n{/if}\r\n\r\n{if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments|nl2br}</div>\r\n{/if}\r\n', '', '.cf_counter span {\r\n font-weight: bold; \r\n}\r\ntextarea {\r\n width: 99%;\r\n}\r\ntextarea.cf_size_tiny {\r\n height: 30px;\r\n}\r\ntextarea.cf_size_small {\r\n height: 80px; \r\n}\r\ntextarea.cf_size_medium {\r\n height: 150px; \r\n}\r\ntextarea.cf_size_large {\r\n height: 300px;\r\n}\r\n', '/**\r\n * The following code provides a simple text/word counter option for any \r\n * textarea. It either just keeps counting up, or limits the results to a\r\n * certain number - all depending on what the user has selected via the\r\n * field type settings.\r\n */\r\nvar cf_counter = {};\r\ncf_counter.get_max_count = function(el) {\r\n var classes = \$(el).attr(''class'').split(\" \").slice(-1);\r\n var max = null;\r\n for (var i=0; i<classes.length; i++) {\r\n var result = classes[i].match(/max(\\\\d+)/);\r\n if (result != null) {\r\n max = result[1];\r\n break;\r\n }\r\n }\r\n return max;\r\n}\r\n\r\n\$(function() {\r\n \$(\"textarea[class~=''cf_wordcounter'']\").each(function() {\r\n var max = cf_counter.get_max_count(this);\r\n if (max == null) {\r\n return;\r\n }\r\n \$(this).bind(\"keydown\", function() {\r\n var val = \$(this).val();\r\n var len = val.split(/[\\\\s]+/);\r\n var field_name = \$(this).attr(\"name\");\r\n var num_words = len.length - 1;\r\n if (num_words > max) {\r\n var allowed_words = val.split(/[\\\\s]+/, max);\r\n truncated_str = allowed_words.join(\" \");\r\n \$(this).val(truncated_str);\r\n } else {\r\n \$(\"#\" + field_name + \"_counter\").find(\"span\").html(parseInt(max) - parseInt(num_words));\r\n }\r\n }); \r\n \$(this).trigger(\"keydown\");\r\n });\r\n\r\n \$(\"textarea[class~=''cf_textcounter'']\").each(function() {\r\n var max = cf_counter.get_max_count(this);\r\n if (max == null) {\r\n return;\r\n }\r\n \$(this).bind(\"keydown\", function() { \r\n var field_name = \$(this).attr(\"name\"); \r\n if (this.value.length > max) {\r\n this.value = this.value.substring(0, max);\r\n } else {\r\n \$(\"#\" + field_name + \"_counter\").find(\"span\").html(max - this.value.length);\r\n }\r\n });\r\n \$(this).trigger(\"keydown\");\r\n }); \r\n});\r\n\r\n')"); mysql_query("INSERT INTO {$g_table_prefix}field_types VALUES (3, 'yes', NULL, NULL, '{\$LANG.word_password}', 'password', 1, 'no', 'no', 'password', NULL, 3, '1char,2chars,tiny,small,medium', '\r\n', '<input type=\"password\" name=\"{\$NAME}\" value=\"{\$VALUE|escape}\" \r\n class=\"cf_password\" />\r\n \r\n{if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments}</div>\r\n{/if}\r\n', '', 'input.cf_password {\r\n width: 120px;\r\n}\r\n', '')"); mysql_query("INSERT INTO {$g_table_prefix}field_types VALUES (4, 'yes', NULL, NULL, '{\$LANG.word_dropdown}', 'dropdown', 1, 'no', 'no', 'select', 11, 6, '1char,2chars,tiny,small,medium,large', '{if \$contents != \"\"}\r\n {assign var=counter value=\"1\"}\r\n {foreach from=\$.options item=curr_group_info name=group}\r\n {assign var=group_info value=\$curr_group_info.group_info}\r\n {assign var=options value=\$curr_group_info.options}\r\n {foreach from=\$options item=option name=row}\r\n {if \$VALUE == \$option.option_value}{\$option.option_name}{/if}\r\n {/foreach}\r\n {/foreach}\r\n{/if}', '{if \$contents == \"\"}\r\n <div class=\"cf_field_comments\">\r\n This field isn''t assigned to an Option List. \r\n </div>\r\n{else}\r\n <select name=\"{\$NAME}\">\r\n {foreach from=\$contents.options item=curr_group_info name=group}\r\n {assign var=group_info value=\$curr_group_info.group_info}\r\n {assign var=options value=\$curr_group_info.options}\r\n {if \$group_info.group_name}\r\n <optgroup label=\"{\$group_info.group_name|escape}\">\r\n {/if}\r\n {foreach from=\$options item=option name=row}\r\n <option value=\"{\$option.option_value}\"\r\n {if \$VALUE == \$option.option_value}selected{/if}>{\$option.option_name}</option>\r\n {/foreach}\r\n {if \$group_info.group_name}\r\n </optgroup>\r\n {/if}\r\n {/foreach}\r\n </select>\r\n{/if}\r\n\r\n{if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments}</div>\r\n{/if}\r\n\r\n', '', '', '')"); mysql_query("INSERT INTO {$g_table_prefix}field_types VALUES (5, 'yes', NULL, NULL, '{\$LANG.phrase_multi_select_dropdown}', 'multi_select_dropdown', 1, 'no', 'no', 'multi-select', 13, 7, '1char,2chars,tiny,small,medium,large', '{if \$contents != \"\"}\r\n {assign var=vals value=\"`\$g_multi_val_delimiter`\"|explode:\$VALUE}\r\n {assign var=is_first value=true}\r\n {strip}\r\n {foreach from=\$contents.options item=curr_group_info name=group}\r\n {assign var=options value=\$curr_group_info.options}\r\n {foreach from=\$options item=option name=row}\r\n {if \$option.option_value|in_array:\$vals}\r\n {if \$is_first == false}, {/if}\r\n {\$option.option_name}\r\n {assign var=is_first value=false}\r\n {/if}\r\n {/foreach}\r\n {/foreach}\r\n {/strip}\r\n{/if}', '{if \$contents == \"\"}\r\n <div class=\"cf_field_comments\">\r\n This field isn''t assigned to an Option List. \r\n </div>\r\n{else}\r\n {assign var=vals value=\"`\$g_multi_val_delimiter`\"|explode:\$VALUE}\r\n <select name=\"{\$NAME}[]\" multiple size=\"{if \$num_rows}{\$num_rows}{else}5{/if}\">\r\n {foreach from=\$contents.options item=curr_group_info name=group}\r\n {assign var=group_info value=\$curr_group_info.group_info}\r\n {assign var=options value=\$curr_group_info.options}\r\n {if \$group_info.group_name}\r\n <optgroup label=\"{\$group_info.group_name|escape}\">\r\n {/if}\r\n {foreach from=\$options item=option name=row}\r\n <option value=\"{\$option.option_value}\"\r\n {if \$option.option_value|in_array:\$vals}selected{/if}>{\$option.option_name}</option>\r\n {/foreach}\r\n {if \$group_info.group_name}\r\n </optgroup>\r\n {/if}\r\n {/foreach}\r\n </select>\r\n{/if}\r\n\r\n{if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments}</div>\r\n{/if}\r\n', '', '', '')"); mysql_query("INSERT INTO {$g_table_prefix}field_types VALUES (6, 'yes', NULL, NULL, '{\$LANG.phrase_radio_buttons}', 'radio_buttons', 1, 'no', 'no', 'radio-buttons', 16, 4, '1char,2chars,tiny,small,medium,large', '{if \$contents != \"\"}\r\n {assign var=counter value=\"1\"}\r\n {foreach from=\$contents.options item=curr_group_info name=group}\r\n {assign var=group_info value=\$curr_group_info.group_info}\r\n {assign var=options value=\$curr_group_info.options}\r\n {foreach from=\$options item=option name=row}\r\n {if \$VALUE == \$option.option_value}{\$option.option_name}{/if}\r\n {/foreach}\r\n {/foreach}\r\n{/if}\r\n', '{if \$contents == \"\"}\r\n <div class=\"cf_field_comments\">\r\n This field isn''t assigned to an Option List. \r\n </div>\r\n{else}\r\n {assign var=is_in_columns value=false}\r\n {if \$formatting == \"cf_option_list_2cols\" || \r\n \$formatting == \"cf_option_list_3cols\" || \r\n \$formatting == \"cf_option_list_4cols\"}\r\n {assign var=is_in_columns value=true}\r\n {/if}\r\n\r\n {assign var=counter value=\"1\"}\r\n {foreach from=\$contents.options item=curr_group_info name=group}\r\n {assign var=group_info value=\$curr_group_info.group_info}\r\n {assign var=options value=\$curr_group_info.options}\r\n\r\n {if \$group_info.group_name}\r\n <div class=\"cf_option_list_group_label\">{\$group_info.group_name}</div>\r\n {/if}\r\n\r\n {if \$is_in_columns}<div class=\"{\$formatting}\">{/if}\r\n\r\n {foreach from=\$options item=option name=row}\r\n {if \$is_in_columns}<div class=\"column\">{/if}\r\n <input type=\"radio\" name=\"{\$NAME}\" id=\"{\$NAME}_{\$counter}\" \r\n value=\"{\$option.option_value}\"\r\n {if \$VALUE == \$option.option_value}checked{/if} />\r\n <label for=\"{\$NAME}_{\$counter}\">{\$option.option_name}</label>\r\n {if \$is_in_columns}</div>{/if}\r\n {if \$formatting == \"vertical\"}<br />{/if}\r\n {assign var=counter value=\$counter+1}\r\n {/foreach}\r\n\r\n {if \$is_in_columns}</div>{/if}\r\n {/foreach}\r\n\r\n {if \$comments}<div class=\"cf_field_comments\">{\$comments}</div>{/if}\r\n{/if}\r\n', '', '/* All CSS styles for this field type are found in Shared Resources */\r\n', '')"); mysql_query("INSERT INTO {$g_table_prefix}field_types VALUES (7, 'yes', NULL, NULL, '{\$LANG.word_checkboxes}', 'checkboxes', 1, 'no', 'no', 'checkboxes', 19, 5, '1char,2chars,tiny,small,medium,large', '{if \$contents != \"\"}\r\n {assign var=vals value=\"`\$g_multi_val_delimiter`\"|explode:\$VALUE}\r\n {assign var=is_first value=true}\r\n {strip}\r\n {foreach from=\$contents.options item=curr_group_info name=group}\r\n {assign var=options value=\$curr_group_info.options}\r\n {foreach from=\$options item=option name=row}\r\n {if \$option.option_value|in_array:\$vals}\r\n {if \$is_first == false}, {/if}\r\n {\$option.option_name}\r\n {assign var=is_first value=false}\r\n {/if}\r\n {/foreach}\r\n {/foreach}\r\n {/strip}\r\n{/if}', '{if \$contents == \"\"}\r\n <div class=\"cf_field_comments\">\r\n This field isn''t assigned to an Option List. \r\n </div>\r\n{else}\r\n {assign var=vals value=\"`\$g_multi_val_delimiter`\"|explode:\$VALUE}\r\n {assign var=is_in_columns value=false}\r\n {if \$formatting == \"cf_option_list_2cols\" || \r\n \$formatting == \"cf_option_list_3cols\" || \r\n \$formatting == \"cf_option_list_4cols\"}\r\n {assign var=is_in_columns value=true}\r\n {/if}\r\n\r\n {assign var=counter value=\"1\"}\r\n {foreach from=\$contents.options item=curr_group_info name=group}\r\n {assign var=group_info value=\$curr_group_info.group_info}\r\n {assign var=options value=\$curr_group_info.options}\r\n\r\n {if \$group_info.group_name}\r\n <div class=\"cf_option_list_group_label\">{\$group_info.group_name}</div>\r\n {/if}\r\n\r\n {if \$is_in_columns}<div class=\"{\$formatting}\">{/if}\r\n\r\n {foreach from=\$options item=option name=row}\r\n {if \$is_in_columns}<div class=\"column\">{/if}\r\n <input type=\"checkbox\" name=\"{\$NAME}[]\" id=\"{\$NAME}_{\$counter}\" \r\n value=\"{\$option.option_value|escape}\" \r\n {if \$option.option_value|in_array:\$vals}checked{/if} />\r\n <label for=\"{\$NAME}_{\$counter}\">{\$option.option_name}</label>\r\n {if \$is_in_columns}</div>{/if}\r\n {if \$formatting == \"vertical\"}<br />{/if}\r\n {assign var=counter value=\$counter+1}\r\n {/foreach}\r\n\r\n {if \$is_in_columns}</div>{/if}\r\n {/foreach}\r\n\r\n {if {\$comments}\r\n <div class=\"cf_field_comments\">{\$comments}</div> \r\n {/if}\r\n{/if}\r\n', '', '/* all CSS is found in Shared Resources */\r\n', '')"); mysql_query("\r\n INSERT INTO {$g_table_prefix}field_types (field_type_id, is_editable, non_editable_info, managed_by_module_id, field_type_name,\r\n field_type_identifier, group_id, is_file_field, is_date_field, raw_field_type_map, raw_field_type_map_multi_select_id,\r\n list_order, compatible_field_sizes, view_field_smarty_markup, edit_field_smarty_markup, php_processing,\r\n resources_css, resources_js)\r\n VALUES (8, 'no', '{\$LANG.text_non_deletable_fields}', NULL, 'Date', 'date', 2, 'no', 'yes', '', NULL, 1, 'small', '', '', '',\r\n '.cf_datepicker {\r\n width: 160px; \r\n}\r\n.cf_datetimepicker {\r\n width: 160px; \r\n}\r\n.ui-datepicker-trigger {\r\n cursor: pointer; \r\n}\r\n',\r\n '\$(function() {\r\n // the datetimepicker has a bug that prevents the icon from appearing. So\r\n // instead, we add the image manually into the page and assign the open event\r\n // handler to the image\r\n var default_settings = {\r\n changeYear: true,\r\n changeMonth: true \r\n }\r\n\r\n \$(\".cf_datepicker\").each(function() {\r\n var field_name = \$(this).attr(\"name\");\r\n var settings = default_settings;\r\n if (\$(\"#\" + field_name + \"_id\").length) {\r\n settings.dateFormat = \$(\"#\" + field_name + \"_format\").val();\r\n }\r\n \$(this).datepicker(settings);\r\n \$(\"#\" + field_name + \"_icon_id\").bind(\"click\",\r\n { field_id: \"#\" + field_name + \"_id\" }, function(e) { \r\n \$.datepicker._showDatepicker(\$(e.data.field_id)[0]);\r\n });\r\n });\r\n \r\n \$(\".cf_datetimepicker\").each(function() {\r\n var field_name = \$(this).attr(\"name\");\r\n var settings = default_settings;\r\n if (\$(\"#\" + field_name + \"_id\").length) {\r\n var settings_str = \$(\"#\" + field_name + \"_format\").val();\r\n settings_str = settings_str.replace(/datetime:/, \"\");\r\n var settings_list = settings_str.split(\"|\");\r\n var settings = {};\r\n settings.dateFormat = settings_list[0];\r\n settings.timeFormat = settings_list[1]; \r\n for (var i=2; i<settings_list.length; i++) {\r\n var parts = settings_list[i].split(\"`\");\r\n if (parts[1] === \"true\") {\r\n parts[1] = true;\r\n }\r\n settings[parts[0]] = parts[1];\r\n }\r\n }\r\n \$(this).datetimepicker(settings);\r\n \$(\"#\" + field_name + \"_icon_id\").bind(\"click\",\r\n { field_id: \"#\" + field_name + \"_id\" }, function(e) { \r\n \$.datepicker._showDatepicker(\$(e.data.field_id)[0]);\r\n });\r\n }); \r\n});')"); mysql_query("INSERT INTO {$g_table_prefix}field_types VALUES (9, 'yes', NULL, NULL, '{\$LANG.word_time}', 'time', 2, 'no', 'no', '', NULL, 2, 'small', '', '<div class=\"cf_date_group\">\r\n <input type=\"input\" name=\"{\$NAME}\" value=\"{\$VALUE}\" class=\"cf_datefield cf_timepicker\" />\r\n <input type=\"hidden\" id=\"{\$NAME}_id\" value=\"{\$display_format}\" />\r\n \r\n {if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments}</div>\r\n {/if}\r\n</div>\r\n', '\r\n', '.cf_timepicker {\r\n width: 60px; \r\n}\r\n.ui-timepicker-div .ui-widget-header{ margin-bottom: 8px; }\r\n.ui-timepicker-div dl{ text-align: left; }\r\n.ui-timepicker-div dl dt{ height: 25px; }\r\n.ui-timepicker-div dl dd{ margin: -25px 0 10px 65px; }\r\n.ui-timepicker-div td { font-size: 90%; }\r\n\r\n', '\$(function() { \r\n var default_settings = {\r\n buttonImage: g.root_url + \"/global/images/clock.png\", \r\n showOn: \"both\",\r\n buttonImageOnly: true\r\n }\r\n \$(\".cf_timepicker\").each(function() {\r\n var field_name = \$(this).attr(\"name\");\r\n var settings = default_settings;\r\n if (\$(\"#\" + field_name + \"_id\").length) {\r\n var settings_list = \$(\"#\" + field_name + \"_id\").val().split(\"|\"); \r\n if (settings_list.length > 0) {\r\n settings.timeFormat = settings_list[0];\r\n for (var i=1; i<settings_list.length; i++) {\r\n var parts = settings_list[i].split(\"`\");\r\n if (parts[1] === \"true\") {\r\n parts[1] = true;\r\n } else if (parts[1] === \"false\") {\r\n parts[1] = false;\r\n }\r\n settings[parts[0]] = parts[1];\r\n }\r\n }\r\n }\r\n \$(this).timepicker(settings);\r\n });\r\n});\r\n\r\n')"); mysql_query("INSERT INTO {$g_table_prefix}field_types VALUES (10, 'yes', NULL, NULL, '{\$LANG.phrase_phone_number}', 'phone', 2, 'no', 'no', '', NULL, 3, 'small,medium', '{php}\r\n\$format = \$this->get_template_vars(\"phone_number_format\");\r\n\$values = explode(\"|\", \$this->get_template_vars(\"VALUE\"));\r\n\$pieces = preg_split(\"/(x+)/\", \$format, 0, PREG_SPLIT_DELIM_CAPTURE);\r\n\$counter = 1;\r\n\$output = \"\";\r\n\$has_content = false;\r\nforeach (\$pieces as \$piece)\r\n{\r\n if (empty(\$piece))\r\n continue;\r\n\r\n if (\$piece[0] == \"x\") { \r\n \$value = (isset(\$values[\$counter-1])) ? \$values[\$counter-1] : \"\";\r\n \$output .= \$value;\r\n if (!empty(\$value))\r\n {\r\n \$has_content = true;\r\n }\r\n \$counter++;\r\n } else {\r\n \$output .= \$piece;\r\n }\r\n}\r\n\r\nif (!empty(\$output) && \$has_content)\r\n echo \$output;\r\n{/php}', '{php}\r\n\$format = \$this->get_template_vars(\"phone_number_format\");\r\n\$values = explode(\"|\", \$this->get_template_vars(\"VALUE\"));\r\n\$name = \$this->get_template_vars(\"NAME\");\r\n\r\n\$pieces = preg_split(\"/(x+)/\", \$format, 0, PREG_SPLIT_DELIM_CAPTURE);\r\n\$counter = 1;\r\nforeach (\$pieces as \$piece)\r\n{\r\n if (strlen(\$piece) == 0)\r\n continue;\r\n\r\n if (\$piece[0] == \"x\") {\r\n \$size = strlen(\$piece); \r\n \$value = (isset(\$values[\$counter-1])) ? \$values[\$counter-1] : \"\";\r\n \$value = htmlspecialchars(\$value);\r\n echo \"<input type=\\\\\"text\\\\\" name=\\\\\"{\$name}_\$counter\\\\\" value=\\\\\"\$value\\\\\"\r\n size=\\\\\"\$size\\\\\" maxlength=\\\\\"\$size\\\\\" />\";\r\n \$counter++;\r\n } else {\r\n echo \$piece;\r\n }\r\n}\r\n{/php}\r\n{if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments}</div>\r\n{/if}\r\n', '\$field_name = \$vars[\"field_info\"][\"field_name\"];\r\n\$joiner = \"|\";\r\n\r\n\$count = 1;\r\n\$parts = array();\r\nwhile (isset(\$vars[\"data\"][\"{\$field_name}_\$count\"]))\r\n{\r\n \$parts[] = \$vars[\"data\"][\"{\$field_name}_\$count\"];\r\n \$count++;\r\n}\r\n\$value = implode(\"|\", \$parts);\r\n\r\n\r\n', '', '')"); mysql_query("INSERT INTO {$g_table_prefix}field_types VALUES (11, 'yes', NULL, NULL, '{\$LANG.phrase_code_markup_field}', 'code_markup', 2, 'no', 'no', 'textarea', NULL, 4, 'large,very_large', '{if \$CONTEXTPAGE == \"edit_submission\"}\r\n <textarea id=\"{\$NAME}_id\" name=\"{\$NAME}\">{\$VALUE}</textarea>\r\n <script>\r\n var code_mirror_{\$NAME} = new CodeMirror.fromTextArea(\"{\$NAME}_id\", \r\n {literal}{{/literal}\r\n height: \"{\$SIZE_PX}px\",\r\n path: \"{\$g_root_url}/global/codemirror/js/\",\r\n readOnly: true,\r\n {if \$code_markup == \"HTML\" || \$code_markup == \"XML\"}\r\n parserfile: [\"parsexml.js\"],\r\n stylesheet: \"{\$g_root_url}/global/codemirror/css/xmlcolors.css\"\r\n {elseif \$code_markup == \"CSS\"}\r\n parserfile: [\"parsecss.js\"],\r\n stylesheet: \"{\$g_root_url}/global/codemirror/css/csscolors.css\"\r\n {elseif \$code_markup == \"JavaScript\"} \r\n parserfile: [\"tokenizejavascript.js\", \"parsejavascript.js\"],\r\n stylesheet: \"{\$g_root_url}/global/codemirror/css/jscolors.css\"\r\n {/if}\r\n {literal}});{/literal}\r\n </script>\r\n{else}\r\n {\$VALUE|strip_tags}\r\n{/if}\r\n', '<div class=\"editor\">\r\n <textarea id=\"{\$NAME}_id\" name=\"{\$NAME}\">{\$VALUE}</textarea>\r\n</div>\r\n<script>\r\n var code_mirror_{\$NAME} = new CodeMirror.fromTextArea(\"{\$NAME}_id\", \r\n {literal}{{/literal}\r\n height: \"{\$SIZE_PX}px\",\r\n path: \"{\$g_root_url}/global/codemirror/js/\",\r\n {if \$code_markup == \"HTML\" || \$code_markup == \"XML\"}\r\n parserfile: [\"parsexml.js\"],\r\n stylesheet: \"{\$g_root_url}/global/codemirror/css/xmlcolors.css\"\r\n {elseif \$code_markup == \"CSS\"}\r\n parserfile: [\"parsecss.js\"],\r\n stylesheet: \"{\$g_root_url}/global/codemirror/css/csscolors.css\"\r\n {elseif \$code_markup == \"JavaScript\"} \r\n parserfile: [\"tokenizejavascript.js\", \"parsejavascript.js\"],\r\n stylesheet: \"{\$g_root_url}/global/codemirror/css/jscolors.css\"\r\n {/if}\r\n {literal}});{/literal}\r\n</script>\r\n\r\n{if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments}</div>\r\n{/if}\r\n', '', '.cf_view_markup_field {\r\n margin: 0px; \r\n}\r\n', '')"); } if (!in_array("{$g_table_prefix}field_types", $existing_tables)) { $query = mysql_query("\r\n CREATE TABLE {$g_table_prefix}list_groups (\r\n group_id mediumint(8) unsigned NOT NULL auto_increment,\r\n group_type varchar(50) NOT NULL,\r\n group_name varchar(255) NOT NULL,\r\n custom_data text NOT NULL,\r\n list_order smallint(6) NOT NULL,\r\n PRIMARY KEY (group_id)\r\n ) DEFAULT CHARSET=utf8\r\n "); $standard_fields = ft_sanitize($LANG["phrase_standard_fields"]); $special_fields = ft_sanitize($LANG["phrase_special_fields"]); mysql_query("INSERT INTO {$g_table_prefix}list_groups (group_type, group_name, list_order) VALUES ('field_types', '{$standard_fields}', 1)"); mysql_query("INSERT INTO {$g_table_prefix}list_groups (group_type, group_name, list_order) VALUES ('field_types', '{$special_fields}', 2)"); } // this will automatically fail if the fields already exist @mysql_query("\r\n ALTER TABLE {$g_table_prefix}modules\r\n ADD is_premium ENUM('yes', 'no') NOT NULL DEFAULT 'no' AFTER is_enabled,\r\n ADD module_key VARCHAR(15) NULL AFTER is_premium\r\n "); @mysql_query("ALTER TABLE {$g_table_prefix}field_types ADD view_field_rendering_type ENUM('none', 'php', 'smarty') NOT NULL DEFAULT 'none' AFTER compatible_field_sizes"); @mysql_query("ALTER TABLE {$g_table_prefix}field_types ADD view_field_php_function VARCHAR(255) NULL AFTER view_field_rendering_type"); @mysql_query("ALTER TABLE {$g_table_prefix}field_types ADD view_field_php_function_source VARCHAR(255) NULL AFTER view_field_rendering_type"); mysql_query("ALTER TABLE {$g_table_prefix}hooks RENAME {$g_table_prefix}hook_calls"); mysql_query("ALTER TABLE {$g_table_prefix}hook_calls CHANGE core_function function_name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL"); // okay! At this point, we've created the new tables for the field types & can safely add the new file and tinyMCE field // types. In order to upgrade to 2.1.0, the user MUST have installed the WYSIWYG and file upload modules ft_update_module_list(); // not installed? Return an error. Note: the above code will NOT be re-inser if (!ft_check_module_available("field_type_file")) { return array("upgraded" => true, "success" => false, "message" => "Sorry, the <b>File Upload module</b> isn't installed. In order to upgrade to 2.1.0 or later, you must upload that module to your /modules folder, then refresh this page."); } if (!ft_check_module_available("field_type_tinymce")) { return array("upgraded" => true, "success" => false, "message" => "Sorry, the <b>TinyMCE Field</b> module isn't installed. In order to upgrade to 2.1.0 or later, you must upload that module to your /modules folder, then refresh this page."); } // okay, now this is a balancing act. At this point in the upgrade, SOME of the database has been updated, but not // all. The thing is, in order to upgrade the DB to use the file and WYSIWYG fields (and port over their old values // to the new DB structure) we need to ensure those two modules are installed. The code at the top of this section // ensured that those two modules are in fact found in the folder, but now we need to install them as well $modules = ft_get_modules(); foreach ($modules as $module_info) { $module_id = $module_info["module_id"]; $is_installed = $module_info["is_installed"]; if ($is_installed == "yes") { continue; } ft_install_module(array("install" => $module_id)); } $query = @mysql_query("\r\n CREATE TABLE {$g_table_prefix}new_view_submission_defaults (\r\n view_id mediumint(9) NOT NULL,\r\n field_id mediumint(9) NOT NULL,\r\n default_value text NOT NULL,\r\n list_order smallint(6) NOT NULL,\r\n PRIMARY KEY (view_id,field_id)\r\n ) DEFAULT CHARSET=utf8\r\n "); $query = @mysql_query("\r\n CREATE TABLE {$g_table_prefix}view_columns (\r\n view_id mediumint(9) NOT NULL,\r\n field_id mediumint(9) NOT NULL,\r\n list_order smallint(6) NOT NULL,\r\n is_sortable enum('yes','no') NOT NULL,\r\n auto_size enum('yes','no') NOT NULL default 'yes',\r\n custom_width varchar(10) default NULL,\r\n truncate enum('truncate','no_truncate') NOT NULL default 'truncate',\r\n PRIMARY KEY (view_id,field_id,list_order)\r\n ) DEFAULT CHARSET=utf8\r\n "); // changed Tables: simple changes that don't require any data manipulation mysql_query("ALTER TABLE {$g_table_prefix}accounts ADD last_logged_in DATETIME NULL AFTER account_status"); mysql_query("ALTER TABLE {$g_table_prefix}accounts CHANGE username username VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL"); mysql_query("ALTER TABLE {$g_table_prefix}accounts CHANGE password password VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL"); mysql_query("ALTER TABLE {$g_table_prefix}menu_items ADD is_new_sort_group ENUM('yes','no') NOT NULL DEFAULT 'yes' AFTER is_submenu"); mysql_query("ALTER TABLE {$g_table_prefix}field_options ADD is_new_sort_group ENUM('yes','no') NOT NULL DEFAULT 'yes'"); mysql_query("ALTER TABLE {$g_table_prefix}field_options CHANGE field_group_id list_id MEDIUMINT(8) UNSIGNED NOT NULL"); mysql_query("ALTER TABLE {$g_table_prefix}form_fields ADD is_new_sort_group ENUM('yes','no') NOT NULL DEFAULT 'yes' AFTER list_order"); mysql_query("ALTER TABLE {$g_table_prefix}form_fields CHANGE field_size field_size VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'medium'"); mysql_query("ALTER TABLE {$g_table_prefix}field_settings CHANGE setting_value setting_value MEDIUMTEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT ''"); mysql_query("ALTER TABLE {$g_table_prefix}view_fields ADD is_new_sort_group ENUM('yes','no') NOT NULL DEFAULT 'yes'"); mysql_query("ALTER TABLE {$g_table_prefix}views ADD is_new_sort_group ENUM('yes','no') NOT NULL DEFAULT 'yes' AFTER view_order"); mysql_query("ALTER TABLE {$g_table_prefix}views ADD group_id SMALLINT NULL AFTER is_new_sort_group"); mysql_query("ALTER TABLE {$g_table_prefix}forms DROP default_view_id"); mysql_query("ALTER TABLE {$g_table_prefix}forms ADD form_type ENUM('internal','external') NOT NULL DEFAULT 'external' AFTER form_id"); mysql_query("ALTER TABLE {$g_table_prefix}forms ADD add_submission_button_label VARCHAR(255) NULL DEFAULT '{$LANG["word_add_rightarrow"]}'"); mysql_query("ALTER TABLE {$g_table_prefix}forms CHANGE form_url form_url VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL"); mysql_query("INSERT INTO {$g_table_prefix}settings (setting_name, setting_value, module) VALUES ('edit_submission_shared_resources_js', '\$(function() {\r\n \$(\".fancybox\").fancybox();\r\n});\r\n', 'core')"); mysql_query("INSERT INTO {$g_table_prefix}settings (setting_name, setting_value, module) VALUES ('edit_submission_shared_resources_css', '/* used in the \"Highlight\" setting for most field types */\r\n.cf_colour_red { \r\n background-color: #990000;\r\n color: white;\r\n}\r\n.cf_colour_orange {\r\n background-color: orange; \r\n}\r\n.cf_colour_yellow {\r\n background-color: yellow; \r\n}\r\n.cf_colour_green {\r\n background-color: green;\r\n color: white; \r\n}\r\n.cf_colour_blue {\r\n background-color: #336699; \r\n color: white; \r\n}\r\n\r\n/* field comments */\r\n.cf_field_comments {\r\n font-style: italic;\r\n color: #999999;\r\n clear: both;\r\n}\r\n\r\n/* column layouts for radios & checkboxes */\r\n.cf_option_list_group_label {\r\n font-weight: bold; \r\n clear: both;\r\n margin-left: 4px;\r\n}\r\n.cf_option_list_2cols, .cf_option_list_3cols, .cf_option_list_4cols {\r\n clear: both; \r\n}\r\n.cf_option_list_2cols .column { \r\n width: 50%;\r\n float: left; \r\n}\r\n.cf_option_list_3cols .column { \r\n width: 33%;\r\n float: left;\r\n}\r\n.cf_option_list_4cols .column { \r\n width: 25%;\r\n float: left;\r\n}\r\n\r\n/* Used for the date and time pickers */\r\n.cf_date_group img {\r\n margin-bottom: -4px;\r\n padding: 1px;\r\n}\r\n\r\n', 'core')"); mysql_query("INSERT INTO {$g_table_prefix}settings (setting_name, setting_value, module) VALUES ('edit_submission_onload_resources', '<script src=\"{\$g_root_url}/global/codemirror/js/codemirror.js\"></script>|<script src=\"{\$g_root_url}/global/scripts/jquery-ui-timepicker-addon.js\"></script>|<script src=\"{\$g_root_url}/global/fancybox/jquery.fancybox-1.3.4.pack.js\"></script> |<link rel=\"stylesheet\" href=\"{\$g_root_url}/global/fancybox/jquery.fancybox-1.3.4.css\" type=\"text/css\" media=\"screen\" />', 'core')"); $forms_page_default_message = ft_sanitize($LANG["text_client_welcome"]); mysql_query("INSERT INTO {$g_table_prefix}settings (setting_name, setting_value, module) VALUES ('forms_page_default_message', '{$forms_page_default_message}', 'core')"); mysql_query("UPDATE {$g_table_prefix}settings SET setting_name = 'num_option_lists_per_page' WHERE setting_name = 'num_field_option_groups_per_page'"); // Field Option Groups are now called Option Lists mysql_query("ALTER TABLE {$g_table_prefix}field_option_groups RENAME {$g_table_prefix}option_lists"); mysql_query("ALTER TABLE {$g_table_prefix}option_lists CHANGE group_id list_id MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT"); mysql_query("ALTER TABLE {$g_table_prefix}option_lists CHANGE group_name option_list_name VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL"); mysql_query("ALTER TABLE {$g_table_prefix}option_lists ADD is_grouped ENUM('yes', 'no') NOT NULL DEFAULT 'no' AFTER option_list_name"); // may not be necessary, but just to make sure mysql_query("\r\n ALTER TABLE {$g_table_prefix}view_filters\r\n CHANGE operator operator ENUM('equals', 'not_equals', 'like', 'not_like', 'before', 'after')\r\n CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'equals'\r\n "); // not used anymore! Dependency tracking is entirely handled by formtools.org mysql_query("ALTER TABLE {$g_table_prefix}themes DROP supports_ft_versions"); mysql_query("ALTER TABLE {$g_table_prefix}modules DROP supports_ft_versions"); // next, we need up update menus to change field_option_groups to option_lists. Since the user may have tweaked the // menu label to say whatever they want, only update the actual label if it was the original English "Field Option Groups" $menu_items_query = mysql_query("\r\n SELECT *\r\n FROM {$g_table_prefix}menu_items\r\n WHERE page_identifier = 'field_option_groups'\r\n "); while ($row = mysql_fetch_assoc($menu_items_query)) { $menu_item_id = $row["menu_item_id"]; $display_text_clause = ""; if ($row["display_text"] == "Field Option Groups") { $display_text = ft_sanitize($LANG["phrase_option_lists"]); $display_text_clause = ", display_text = '{$display_text}'"; } mysql_query("\r\n UPDATE {$g_table_prefix}menu_items\r\n SET page_identifier = 'option_lists',\r\n url = '/admin/forms/option_lists/'\r\n {$display_text_clause}\r\n WHERE menu_item_id = {$menu_item_id}\r\n "); } mysql_query("DELETE FROM {$g_table_prefix}menu_items WHERE page_identifier = 'settings_wysiwyg'"); mysql_query("\r\n UPDATE {$g_table_prefix}menu_items\r\n SET page_identifier = 'add_form_choose_type',\r\n url = '/admin/forms/add/'\r\n WHERE page_identifier = 'add_form1'\r\n "); // all Views are now grouped. Add in a default group for each $forms_query = mysql_query("SELECT form_id FROM {$g_table_prefix}forms WHERE is_complete = 'yes'"); $views_label = ft_sanitize($LANG["word_views"]); while ($row = mysql_fetch_assoc($forms_query)) { $form_id = $row["form_id"]; mysql_query("\r\n INSERT INTO {$g_table_prefix}list_groups (group_type, group_name, custom_data, list_order)\r\n VALUES ('form_{$form_id}_view_group', '{$views_label}', '', 1)\r\n "); $new_group_id = mysql_insert_id(); mysql_query("\r\n UPDATE {$g_table_prefix}views\r\n SET group_id = {$new_group_id}\r\n WHERE form_id = {$form_id}\r\n "); } // the field options table now groups the options. What we need to do here is create a group for all items in each // Option List mysql_query("ALTER TABLE {$g_table_prefix}field_options ADD list_group_id MEDIUMINT NOT NULL AFTER list_id"); $field_options = mysql_query("SELECT DISTINCT list_id FROM {$g_table_prefix}field_options"); while ($row = mysql_fetch_assoc($field_options)) { $list_id = $row["list_id"]; mysql_query("\r\n INSERT INTO {$g_table_prefix}list_groups (group_type, group_name, custom_data, list_order)\r\n VALUES ('option_list_{$list_id}', '', '', 1)\r\n "); $new_group_id = mysql_insert_id(); mysql_query("UPDATE {$g_table_prefix}field_options SET list_group_id = {$new_group_id} WHERE list_id = {$list_id}"); } // field types are now field type IDs. This has significant impact. $forms = ft_get_forms(); $form_changes = array(); $date_system_field_ids = array(); $fields_with_option_lists = array(); foreach ($forms as $form_info) { $form_id = $form_info["form_id"]; $fields = ft_get_form_fields($form_id); $field_types = array(); // stores field IDs grouped by field type (key == old field type name string) $field_col_to_id_map = array(); $field_id_to_option_list_id = array(); foreach ($fields as $field_info) { $field_id = $field_info["field_id"]; if (!array_key_exists($field_info["field_type"], $field_types)) { $field_types[$field_info["field_type"]] = array(); } if ($field_info["field_type"] == "system" && ($field_info["col_name"] == "last_modified_date" || $field_info["col_name"] == "submission_date")) { $date_system_field_ids[] = $field_id; } $field_types[$field_info["field_type"]][] = $field_id; $field_col_to_id_map[$field_info["col_name"]] = $field_id; if (!empty($field_info["field_group_id"])) { $field_id_to_option_list_id[$field_info["field_id"]] = $field_info["field_group_id"]; } } $form_changes[$form_id] = array("field_types" => $field_types, "field_col_to_id_map" => $field_col_to_id_map, "fields_with_option_lists" => $field_id_to_option_list_id); } // update the core field names for all forms foreach ($forms as $form_info) { $form_id = $form_info["form_id"]; if ($form_info["is_complete"] == "no") { continue; } mysql_query("\r\n UPDATE {$g_table_prefix}form_fields\r\n SET field_name = 'core__submission_id'\r\n WHERE col_name = 'submission_id' AND\r\n field_type = 'system'\r\n "); mysql_query("\r\n UPDATE {$g_table_prefix}form_fields\r\n SET field_name = 'core__last_modified'\r\n WHERE col_name = 'last_modified_date' AND\r\n field_type = 'system'\r\n "); mysql_query("\r\n UPDATE {$g_table_prefix}form_fields\r\n SET field_name = 'core__submission_date'\r\n WHERE col_name = 'submission_date' AND\r\n field_type = 'system'\r\n "); mysql_query("\r\n UPDATE {$g_table_prefix}form_fields\r\n SET field_name = 'core__ip_address'\r\n WHERE col_name = 'ip_address' AND\r\n field_type = 'system'\r\n "); } mysql_query("ALTER TABLE {$g_table_prefix}form_fields CHANGE field_type field_type_id SMALLINT NOT NULL DEFAULT '1'"); mysql_query("ALTER TABLE {$g_table_prefix}form_fields ADD is_system_field ENUM('yes','no') NOT NULL DEFAULT 'no' AFTER field_type_id"); $field_types = ft_get_field_types(); $field_type_map = array(); foreach ($field_types as $row) { $field_type_map[$row["field_type_identifier"]] = $row["field_type_id"]; } // existing ENUM key => new field type identifier $textbox_field_type_id = ft_get_field_type_id_by_identifier("textbox"); $date_field_type_id = ft_get_field_type_id_by_identifier("date"); $map = array("textbox" => $field_type_map["textbox"], "textarea" => $field_type_map["textarea"], "password" => $field_type_map["password"], "select" => $field_type_map["dropdown"], "multi-select" => $field_type_map["multi_select_dropdown"], "radio-buttons" => $field_type_map["radio_buttons"], "checkboxes" => $field_type_map["checkboxes"], "date" => $field_type_map["date"], "file" => $field_type_map["file"], "wysiwyg" => $field_type_map["tinymce"], "system" => $textbox_field_type_id); while (list($form_id, $changes) = each($form_changes)) { while (list($field_label, $field_ids) = each($changes["field_types"])) { foreach ($field_ids as $field_id) { $field_type_id = $map[$field_label]; if (in_array($field_id, $date_system_field_ids)) { $field_type_id = $date_field_type_id; } $is_system_field = $field_label == "system" ? "yes" : "no"; mysql_query("\r\n UPDATE {$g_table_prefix}form_fields\r\n SET field_type_id = {$field_type_id},\r\n is_system_field = '{$is_system_field}'\r\n WHERE field_id = {$field_id}\r\n "); } } } reset($form_changes); // next, the form_email_fields table now uses IDs instead of col names. Update it! $email_updates = array(); foreach ($forms as $form_info) { $form_id = $form_info["form_id"]; $email_field_query = mysql_query("\r\n SELECT *\r\n FROM {$g_table_prefix}form_email_fields\r\n WHERE form_id = {$form_id}\r\n "); $email_fields = array(); while ($field_info = mysql_fetch_assoc($email_field_query)) { $email_fields[] = array("form_email_id" => $field_info["form_email_id"], "email_field_id" => array_key_exists($field_info["email_field"], $form_changes[$form_id]["field_col_to_id_map"]) ? $form_changes[$form_id]["field_col_to_id_map"][$field_info["email_field"]] : "", "first_name_field_id" => array_key_exists($field_info["first_name_field"], $form_changes[$form_id]["field_col_to_id_map"]) ? $form_changes[$form_id]["field_col_to_id_map"][$field_info["first_name_field"]] : "NULL", "last_name_field_id" => array_key_exists($field_info["last_name_field"], $form_changes[$form_id]["field_col_to_id_map"]) ? $form_changes[$form_id]["field_col_to_id_map"][$field_info["last_name_field"]] : "NULL"); } $email_updates[$form_id] = $email_fields; } mysql_query("ALTER TABLE {$g_table_prefix}form_email_fields CHANGE email_field email_field_id MEDIUMINT(9) NOT NULL"); mysql_query("ALTER TABLE {$g_table_prefix}form_email_fields CHANGE first_name_field first_name_field_id MEDIUMINT(9) NULL DEFAULT NULL"); mysql_query("ALTER TABLE {$g_table_prefix}form_email_fields CHANGE last_name_field last_name_field_id MEDIUMINT(9) NULL DEFAULT NULL"); while (list($form_id, $changes) = each($email_updates)) { foreach ($changes as $email_change_info) { $form_email_id = $email_change_info["form_email_id"]; $email_field_id = $email_change_info["email_field_id"]; if (empty($email_field_id) || !is_numeric($email_field_id)) { continue; } $first_name_field_id = !empty($email_change_info["first_name_field_id"]) ? "'{$email_change_info["first_name_field_id"]}'" : "NULL"; $last_name_field_id = !empty($email_change_info["last_name_field_id"]) ? "'{$email_change_info["last_name_field_id"]}'" : "NULL"; mysql_query("\r\n UPDATE {$g_table_prefix}form_email_fields\r\n SET email_field_id = {$email_field_id},\r\n first_name_field_id = {$first_name_field_id},\r\n last_name_field_id = {$last_name_field_id}\r\n WHERE form_email_id = {$form_email_id}\r\n "); } } // now update the View fields table. The is_column and is_sortable info is now stored in the view_columns table $view_cols = array(); foreach ($forms as $form_info) { $form_id = $form_info["form_id"]; $view_query = mysql_query("SELECT view_id FROM {$g_table_prefix}views WHERE form_id = {$form_id}"); $view_ids = array(); while ($view_info = mysql_fetch_assoc($view_query)) { $view_ids[] = $view_info["view_id"]; } foreach ($view_ids as $view_id) { // we can't use ft_get_view_fields here because the Core code references DB changes // that can't be made yet $view_fields_query = mysql_query("\r\n SELECT field_id, tab_number, is_column, is_sortable\r\n FROM {$g_table_prefix}view_fields\r\n WHERE view_id = {$view_id}\r\n "); while ($view_field_info = mysql_fetch_assoc($view_fields_query)) { $field_id = $view_field_info["field_id"]; $tab_number = $view_field_info["tab_number"]; $is_column = $view_field_info["is_column"]; $is_sortable = $view_field_info["is_sortable"]; if ($is_column != "yes") { continue; } $view_cols[$view_id][] = array("field_id" => $field_id, "is_sortable" => $is_sortable); } } } // now insert the view_columns records while (list($view_id, $info) = each($view_cols)) { $order = 1; foreach ($info as $col_info) { $field_id = $col_info["field_id"]; $is_sortable = $col_info["is_sortable"]; mysql_query("\r\n INSERT INTO {$g_table_prefix}view_columns (view_id, field_id, list_order, is_sortable, auto_size, custom_width, truncate)\r\n VALUES ({$view_id}, {$field_id}, {$order}, 'yes', 'yes', '', 'truncate')\r\n "); $order++; } } mysql_query("ALTER TABLE {$g_table_prefix}view_fields DROP is_column, DROP is_sortable"); mysql_query("ALTER TABLE {$g_table_prefix}view_fields ADD group_id MEDIUMINT(9) NOT NULL AFTER field_id"); // all View fields are now grouped. Formerly, view fields could be mapped to tabs individually, now they're mapped // to the View field group. So what we do here is: look at each View, and those fields within it. $forms_query = mysql_query("SELECT form_id FROM {$g_table_prefix}forms WHERE is_complete = 'yes'"); while ($row = mysql_fetch_assoc($forms_query)) { $form_id = $row["form_id"]; $views_query = mysql_query("SELECT view_id FROM {$g_table_prefix}views WHERE form_id = {$form_id}"); while ($view_info = mysql_fetch_assoc($views_query)) { $view_id = $view_info["view_id"]; $tab_num_query = mysql_query("\r\n SELECT DISTINCT tab_number\r\n FROM {$g_table_prefix}view_fields\r\n WHERE view_id = {$view_id} AND\r\n tab_number IS NOT NULL\r\n "); $tab_numbers = array(); while ($tab_row = mysql_fetch_assoc($tab_num_query)) { $tab_numbers[] = $tab_row["tab_number"]; } // if none of the fields were mapped to a tab, cool! Just map all View fields to a single list group if (empty($tab_numbers)) { mysql_query("\r\n INSERT INTO {$g_table_prefix}list_groups (group_type, group_name, custom_data, list_order)\r\n VALUES ('view_fields_{$view_id}', '', '', 1)\r\n "); $new_group_id = mysql_insert_id(); mysql_query("\r\n UPDATE {$g_table_prefix}view_fields\r\n SET group_id = {$new_group_id}\r\n WHERE view_id = {$view_id}\r\n "); } else { $order = 1; foreach ($tab_numbers as $tab_number) { mysql_query("\r\n INSERT INTO {$g_table_prefix}list_groups (group_type, group_name, custom_data, list_order)\r\n VALUES ('view_fields_{$view_id}', '', '{$tab_number}', {$order})\r\n "); $new_group_id = mysql_insert_id(); $order++; mysql_query("\r\n UPDATE {$g_table_prefix}view_fields\r\n SET group_id = {$new_group_id}\r\n WHERE view_id = {$view_id} AND\r\n tab_number = {$tab_number}\r\n "); } } } } mysql_query("ALTER TABLE {$g_table_prefix}view_fields DROP tab_number"); // FIELD_SETTINGS table ----------------- $old_field_settings = array(); $field_settings_query = mysql_query("SELECT * FROM {$g_table_prefix}field_settings"); while ($row = mysql_fetch_assoc($field_settings_query)) { $old_field_settings[] = $row; } mysql_query("TRUNCATE {$g_table_prefix}field_settings"); mysql_query("ALTER TABLE {$g_table_prefix}field_settings DROP module"); // this field wasn't ever used mysql_query("ALTER TABLE {$g_table_prefix}field_settings CHANGE setting_name setting_id MEDIUMINT NOT NULL"); $file_field_type_id = ft_get_field_type_id_by_identifier("file"); $field_setting_name_to_id_map = array("file_upload_dir" => ft_get_field_type_setting_by_identifier($file_field_type_id, "folder_path"), "file_upload_url" => ft_get_field_type_setting_by_identifier($file_field_type_id, "folder_url"), "file_upload_filetypes" => ft_get_field_type_setting_by_identifier($file_field_type_id, "permitted_file_types"), "file_upload_max_size" => ft_get_field_type_setting_by_identifier($file_field_type_id, "max_file_size")); foreach ($old_field_settings as $info) { $field_id = $info["field_id"]; $setting_id = array_key_exists($info["setting_name"], $field_setting_name_to_id_map) ? $field_setting_name_to_id_map[$info["setting_name"]] : ""; $setting_value = $info["setting_value"]; // this shouldn't happen. The field_settings table was exceedingly underutilized & only ever contained settings with // those 4 names specified above if (empty($setting_id)) { continue; } mysql_query("INSERT INTO {$g_table_prefix}field_settings (field_id, setting_id, setting_value) VALUES ({$field_id}, {$setting_id}, '{$setting_value}')"); } // now the field_settings table is up to date, a few Core fields need new entries in the table $query = mysql_query("\r\n SELECT field_id\r\n FROM {$g_table_prefix}form_fields\r\n WHERE is_system_field = 'yes' AND\r\n (field_name = 'core__submission_date' OR field_name = 'core__last_modified')\r\n "); $date_field_type_datetime_setting_id = ft_get_field_type_setting_id_by_identifier($date_field_type_id, "display_format"); while ($row = mysql_fetch_assoc($query)) { $field_id = $row["field_id"]; mysql_query("\r\n INSERT INTO {$g_table_prefix}field_settings (field_id, setting_id, setting_value)\r\n VALUES ({$field_id}, {$date_field_type_datetime_setting_id}, '{$g_default_datetime_format}')\r\n "); } // next we need to update the mappings for any fields that use an Option List. Before, that info was stored in the // field_group_id field in the form_fields table; now it's associated with a setting for the field type. First, create // a map of field_type_id => field_setting_id, where the setting ID is the one that contains the Option List $field_type_option_list_setting_id_map = array(); foreach ($field_types as $row) { $field_type_id = $row["field_type_id"]; $field_setting_info = ft_get_field_type_setting_by_identifier($field_type_id, "contents"); if (!empty($field_setting_info)) { $field_type_option_list_setting_id_map[$field_type_id] = $field_setting_info["setting_id"]; } } // next, loop through each field that has an old field_option_group field and add the new field_setting $query = mysql_query("\r\n SELECT field_id, field_type_id, field_group_id\r\n FROM {$g_table_prefix}form_fields\r\n WHERE field_group_id IS NOT NULL AND field_group_id != ''\r\n "); // this stores those field IDs that are mapped to each option list ID $option_list_id_to_field_ids = array(); while ($row = mysql_fetch_assoc($query)) { $field_id = $row["field_id"]; $field_type_id = $row["field_type_id"]; $field_group_id = $row["field_group_id"]; $setting_id = array_key_exists($field_type_id, $field_type_option_list_setting_id_map) ? $field_type_option_list_setting_id_map[$field_type_id] : ""; mysql_query("\r\n INSERT INTO {$g_table_prefix}field_settings (field_id, setting_id, setting_value)\r\n VALUES ({$field_id}, {$setting_id}, {$field_group_id})\r\n "); if (!array_key_exists($field_group_id, $option_list_id_to_field_ids)) { $option_list_id_to_field_ids[$field_group_id] = array(); } $option_list_id_to_field_ids[$field_group_id][] = $field_id; } mysql_query("ALTER TABLE {$g_table_prefix}form_fields DROP field_group_id"); // for this one, we need to locate every field that uses the Option List and add a custom setting to ensure the // orientation isn't lost. At this juncture, we have the luxury of knowing that the default field type settings & // options haven't been modified by the user $orientation_query = mysql_query("\r\n SELECT list_id, field_orientation\r\n FROM {$g_table_prefix}option_lists\r\n WHERE field_orientation = 'vertical' OR field_orientation = 'horizontal'\r\n "); while ($row = mysql_fetch_assoc($orientation_query)) { $curr_option_list_id = $row["list_id"]; $orientation = $row["field_orientation"]; if (!array_key_exists($curr_option_list_id, $option_list_id_to_field_ids)) { continue; } // the assumption here is that the multi-select field types have an orientation setting with // values "horizontal" and "vertical". It's safe. foreach ($option_list_id_to_field_ids[$curr_option_list_id] as $field_id) { // slow and crappy! $field_type_id = ft_get_field_type_id_by_field_id($field_id); $setting_id = ft_get_field_type_setting_id_by_identifier($field_type_id, "formatting"); // for checkbox & radios fields that were assigned to an option list with a "n/a" orientation, don't // worry about it: they'll inherit the default value if (empty($setting_id)) { continue; } mysql_query("\r\n INSERT INTO {$g_table_prefix}field_settings (field_id, setting_id, setting_value)\r\n VALUES ({$field_id}, {$setting_id}, '{$orientation}')\r\n "); } } mysql_query("ALTER TABLE {$g_table_prefix}option_lists DROP field_orientation"); } if ($old_version_info["release_date"] < 20110521) { mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_smarty_markup = '{\$VALUE|htmlspecialchars}'\r\n WHERE field_type_identifier = 'textbox'\r\n "); mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_smarty_markup = '{if \$CONTEXTPAGE == \"edit_submission\"}\t\n {\$VALUE|nl2br}\r\n{else}\r\n {\$VALUE}\r\n{/if}'\r\n WHERE field_type_identifier = 'textarea'\r\n "); } if ($old_version_info["release_date"] < 20110527) { mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET raw_field_type_map_multi_select_id = 16\r\n WHERE field_type_identifier = 'radio_buttons'\r\n "); mysql_query("\r\n CREATE TABLE {$g_table_prefix}hooks (\r\n id mediumint(8) unsigned NOT NULL auto_increment,\r\n hook_type enum('code','template') NOT NULL,\r\n component enum('core','api','module') NOT NULL,\r\n filepath varchar(255) NOT NULL,\r\n action_location varchar(255) NOT NULL,\r\n function_name varchar(255) NOT NULL,\r\n params mediumtext,\r\n overridable mediumtext,\r\n PRIMARY KEY (id)\r\n )"); } if ($old_version_info["release_date"] < 20110528) { // assorted updates to the Date field type mysql_query("\r\n INSERT INTO {$g_table_prefix}field_type_settings (field_type_id, field_label, field_setting_identifier, field_type,\r\n field_orientation, default_value_type, default_value, list_order)\r\n VALUES (8, 'Apply Timezone Offset', 'apply_timezone_offset', 'radios', 'horizontal', 'static', 'no', 2)\r\n "); $new_setting_id = mysql_insert_id(); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$new_setting_id}, 'Yes', 'yes', 1, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$new_setting_id}, 'No', 'no', 2, 'yes')"); mysql_query("\r\n UPDATE {$g_table_prefix}field_type_settings\r\n SET list_order = 3\r\n WHERE field_type_id = 8 AND\r\n field_setting_identifier = 'comments'\r\n "); mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_smarty_markup = '{strip}\r\n {if \$VALUE}\r\n {assign var=tzo value=\"\"}\r\n {if \$apply_timezone_offset == \"yes\"}\r\n {assign var=tzo value=\$ACCOUNT_INFO.timezone_offset}\r\n {/if}\r\n {if \$display_format == \"yy-mm-dd\" || !\$display_format}\r\n {\$VALUE|custom_format_date:\$tzo:\"Y-m-d\"}\r\n {elseif \$display_format == \"dd/mm/yy\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"d/m/Y\"}\r\n {elseif \$display_format == \"mm/dd/yy\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"m/d/Y\"}\r\n {elseif \$display_format == \"M d, yy\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"M j, Y\"}\r\n {elseif \$display_format == \"MM d, yy\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"F j, Y\"}\r\n {elseif \$display_format == \"D M d, yy\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"D M j, Y\"}\r\n {elseif \$display_format == \"DD, MM d, yy\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"l M j, Y\"}\r\n {elseif \$display_format == \"datetime:dd/mm/yy|h:mm TT|ampm`true\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"d/m/Y g:i A\"}\r\n {elseif \$display_format == \"datetime:mm/dd/yy|h:mm TT|ampm`true\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"m/d/Y g:i A\"}\r\n {elseif \$display_format == \"datetime:yy-mm-dd|h:mm TT|ampm`true\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"Y-m-d g:i A\"}\r\n {elseif \$display_format == \"datetime:yy-mm-dd|hh:mm\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"Y-m-d H:i\"}\r\n {elseif \$display_format == \"datetime:yy-mm-dd|hh:mm:ss|showSecond`true\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"Y-m-d H:i:s\"}\r\n {/if}\r\n{/if}{/strip}\r\n',\r\n edit_field_smarty_markup = '{assign var=class value=\"cf_datepicker\"}\r\n{if \$display_format|strpos:\"datetime\" === 0}\r\n {assign var=class value=\"cf_datetimepicker\"}\r\n{/if}\r\n\r\n{assign var=\"val\" value=\"\"}\r\n{if \$VALUE}\r\n {assign var=tzo value=\"\"}\r\n {if \$apply_timezone_offset == \"yes\"}\r\n {assign var=tzo value=\$ACCOUNT_INFO.timezone_offset}\r\n {/if}\r\n {if \$display_format == \"yy-mm-dd\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"Y-m-d\"}\r\n {elseif \$display_format == \"dd/mm/yy\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"d/m/Y\"}\r\n {elseif \$display_format == \"mm/dd/yy\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"m/d/Y\"}\r\n {elseif \$display_format == \"M d, yy\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"M j, Y\"}\r\n {elseif \$display_format == \"MM d, yy\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"F j, Y\"}\r\n {elseif \$display_format == \"D M d, yy\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"D M j, Y\"}\r\n {elseif \$display_format == \"DD, MM d, yy\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"l M j, Y\"}\r\n {elseif \$display_format == \"datetime:dd/mm/yy|h:mm TT|ampm`true\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"d/m/Y g:i A\"}\r\n {elseif \$display_format == \"datetime:mm/dd/yy|h:mm TT|ampm`true\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"m/d/Y g:i A\"}\r\n {elseif \$display_format == \"datetime:yy-mm-dd|h:mm TT|ampm`true\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"Y-m-d g:i A\"}\r\n {elseif \$display_format == \"datetime:yy-mm-dd|hh:mm\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"Y-m-d H:i\"}\r\n {elseif \$display_format == \"datetime:yy-mm-dd|hh:mm:ss|showSecond`true\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"Y-m-d H:i:s\"}\r\n {/if}\r\n{/if}\r\n\r\n<div class=\"cf_date_group\">\r\n <input type=\"input\" name=\"{\$NAME}\" id=\"{\$NAME}_id\" \r\n class=\"cf_datefield {\$class}\" value=\"{\$val}\" /><img class=\"ui-datepicker-trigger\" src=\"{\$g_root_url}/global/images/calendar.png\" id=\"{\$NAME}_icon_id\" />\r\n <input type=\"hidden\" id=\"{\$NAME}_format\" value=\"{\$display_format}\" />\r\n {if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments}</div>\r\n {/if}\r\n</div>\r\n',\r\n php_processing = '\$field_name = \$vars[\"field_info\"][\"field_name\"];\r\n\$date = \$vars[\"data\"][\$field_name];\r\n\$display_format = \$vars[\"settings\"][\"display_format\"];\r\n\$atzo = \$vars[\"settings\"][\"apply_timezone_offset\"];\r\n\$account_info = isset(\$vars[\"account_info\"]) ? \$vars[\"account_info\"] : array();\r\n\r\nif (empty(\$date))\r\n{\r\n \$value = \"\";\r\n}\r\nelse\r\n{\r\n if (strpos(\$display_format, \"datetime:\") === 0)\r\n {\r\n \$parts = explode(\" \", \$date);\r\n switch (\$display_format)\r\n {\r\n case \"datetime:dd/mm/yy|h:mm TT|ampm`true\":\r\n \$date = substr(\$date, 3, 2) . \"/\" . substr(\$date, 0, 2) . \"/\" . \r\n substr(\$date, 6); \r\n break;\r\n }\r\n }\r\n else\r\n {\r\n if (\$display_format == \"dd/mm/yy\")\r\n {\r\n \$date = substr(\$date, 3, 2) . \"/\" . substr(\$date, 0, 2) . \"/\" . \r\n substr(\$date, 6);\r\n }\r\n }\r\n \$time = strtotime(\$date);\r\n \r\n // lastly, if this field has a timezone offset being applied to it, do the\r\n // appropriate math on the date\r\n if (\$atzo == \"yes\" && !isset(\$account_info[\"timezone_offset\"]))\r\n {\r\n \$seconds_offset = \$account_info[\"timezone_offset\"] * 60 * 60;\r\n \$time += \$seconds_offset;\r\n }\r\n\r\n \$value = date(\"Y-m-d H:i:s\", \$time);\r\n}\r\n\r\n\r\n'\r\n WHERE field_type_id = 8\r\n "); } if ($old_version_info["release_date"] < 20110530) { mysql_query("INSERT INTO {$g_table_prefix}settings (setting_name, setting_value) VALUES ('default_date_field_search_value', 'none')"); } if ($old_version_info["release_date"] < 20110612) { @mysql_query("ALTER TABLE {$g_table_prefix}accounts ADD temp_reset_password VARCHAR(50) NULL"); } if ($old_version_info["release_date"] < 20110622) { @mysql_query("UPDATE {$g_table_prefix}field_types SET view_field_php_function_source = 'core'"); // for compatibility with existing field type modules mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_rendering_type = 'smarty'\r\n "); // textbox mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_rendering_type = 'smarty',\r\n view_field_php_function_source = 'core',\r\n view_field_php_function = ''\r\n WHERE field_type_identifier = 'textbox'\r\n "); // textarea mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_rendering_type = 'smarty',\r\n view_field_php_function_source = 'core',\r\n view_field_php_function = '',\r\n view_field_smarty_markup = '{if \$CONTEXTPAGE == \"edit_submission\"} \r\n {\$VALUE|nl2br}\r\n{else}\r\n {\$VALUE}\r\n{/if}',\r\n edit_field_smarty_markup = '{* figure out all the classes *}\r\n{assign var=classes value=\$height}\r\n{if \$highlight_colour}\r\n {assign var=classes value=\"`\$classes` `\$highlight_colour`\"}\r\n{/if}\r\n{if \$input_length == \"words\" && \$maxlength != \"\"}\r\n {assign var=classes value=\"`\$classes` cf_wordcounter max`\$maxlength`\"}\r\n{else if \$input_length == \"chars\" && \$maxlength != \"\"}\r\n {assign var=classes value=\"`\$classes` cf_textcounter max`\$maxlength`\"}\r\n{/if}\r\n\r\n<textarea name=\"{\$NAME}\" id=\"{\$NAME}_id\" class=\"{\$classes}\">{\$VALUE}</textarea>\r\n\r\n{if \$input_length == \"words\" && \$maxlength != \"\"}\r\n <div class=\"cf_counter\" id=\"{\$NAME}_counter\">\r\n {\$maxlength} {\$LANG.phrase_word_limit_p} <span></span> {\$LANG.phrase_remaining_words}\r\n </div>\r\n{elseif \$input_length == \"chars\" && \$max_length != \"\"}\r\n <div class=\"cf_counter\" id=\"{\$NAME}_counter\">\r\n {\$maxlength} {\$LANG.phrase_characters_limit_p} <span></span> {\$LANG.phrase_remaining_characters}\r\n </div>\r\n{/if}\r\n\r\n{if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments|nl2br}</div>\r\n{/if}'\r\n WHERE field_type_identifier = 'textarea'\r\n "); // password mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_rendering_type = 'none'\r\n WHERE field_type_identifier = 'password'\r\n "); // dropdown mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_rendering_type = 'php',\r\n view_field_php_function_source = 'core',\r\n view_field_php_function = 'ft_display_field_type_dropdown',\r\n view_field_smarty_markup = '{strip}{if \$contents != \"\"}\r\n {foreach from=\$contents.options item=curr_group_info name=group}\r\n {assign var=options value=\$curr_group_info.options}\r\n {foreach from=\$options item=option name=row}\r\n {if \$VALUE == \$option.option_value}{\$option.option_name}{/if}\r\n {/foreach}\r\n {/foreach}\r\n{/if}{/strip}',\r\n edit_field_smarty_markup = '{if \$contents == \"\"}\r\n <div class=\"cf_field_comments\">{\$LANG.phrase_not_assigned_to_option_list}</div>\r\n{else}\r\n <select name=\"{\$NAME}\">\r\n {foreach from=\$contents.options item=curr_group_info name=group}\r\n {assign var=group_info value=\$curr_group_info.group_info}\r\n {assign var=options value=\$curr_group_info.options}\r\n {if \$group_info.group_name}\r\n <optgroup label=\"{\$group_info.group_name|escape}\">\r\n {/if}\r\n {foreach from=\$options item=option name=row}\r\n <option value=\"{\$option.option_value}\"\r\n {if \$VALUE == \$option.option_value}selected{/if}>{\$option.option_name}</option>\r\n {/foreach}\r\n {if \$group_info.group_name}\r\n </optgroup>\r\n {/if}\r\n {/foreach}\r\n </select>\r\n{/if}\r\n\r\n{if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments}</div>\r\n{/if}'\r\n WHERE field_type_identifier = 'dropdown'\r\n "); // multi-select dropdown mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_rendering_type = 'php',\r\n view_field_php_function_source = 'core',\r\n view_field_php_function = 'ft_display_field_type_multi_select_dropdown',\r\n view_field_smarty_markup = '{if \$contents != \"\"}\r\n {assign var=vals value=\"`\$g_multi_val_delimiter`\"|explode:\$VALUE}\r\n {assign var=is_first value=true}\r\n {strip}\r\n {foreach from=\$contents.options item=curr_group_info name=group}\r\n {assign var=options value=\$curr_group_info.options}\r\n {foreach from=\$options item=option name=row}\r\n {if \$option.option_value|in_array:\$vals}\r\n {if \$is_first == false}, {/if}\r\n {\$option.option_name}\r\n {assign var=is_first value=false}\r\n {/if}\r\n {/foreach}\r\n {/foreach}\r\n {/strip}\r\n{/if}',\r\n edit_field_smarty_markup = '{if \$contents == \"\"}\r\n <div class=\"cf_field_comments\">{\$LANG.phrase_not_assigned_to_option_list}</div>\r\n{else}\r\n {assign var=vals value=\"`\$g_multi_val_delimiter`\"|explode:\$VALUE}\r\n <select name=\"{\$NAME}[]\" multiple size=\"{if \$num_rows}{\$num_rows}{else}5{/if}\">\r\n {foreach from=\$contents.options item=curr_group_info name=group}\r\n {assign var=group_info value=\$curr_group_info.group_info}\r\n {assign var=options value=\$curr_group_info.options}\r\n {if \$group_info.group_name}\r\n <optgroup label=\"{\$group_info.group_name|escape}\">\r\n {/if}\r\n {foreach from=\$options item=option name=row}\r\n <option value=\"{\$option.option_value}\"\r\n {if \$option.option_value|in_array:\$vals}selected{/if}>{\$option.option_name}</option>\r\n {/foreach}\r\n {if \$group_info.group_name}\r\n </optgroup>\r\n {/if}\r\n {/foreach}\r\n </select>\r\n{/if}\r\n\r\n{if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments}</div>\r\n{/if}',\r\n WHERE field_type_identifier = 'multi_select_dropdown'\r\n "); // radio buttons mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_rendering_type = 'php',\r\n view_field_php_function_source = 'core',\r\n view_field_php_function = 'ft_display_field_type_radios',\r\n view_field_smarty_markup = '{strip}{if \$contents != \"\"}\r\n {foreach from=\$contents.options item=curr_group_info name=group}\r\n {assign var=options value=\$curr_group_info.options}\r\n {foreach from=\$options item=option name=row}\r\n {if \$VALUE == \$option.option_value}{\$option.option_name}{/if}\r\n {/foreach}\r\n {/foreach}\r\n{/if}{/strip}',\r\n edit_field_smarty_markup = '{if \$contents == \"\"}\r\n <div class=\"cf_field_comments\">{\$LANG.phrase_not_assigned_to_option_list}</div>\r\n{else}\r\n {assign var=is_in_columns value=false}\r\n {if \$formatting == \"cf_option_list_2cols\" || \r\n \$formatting == \"cf_option_list_3cols\" || \r\n \$formatting == \"cf_option_list_4cols\"}\r\n {assign var=is_in_columns value=true}\r\n {/if}\r\n\r\n {assign var=counter value=\"1\"}\r\n {foreach from=\$contents.options item=curr_group_info name=group}\r\n {assign var=group_info value=\$curr_group_info.group_info}\r\n {assign var=options value=\$curr_group_info.options}\r\n\r\n {if \$group_info.group_name}\r\n <div class=\"cf_option_list_group_label\">{\$group_info.group_name}</div>\r\n {/if}\r\n\r\n {if \$is_in_columns}<div class=\"{\$formatting}\">{/if}\r\n\r\n {foreach from=\$options item=option name=row}\r\n {if \$is_in_columns}<div class=\"column\">{/if}\r\n <input type=\"radio\" name=\"{\$NAME}\" id=\"{\$NAME}_{\$counter}\" \r\n value=\"{\$option.option_value}\"\r\n {if \$VALUE == \$option.option_value}checked{/if} />\r\n <label for=\"{\$NAME}_{\$counter}\">{\$option.option_name}</label>\r\n {if \$is_in_columns}</div>{/if}\r\n {if \$formatting == \"vertical\"}<br />{/if}\r\n {assign var=counter value=\$counter+1}\r\n {/foreach}\r\n\r\n {if \$is_in_columns}</div>{/if}\r\n {/foreach}\r\n\r\n {if \$comments}<div class=\"cf_field_comments\">{\$comments}</div>{/if}\r\n{/if}'\r\n WHERE field_type_identifier = 'radio_buttons'\r\n "); // checkboxes mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_rendering_type = 'php',\r\n view_field_php_function_source = 'core',\r\n view_field_php_function = 'ft_display_field_type_checkboxes',\r\n view_field_smarty_markup = '{strip}{if \$contents != \"\"}\r\n {assign var=vals value=\"`\$g_multi_val_delimiter`\"|explode:\$VALUE}\r\n {assign var=is_first value=true}\r\n {strip}\r\n {foreach from=\$contents.options item=curr_group_info name=group}\r\n {assign var=options value=\$curr_group_info.options}\r\n {foreach from=\$options item=option name=row}\r\n {if \$option.option_value|in_array:\$vals}\r\n {if \$is_first == false}, {/if}\r\n {\$option.option_name}\r\n {assign var=is_first value=false}\r\n {/if}\r\n {/foreach}\r\n {/foreach}\r\n {/strip}\r\n{/if}{/strip}',\r\n edit_field_smarty_markup = '{if \$contents == \"\"}\r\n <div class=\"cf_field_comments\">{\$LANG.phrase_not_assigned_to_option_list}</div>\r\n{else}\r\n {assign var=vals value=\"`\$g_multi_val_delimiter`\"|explode:\$VALUE}\r\n {assign var=is_in_columns value=false}\r\n {if \$formatting == \"cf_option_list_2cols\" || \r\n \$formatting == \"cf_option_list_3cols\" || \r\n \$formatting == \"cf_option_list_4cols\"}\r\n {assign var=is_in_columns value=true}\r\n {/if}\r\n\r\n {assign var=counter value=\"1\"}\r\n {foreach from=\$contents.options item=curr_group_info name=group}\r\n {assign var=group_info value=\$curr_group_info.group_info}\r\n {assign var=options value=\$curr_group_info.options}\r\n\r\n {if \$group_info.group_name}\r\n <div class=\"cf_option_list_group_label\">{\$group_info.group_name}</div>\r\n {/if}\r\n\r\n {if \$is_in_columns}<div class=\"{\$formatting}\">{/if}\r\n\r\n {foreach from=\$options item=option name=row}\r\n {if \$is_in_columns}<div class=\"column\">{/if}\r\n <input type=\"checkbox\" name=\"{\$NAME}[]\" id=\"{\$NAME}_{\$counter}\" \r\n value=\"{\$option.option_value|escape}\" \r\n {if \$option.option_value|in_array:\$vals}checked{/if} />\r\n <label for=\"{\$NAME}_{\$counter}\">{\$option.option_name}</label>\r\n {if \$is_in_columns}</div>{/if}\r\n {if \$formatting == \"vertical\"}<br />{/if}\r\n {assign var=counter value=\$counter+1}\r\n {/foreach}\r\n\r\n {if \$is_in_columns}</div>{/if}\r\n {/foreach}\r\n\r\n {if {\$comments}\r\n <div class=\"cf_field_comments\">{\$comments}</div> \r\n {/if}\r\n{/if}'\r\n WHERE field_type_identifier = 'checkboxes'\r\n "); // date mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_rendering_type = 'php',\r\n view_field_php_function_source = 'core',\r\n view_field_php_function = 'ft_display_field_type_date'\r\n WHERE field_type_identifier = 'date'\r\n "); // time mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_rendering_type = 'none'\r\n WHERE field_type_identifier = 'time'\r\n "); // phone mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_rendering_type = 'php',\r\n view_field_php_function_source = 'core',\r\n view_field_php_function = 'ft_display_field_type_phone_number'\r\n WHERE field_type_identifier = 'phone'\r\n "); // code / markup mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_rendering_type = 'php',\r\n view_field_php_function_source = 'core',\r\n view_field_php_function = 'ft_display_field_type_code_markup'\r\n WHERE field_type_identifier = 'code_markup'\r\n "); } if ($old_version_info["release_date"] < 20110630) { mysql_query("INSERT INTO {$g_table_prefix}settings (setting_name, setting_value, module) VALUES ('field_type_settings_shared_characteristics', 'field_comments:textbox,comments`textarea,comments`password,comments`dropdown,comments`multi_select_dropdown,comments`radio_buttons,comments`checkboxes,comments`date,comments`time,comments`phone,comments`code_markup,comments`file,comments`google_maps_field,comments`tinymce,comments|data_source:dropdown,contents`multi_select_dropdown,contents`radio_buttons,contents`checkboxes,contents|column_formatting:checkboxes,formatting`radio_buttons,formatting|maxlength_attr:textbox,maxlength|colour_highlight:textbox,highlight|folder_path:file,folder_path|folder_url:file,folder_url|permitted_file_types:file,folder_url|max_file_size:file,max_file_size|date_display_format:date,display_format|apply_timezone_offset:date,apply_timezone_offset', 'core')"); } // yet more field type updates if ($old_version_info["release_date"] < 20110702) { mysql_query("UPDATE {$g_table_prefix}field_types SET field_type_name = '{\$LANG.word_time}' WHERE field_type_identifier = 'time'"); mysql_query("UPDATE {$g_table_prefix}field_types SET field_type_name = '{\$LANG.word_date}' WHERE field_type_identifier = 'date'"); mysql_query("UPDATE {$g_table_prefix}field_types SET field_type_name = '{\$LANG.phrase_phone_number}' WHERE field_type_identifier = 'phone'"); mysql_query("UPDATE {$g_table_prefix}field_types SET field_type_name = '{\$LANG.phrase_code_markup_field}' WHERE field_type_identifier = 'code_markup'"); mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET edit_field_smarty_markup = '{* figure out all the classes *}\r\n{assign var=classes value=\$height}\r\n{if \$highlight_colour}\r\n {assign var=classes value=\"`\$classes` `\$highlight_colour`\"}\r\n{/if}\r\n{if \$input_length == \"words\" && \$maxlength != \"\"}\r\n {assign var=classes value=\"`\$classes` cf_wordcounter max`\$maxlength`\"}\r\n{elseif \$input_length == \"chars\" && \$maxlength != \"\"}\r\n {assign var=classes value=\"`\$classes` cf_textcounter max`\$maxlength`\"}\r\n{/if}\r\n\r\n<textarea name=\"{\$NAME}\" id=\"{\$NAME}_id\" class=\"{\$classes}\">{\$VALUE}</textarea>\r\n\r\n{if \$input_length == \"words\" && \$maxlength != \"\"}\r\n <div class=\"cf_counter\" id=\"{\$NAME}_counter\">\r\n {\$maxlength} {\$LANG.phrase_word_limit_p} <span></span> {\$LANG.phrase_remaining_words}\r\n </div>\r\n{elseif \$input_length == \"chars\" && \$maxlength != \"\"}\r\n <div class=\"cf_counter\" id=\"{\$NAME}_counter\">\r\n {\$maxlength} {\$LANG.phrase_characters_limit_p} <span></span> {\$LANG.phrase_remaining_characters}\r\n </div>\r\n{/if}\r\n\r\n{if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments|nl2br}</div>\r\n{/if}',\r\n resources_js = '/**\r\n * The following code provides a simple text/word counter option for any \r\n * textarea. It either just keeps counting up, or limits the results to a\r\n * certain number - all depending on what the user has selected via the\r\n * field type settings.\r\n */\r\nvar cf_counter = {};\r\ncf_counter.get_max_count = function(el) {\r\n var classes = \$(el).attr(''class'').split(\" \").slice(-1);\r\n var max = null;\r\n for (var i=0; i<classes.length; i++) {\r\n var result = classes[i].match(/max(\\\\d+)/);\r\n if (result != null) {\r\n max = result[1];\r\n break;\r\n }\r\n }\r\n return max;\r\n}\r\n\r\n\$(function() {\r\n \$(\"textarea[class~=''cf_wordcounter'']\").each(function() {\r\n var max = cf_counter.get_max_count(this);\r\n if (max == null) {\r\n return;\r\n }\r\n \$(this).bind(\"keydown\", function() {\r\n var val = \$(this).val();\r\n var len = val.split(/[\\\\s]+/);\r\n var field_name = \$(this).attr(\"name\");\r\n var num_words = len.length - 1;\r\n if (num_words > max) {\r\n var allowed_words = val.split(/[\\\\s]+/, max);\r\n truncated_str = allowed_words.join(\" \");\r\n \$(this).val(truncated_str);\r\n } else {\r\n \$(\"#\" + field_name + \"_counter\").find(\"span\").html(parseInt(max) - parseInt(num_words));\r\n }\r\n }); \r\n \$(this).trigger(\"keydown\");\r\n });\r\n\r\n \$(\"textarea[class~=''cf_textcounter'']\").each(function() {\r\n var max = cf_counter.get_max_count(this);\r\n if (max == null) {\r\n return;\r\n }\r\n \$(this).bind(\"keydown\", function() { \r\n var field_name = \$(this).attr(\"name\"); \r\n if (this.value.length > max) {\r\n this.value = this.value.substring(0, max);\r\n } else {\r\n \$(\"#\" + field_name + \"_counter\").find(\"span\").html(max - this.value.length);\r\n }\r\n });\r\n \$(this).trigger(\"keydown\");\r\n }); \r\n});'\r\n WHERE field_type_identifier = 'textarea'\r\n "); mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_smarty_markup = '{php}\r\n\$format = \$this->get_template_vars(\"phone_number_format\");\r\n\$values = explode(\"|\", \$this->get_template_vars(\"VALUE\"));\r\n\$pieces = preg_split(\"/(x+)/\", \$format, 0, PREG_SPLIT_DELIM_CAPTURE);\r\n\$counter = 1;\r\n\$output = \"\";\r\n\$has_content = false;\r\nforeach (\$pieces as \$piece)\r\n{\r\n if (empty(\$piece))\r\n continue;\r\n\r\n if (\$piece[0] == \"x\") { \r\n \$value = (isset(\$values[\$counter-1])) ? \$values[\$counter-1] : \"\";\r\n \$output .= \$value;\r\n if (!empty(\$value))\r\n {\r\n \$has_content = true;\r\n }\r\n \$counter++;\r\n } else {\r\n \$output .= \$piece;\r\n }\r\n}\r\n\r\nif (!empty(\$output) && \$has_content)\r\n echo \$output;\r\n{/php}',\r\n edit_field_smarty_markup = '{php}\r\n\$format = \$this->get_template_vars(\"phone_number_format\");\r\n\$values = explode(\"|\", \$this->get_template_vars(\"VALUE\"));\r\n\$name = \$this->get_template_vars(\"NAME\");\r\n\r\n\$pieces = preg_split(\"/(x+)/\", \$format, 0, PREG_SPLIT_DELIM_CAPTURE);\r\n\$counter = 1;\r\nforeach (\$pieces as \$piece)\r\n{\r\n if (strlen(\$piece) == 0)\r\n continue;\r\n\r\n if (\$piece[0] == \"x\") {\r\n \$size = strlen(\$piece); \r\n \$value = (isset(\$values[\$counter-1])) ? \$values[\$counter-1] : \"\";\r\n \$value = htmlspecialchars(\$value);\r\n echo \"<input type=\\\\\"text\\\\\" name=\\\\\"{\$name}_\$counter\\\\\" value=\\\\\"\$value\\\\\"\r\n size=\\\\\"\$size\\\\\" maxlength=\\\\\"\$size\\\\\" />\";\r\n \$counter++;\r\n } else {\r\n echo \$piece;\r\n }\r\n}\r\n{/php}\r\n{if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments}</div>\r\n{/if}'\r\n WHERE field_type_identifier = 'phone'\r\n "); mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET edit_field_smarty_markup = '<div class=\"editor\">\r\n <textarea id=\"{\$NAME}_id\" name=\"{\$NAME}\">{\$VALUE}</textarea>\r\n</div>\r\n<script>\r\n var code_mirror_{\$NAME} = new CodeMirror.fromTextArea(\"{\$NAME}_id\", \r\n {literal}{{/literal}\r\n height: \"{\$height}px\",\r\n path: \"{\$g_root_url}/global/codemirror/js/\",\r\n {if \$code_markup == \"HTML\" || \$code_markup == \"XML\"}\r\n parserfile: [\"parsexml.js\"],\r\n stylesheet: \"{\$g_root_url}/global/codemirror/css/xmlcolors.css\"\r\n {elseif \$code_markup == \"CSS\"}\r\n parserfile: [\"parsecss.js\"],\r\n stylesheet: \"{\$g_root_url}/global/codemirror/css/csscolors.css\"\r\n {elseif \$code_markup == \"JavaScript\"} \r\n parserfile: [\"tokenizejavascript.js\", \"parsejavascript.js\"],\r\n stylesheet: \"{\$g_root_url}/global/codemirror/css/jscolors.css\"\r\n {/if}\r\n {literal}});{/literal}\r\n</script>\r\n\r\n{if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments}</div>\r\n{/if}'\r\n WHERE field_type_identifier = 'code_markup'\r\n "); } if ($old_version_info["release_date"] < 20110716) { $field_type_info = ft_get_field_type_by_identifier("code_markup"); foreach ($field_type_info["settings"] as $curr_field_type_info) { if ($curr_field_type_info["field_setting_identifier"] != "height") { continue; } $setting_id = $curr_field_type_info["setting_id"]; mysql_query("UPDATE {$g_table_prefix}field_type_settings SET default_value = '200' WHERE setting_id = {$setting_id}") or die(mysql_error()); } } // update the Date field type for additional custom date formats if ($old_version_info["release_date"] < 20110811) { $field_type_info = ft_get_field_type_by_identifier("date"); $field_type_id = $field_type_info["field_type_id"]; $custom_date_format_info = ft_get_field_type_setting_by_identifier($field_type_id, "display_format"); $setting_id = $custom_date_format_info["setting_id"]; mysql_query("DELETE FROM {$g_table_prefix}field_type_setting_options WHERE setting_id = {$setting_id}"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$setting_id}, '2011-11-30', 'yy-mm-dd', 1, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$setting_id}, '30/11/2011 (dd/mm/yyyy)', 'dd/mm/yy', 2, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$setting_id}, '11/30/2011 (mm/dd/yyyy)', 'mm/dd/yy', 3, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$setting_id}, 'Nov 30, 2011', 'M d, yy', 4, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$setting_id}, 'November 30, 2011', 'MM d, yy', 5, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$setting_id}, 'Wed Nov 30, 2011 ', 'D M d, yy', 6, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$setting_id}, 'Wednesday, November 30, 2011', 'DD, MM d, yy', 7, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$setting_id}, '30. 08. 2011.', 'dd. mm. yy.', 8, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$setting_id}, '30/11/2011 8:00 PM', 'datetime:dd/mm/yy|h:mm TT|ampm`true', 9, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$setting_id}, '11/30/2011 8:00 PM', 'datetime:mm/dd/yy|h:mm TT|ampm`true', 10, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$setting_id}, '2011-11-30 8:00 PM', 'datetime:yy-mm-dd|h:mm TT|ampm`true', 11, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$setting_id}, '2011-11-30 20:00', 'datetime:yy-mm-dd|hh:mm', 12, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$setting_id}, '2011-11-30 20:00:00', 'datetime:yy-mm-dd|hh:mm:ss|showSecond`true', 13, 'yes')"); mysql_query("INSERT INTO {$g_table_prefix}field_type_setting_options VALUES ({$setting_id}, '30. 08. 2011. 20:00', 'datetime:dd. mm. yy.|hh:mm', 14, 'yes')"); mysql_query("\r\n UPDATE {$g_table_prefix}field_types\r\n SET view_field_smarty_markup = '{strip}\r\n {if \$VALUE}\r\n {assign var=tzo value=\"\"}\r\n {if \$apply_timezone_offset == \"yes\"}\r\n {assign var=tzo value=\$ACCOUNT_INFO.timezone_offset}\r\n {/if}\r\n {if \$display_format == \"yy-mm-dd\" || !\$display_format}\r\n {\$VALUE|custom_format_date:\$tzo:\"Y-m-d\"}\r\n {elseif \$display_format == \"dd/mm/yy\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"d/m/Y\"}\r\n {elseif \$display_format == \"mm/dd/yy\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"m/d/Y\"}\r\n {elseif \$display_format == \"M d, yy\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"M j, Y\"}\r\n {elseif \$display_format == \"MM d, yy\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"F j, Y\"}\r\n {elseif \$display_format == \"D M d, yy\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"D M j, Y\"}\r\n {elseif \$display_format == \"DD, MM d, yy\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"l M j, Y\"}\r\n {elseif \$display_format == \"dd. mm. yy.\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"d. m. Y.\"}\r\n {elseif \$display_format == \"datetime:dd/mm/yy|h:mm TT|ampm`true\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"d/m/Y g:i A\"}\r\n {elseif \$display_format == \"datetime:mm/dd/yy|h:mm TT|ampm`true\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"m/d/Y g:i A\"}\r\n {elseif \$display_format == \"datetime:yy-mm-dd|h:mm TT|ampm`true\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"Y-m-d g:i A\"}\r\n {elseif \$display_format == \"datetime:yy-mm-dd|hh:mm\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"Y-m-d H:i\"}\r\n {elseif \$display_format == \"datetime:yy-mm-dd|hh:mm:ss|showSecond`true\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"Y-m-d H:i:s\"}\r\n {elseif \$display_format == \"datetime:dd. mm. yy.|hh:mm\"}\r\n {\$VALUE|custom_format_date:\$tzo:\"d. m. Y. H:i\"}\r\n {/if}\r\n{/if}{/strip}',\r\n edit_field_smarty_markup = '{assign var=class value=\"cf_datepicker\"}\r\n{if \$display_format|strpos:\"datetime\" === 0}\r\n {assign var=class value=\"cf_datetimepicker\"}\r\n{/if}\r\n\r\n{assign var=\"val\" value=\"\"}\r\n{if \$VALUE}\r\n {assign var=tzo value=\"\"}\r\n {if \$apply_timezone_offset == \"yes\"}\r\n {assign var=tzo value=\$ACCOUNT_INFO.timezone_offset}\r\n {/if}\r\n {if \$display_format == \"yy-mm-dd\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"Y-m-d\"}\r\n {elseif \$display_format == \"dd/mm/yy\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"d/m/Y\"}\r\n {elseif \$display_format == \"mm/dd/yy\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"m/d/Y\"}\r\n {elseif \$display_format == \"M d, yy\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"M j, Y\"}\r\n {elseif \$display_format == \"MM d, yy\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"F j, Y\"}\r\n {elseif \$display_format == \"D M d, yy\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"D M j, Y\"}\r\n {elseif \$display_format == \"DD, MM d, yy\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"l M j, Y\"}\r\n {elseif \$display_format == \"dd. mm. yy.\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"d. m. Y.\"}\r\n {elseif \$display_format == \"datetime:dd/mm/yy|h:mm TT|ampm`true\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"d/m/Y g:i A\"}\r\n {elseif \$display_format == \"datetime:mm/dd/yy|h:mm TT|ampm`true\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"m/d/Y g:i A\"}\r\n {elseif \$display_format == \"datetime:yy-mm-dd|h:mm TT|ampm`true\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"Y-m-d g:i A\"}\r\n {elseif \$display_format == \"datetime:yy-mm-dd|hh:mm\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"Y-m-d H:i\"}\r\n {elseif \$display_format == \"datetime:yy-mm-dd|hh:mm:ss|showSecond`true\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"Y-m-d H:i:s\"}\r\n {elseif \$display_format == \"datetime:dd. mm. yy.|hh:mm\"}\r\n {assign var=val value=\$VALUE|custom_format_date:\$tzo:\"d. m. Y. H:i\"}\r\n {/if}\r\n{/if}\r\n\r\n<div class=\"cf_date_group\">\r\n <input type=\"input\" name=\"{\$NAME}\" id=\"{\$NAME}_id\" \r\n class=\"cf_datefield {\$class}\" value=\"{\$val}\" /><img class=\"ui-datepicker-trigger\" src=\"{\$g_root_url}/global/images/calendar.png\" id=\"{\$NAME}_icon_id\" />\r\n <input type=\"hidden\" id=\"{\$NAME}_format\" value=\"{\$display_format}\" />\r\n {if \$comments}\r\n <div class=\"cf_field_comments\">{\$comments}</div>\r\n {/if}\r\n</div>',\r\n php_processing = '\$field_name = \$vars[\"field_info\"][\"field_name\"];\r\n\$date = \$vars[\"data\"][\$field_name];\r\n\$display_format = \$vars[\"settings\"][\"display_format\"];\r\n\$atzo = \$vars[\"settings\"][\"apply_timezone_offset\"];\r\n\$account_info = isset(\$vars[\"account_info\"]) ? \$vars[\"account_info\"] : array();\r\n\r\nif (empty(\$date))\r\n{\r\n \$value = \"\";\r\n}\r\nelse\r\n{\r\n if (strpos(\$display_format, \"datetime:\") === 0)\r\n {\r\n \$parts = explode(\" \", \$date);\r\n switch (\$display_format)\r\n {\r\n case \"datetime:dd/mm/yy|h:mm TT|ampm`true\":\r\n \$date = substr(\$date, 3, 2) . \"/\" . substr(\$date, 0, 2) . \"/\" . \r\n substr(\$date, 6);\r\n break;\r\n case \"datetime:dd. mm. yy.|hh:mm\":\r\n \$date = substr(\$date, 4, 2) . \"/\" . substr(\$date, 0, 2) . \"/\" . \r\n substr(\$date, 8, 4) . \" \" . substr(\$date, 14);\r\n break;\r\n }\r\n }\r\n else\r\n {\r\n if (\$display_format == \"dd/mm/yy\")\r\n {\r\n \$date = substr(\$date, 3, 2) . \"/\" . substr(\$date, 0, 2) . \"/\" . \r\n substr(\$date, 6);\r\n } \r\n else if (\$display_format == \"dd. mm. yy.\")\r\n {\r\n \$parts = explode(\" \", \$date);\r\n \$date = trim(\$parts[1], \".\") . \"/\" . trim(\$parts[0], \".\") . \"/\" . trim(\$parts[2], \".\");\r\n }\r\n }\r\n\r\n \$time = strtotime(\$date);\r\n \r\n // lastly, if this field has a timezone offset being applied to it, do the\r\n // appropriate math on the date\r\n if (\$atzo == \"yes\" && !isset(\$account_info[\"timezone_offset\"]))\r\n {\r\n \$seconds_offset = \$account_info[\"timezone_offset\"] * 60 * 60;\r\n \$time += \$seconds_offset;\r\n }\r\n\r\n \$value = date(\"Y-m-d H:i:s\", \$time);\r\n}\r\n\r\n'\r\n WHERE field_type_id = {$field_type_id}\r\n "); } // 2.1.3: swatches + new "email_template_when_sent_views" table to log multiple "when sent" email-View mapping $has_problems = false; if ($old_version_info["release_date"] < 20110927) { $upgrade_attempted = true; $queries = array(); $queries[] = "\r\n \t ALTER TABLE {$g_table_prefix}themes\r\n \t ADD uses_swatches ENUM('yes', 'no') NOT NULL DEFAULT 'no' AFTER theme_name,\r\n ADD swatches MEDIUMTEXT NULL AFTER uses_swatches\r\n \t"; $queries[] = "ALTER TABLE {$g_table_prefix}accounts ADD swatch VARCHAR(255) NOT NULL AFTER theme"; $queries[] = "UPDATE {$g_table_prefix}accounts SET swatch = 'green' WHERE theme = 'default'"; $queries[] = "\r\n CREATE TABLE {$g_table_prefix}email_template_when_sent_views (\r\n email_id MEDIUMINT NOT NULL,\r\n view_id MEDIUMINT NOT NULL\r\n ) DEFAULT CHARSET=utf8\r\n "; $find_query = mysql_query("\r\n SELECT email_id, view_mapping_view_id\r\n FROM {$g_table_prefix}email_templates\r\n WHERE view_mapping_view_id != '' AND view_mapping_view_id IS NOT NULL\r\n "); while ($row = mysql_fetch_assoc($find_query)) { $email_id = $row["email_id"]; $view_id = $row["view_mapping_view_id"]; $queries[] = "INSERT INTO {$g_table_prefix}email_template_when_sent_views (email_id, view_id) VALUES ({$email_id}, {$view_id})"; } ft_set_settings(array("default_client_swatch" => "green")); foreach ($queries as $query) { $result = @mysql_query($query); if (!$result) { $has_problems = true; $success = false; $mysql_error = "<i>{$query}></i> [" . mysql_error() . "]"; $error_message = ft_eval_smarty_string($LANG["notify_problem_upgrading"], array("version" => $g_current_version)); $link_text = ft_eval_smarty_string($LANG["phrase_upgrade_problem_link"], array("link" => "http://docs.formtools.org/upgrading/?page=problems_upgrading")); $message = $error_message . " " . $mysql_error . "<br />" . $_LANG["phrase_upgrade_problem_link"] . " " . $link_text; break; } } // if there were ANY problems, undo all the changes we just did if ($has_problems) { @mysql_query("ALTER TABLE {$g_table_prefix}themes DROP uses_swatches"); @mysql_query("ALTER TABLE {$g_table_prefix}themes DROP swatches"); @mysql_query("ALTER TABLE {$g_table_prefix}accounts DROP swatch"); @mysql_query("DROP TABLE {$g_table_prefix}email_template_when_sent_views"); @mysql_query("DELETE FROM {$g_table_prefix}settings WHERE setting_name='default_client_swatch' AND module='core'"); } else { // delete the old view_mapping_view_id column from the email_templates table @mysql_query("ALTER TABLE {$g_table_prefix}email_templates DROP view_mapping_view_id"); // refresh the theme list. This updates Form Tools to recognize the new swatches for the default theme, saving // the administrator from having to click the "Refresh Theme List" button ft_update_theme_list(); } } // 2.1.4: field validation $has_problems = false; if ($old_version_info["release_date"] < 20111007) { $upgrade_attempted = true; @mysql_query("ALTER TABLE {$g_table_prefix}form_fields DROP option_list_id"); @mysql_query("ALTER TABLE {$g_table_prefix}modules CHANGE module_key module_key VARCHAR(15)"); $queries = array(); $queries[] = "\r\n CREATE TABLE {$g_table_prefix}field_type_validation_rules (\r\n rule_id mediumint(8) unsigned NOT NULL AUTO_INCREMENT,\r\n field_type_id mediumint(9) NOT NULL,\r\n rsv_rule varchar(50) NOT NULL,\r\n rule_label varchar(100) NOT NULL,\r\n rsv_field_name varchar(255) NOT NULL,\r\n custom_function varchar(100) NOT NULL,\r\n custom_function_required enum('yes','no','na') NOT NULL DEFAULT 'na',\r\n default_error_message mediumtext NOT NULL,\r\n list_order smallint(6) NOT NULL,\r\n PRIMARY KEY (rule_id)\r\n ) DEFAULT CHARSET=utf8\r\n "; $queries[] = "INSERT INTO {$g_table_prefix}field_type_validation_rules VALUES(1, 1, 'required', '{\$LANG.word_required}', '{\$field_name}', '', 'no', '{\$LANG.validation_default_rule_required}', 1)"; $queries[] = "INSERT INTO {$g_table_prefix}field_type_validation_rules VALUES(2, 1, 'valid_email', '{\$LANG.phrase_valid_email}', '{\$field_name}', '', 'no', '{\$LANG.validation_default_rule_valid_email}', 2)"; $queries[] = "INSERT INTO {$g_table_prefix}field_type_validation_rules VALUES(3, 1, 'digits_only', '{\$LANG.phrase_numbers_only}', '{\$field_name}', '', 'no', '{\$LANG.validation_default_rule_numbers_only}', 3)"; $queries[] = "INSERT INTO {$g_table_prefix}field_type_validation_rules VALUES(4, 1, 'letters_only', '{\$LANG.phrase_letters_only}', '{\$field_name}', '', 'no', '{\$LANG.validation_default_rule_letters_only}', 4)"; $queries[] = "INSERT INTO {$g_table_prefix}field_type_validation_rules VALUES(5, 1, 'is_alpha', '{\$LANG.phrase_alphanumeric}', '{\$field_name}', '', 'no', '{\$LANG.validation_default_rule_alpha}', 5)"; $queries[] = "INSERT INTO {$g_table_prefix}field_type_validation_rules VALUES(6, 2, 'required', '{\$LANG.word_required}', '{\$field_name}', '', '', '{\$LANG.validation_default_rule_required}', 1)"; $queries[] = "INSERT INTO {$g_table_prefix}field_type_validation_rules VALUES(7, 3, 'required', '{\$LANG.word_required}', '{\$field_name}', '', '', '{\$LANG.validation_default_rule_required}', 1)"; $queries[] = "INSERT INTO {$g_table_prefix}field_type_validation_rules VALUES(8, 4, 'required', '{\$LANG.word_required}', '{\$field_name}', '', '', '{\$LANG.validation_default_rule_required}', 1)"; $queries[] = "INSERT INTO {$g_table_prefix}field_type_validation_rules VALUES(9, 5, 'required', '{\$LANG.word_required}', '{\$field_name}[]', '', 'no', '{\$LANG.validation_default_rule_required}', 1)"; $queries[] = "INSERT INTO {$g_table_prefix}field_type_validation_rules VALUES(10, 6, 'required', '{\$LANG.word_required}', '{\$field_name}', '', '', '{\$LANG.validation_default_rule_required}', 1)"; $queries[] = "INSERT INTO {$g_table_prefix}field_type_validation_rules VALUES(11, 7, 'required', '{\$LANG.word_required}', '{\$field_name}[]', '', '', '{\$LANG.validation_default_rule_required}', 1)"; $queries[] = "INSERT INTO {$g_table_prefix}field_type_validation_rules VALUES(12, 8, 'required', '{\$LANG.word_required}', '{\$field_name}', '', 'no', '{\$LANG.validation_default_rule_required}', 1)"; $queries[] = "INSERT INTO {$g_table_prefix}field_type_validation_rules VALUES(13, 9, 'required', '{\$LANG.word_required}', '{\$field_name}', '', 'no', '{\$LANG.validation_default_rule_required}', 1)"; $queries[] = "INSERT INTO {$g_table_prefix}field_type_validation_rules VALUES(14, 10, 'function', '{\$LANG.word_required}', '', 'cf_phone.check_required', 'yes', '{\$LANG.validation_default_phone_num_required}', 1)"; $queries[] = "INSERT INTO {$g_table_prefix}field_type_validation_rules VALUES(15, 11, 'function', '{\$LANG.word_required}', '', 'cf_code.check_required', 'yes', '{\$LANG.validation_default_rule_required}', 1)"; $queries[] = "\r\n CREATE TABLE {$g_table_prefix}field_validation (\r\n rule_id mediumint(8) unsigned NOT NULL,\r\n field_id mediumint(9) NOT NULL,\r\n error_message mediumtext NOT NULL,\r\n UNIQUE KEY rule_id (rule_id,field_id)\r\n ) DEFAULT CHARSET=utf8\r\n "; // now update the field types that have changed: phone & code/markup $queries[] = "UPDATE {$g_table_prefix}field_types SET resources_js = 'var cf_phone = {};\r\ncf_phone.check_required = function() {\r\n var errors = [];\r\n for (var i=0; i<rsv_custom_func_errors.length; i++) {\r\n if (rsv_custom_func_errors[i].func != \"cf_phone.check_required\") {\r\n continue;\r\n }\r\n var field_name = rsv_custom_func_errors[i].field;\r\n var fields = \$(\"input[name^=\\\\\"\" + field_name + \"_\\\\\"]\");\r\n fields.each(function() {\r\n if (!this.name.match(/_(\\\\d+)\$/)) {\r\n return;\r\n }\r\n var req_len = \$(this).attr(\"maxlength\");\r\n var actual_len = this.value.length;\r\n if (req_len != actual_len || this.value.match(/\\\\D/)) {\r\n var el = document.edit_submission_form[field_name];\r\n errors.push([el, rsv_custom_func_errors[i].err]);\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n if (errors.length) {\r\n return errors;\r\n }\r\n\r\n return true;\r\n \r\n}' WHERE field_type_identifier = 'phone'"; $queries[] = "UPDATE {$g_table_prefix}field_types SET resources_js = 'var cf_code = {};\r\ncf_code.check_required = function() {\r\n var errors = [];\r\n for (var i=0; i<rsv_custom_func_errors.length; i++) {\r\n if (rsv_custom_func_errors[i].func != \"cf_code.check_required\") {\r\n continue;\r\n }\r\n var field_name = rsv_custom_func_errors[i].field;\r\n var val = \$.trim(window[\"code_mirror_\" + field_name].getCode());\r\n if (!val) {\r\n var el = document.edit_submission_form[field_name];\r\n errors.push([el, rsv_custom_func_errors[i].err]);\r\n }\r\n }\r\n if (errors.length) {\r\n return errors;\r\n }\r\n return true; \r\n}\r\n' WHERE field_type_identifier = 'code_markup'"; foreach ($queries as $query) { $result = @mysql_query($query); if (!$result) { $has_problems = true; $success = false; $mysql_error = "<i>{$query}></i> [" . mysql_error() . "]"; $error_message = ft_eval_smarty_string($LANG["notify_problem_upgrading"], array("version" => $g_current_version)); $link_text = ft_eval_smarty_string($LANG["phrase_upgrade_problem_link"], array("link" => "http://docs.formtools.org/upgrading/?page=problems_upgrading")); $message = $error_message . " " . $mysql_error . "<br />" . $_LANG["phrase_upgrade_problem_link"] . " " . $link_text; break; } } // if there were ANY problems, undo all the changes we just did if ($has_problems) { @mysql_query("DROP TABLE {$g_table_prefix}field_type_validation_rules"); @mysql_query("DROP TABLE {$g_table_prefix}field_validation"); // the changes to the field types don't need to be undone; they just added functions } } // 2.1.5 $has_problems = false; if ($old_version_info["release_date"] < 20111022) { $upgrade_attempted = true; $setting = array("core_version_upgrade_track" => "unknown"); ft_set_settings($setting); $queries = array(); $queries[] = "\r\n ALTER TABLE {$g_table_prefix}forms\r\n CHANGE form_type form_type ENUM('internal', 'external', 'form_builder')\r\n CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'external'\r\n "; foreach ($queries as $query) { $result = @mysql_query($query); if (!$result) { $has_problems = true; $success = false; $mysql_error = "<i>{$query}></i> [" . mysql_error() . "]"; $error_message = ft_eval_smarty_string($LANG["notify_problem_upgrading"], array("version" => $g_current_version)); $link_text = ft_eval_smarty_string($LANG["phrase_upgrade_problem_link"], array("link" => "http://docs.formtools.org/upgrading/?page=problems_upgrading")); $message = $error_message . " " . $mysql_error . "<br />" . $_LANG["phrase_upgrade_problem_link"] . " " . $link_text; break; } } } // ---------------------------------------------------------------------------------------------- // if no problems were encountered, and the the full version string (version-type-date) has changed, // update the database if ($old_version_info["full"] != "{$g_current_version}-{$g_release_type}-{$g_release_date}" && !$has_problems) { $upgrade_attempted = true; $upgrade_track = ft_get_settings("core_version_upgrade_track"); $upgrade_track .= ",{$g_current_version}-{$g_release_type}-{$g_release_date}"; $new_settings = array("program_version" => $g_current_version, "release_date" => $g_release_date, "release_type" => $g_release_type, "core_version_upgrade_track" => $upgrade_track); ft_set_settings($new_settings); // any time the Core version changes, we need to update the list of hooks found in the source files ft_update_available_hooks(); $success = true; } return array("upgraded" => $upgrade_attempted, "success" => $success, "message" => $message); }
$page_vars["num_fields_per_page"] = "all"; $page_vars["pagination"] = ""; $page_vars["sortable_id"] = $sortable_id; $page_vars["limit_fields"] = isset($g_max_ft_form_fields) && !empty($g_max_ft_form_fields) ? true : false; if ($num_fields_per_page != "all") { $page_vars["order_start_number"] = ($fields_page - 1) * $num_fields_per_page + 1; $page_vars["num_fields_per_page"] = $num_fields_per_page; $pagination_settings = array("show_total_results" => false, "show_page_label" => false); $page_vars["pagination"] = ft_get_page_nav($total_form_fields, $num_fields_per_page, $fields_page, "", "fields_page", "", $pagination_settings); } $page_vars["head_string"] = <<<END <script src="{$g_root_url}/global/scripts/sortable.js?v=2"></script> <script src="{$g_root_url}/global/scripts/manage_fields.js?v=3"></script> END; $replacement_info = array("views_tab_link" => "{$php_self}?page=views&form_id={$form_id}"); $page_vars["text_fields_tab_summary"] = ft_eval_smarty_string($LANG["text_fields_tab_summary"], $replacement_info); $page_vars["js_messages"] = array("validation_no_form_field_name", "validation_invalid_form_field_names", "word_okay", "word_error", "validation_num_rows_to_add", "word_row", "phrase_please_confirm", "confirm_smart_fill_db_column_fields", "confirm_smart_fill_db_column_fields_desc", "word_cancel", "phrase_smart_fill", "validation_no_display_text", "validation_no_form_field_name", "validation_duplicate_form_field_name", "validation_no_column_name", "validation_col_name_is_reserved_word", "validation_invalid_column_name", "validation_no_two_column_names", "phrase_edit_field", "word_close", "phrase_save_changes", "phrase_field_specific_settings", "phrase_edit_field_c", "notify_no_field_settings", "word_value", "word_field", "phrase_use_default_value_q", "word_setting", "phrase_please_select", "notify_field_changes_saved", "phrase_create_new_option_list", "phrase_edit_option_list", "word_no", "word_yes", "validation_no_display_text_single", "validation_no_form_field_single", "validation_no_db_column_single", "notify_edit_field_new_field", "notify_edit_option_list_after_save", "confirm_save_change_before_redirect", "notify_error_saving_fields", "phrase_select_field", "word_order", "word_settings", "phrase_field_type_no_validation", "phrase_validation_rule", "text_error_message_to_show", "phrase_no_option_lists_available", "phrase_available_option_lists", "phrase_form_field_contents", "word_validation"); $edit_field_onload_js = ""; $limit_fields_enabled_js = $page_vars["limit_fields"] ? "fields_ns.limit_fields_enabled = true;\n fields_ns.max_fields = {$g_max_ft_form_fields};" : ""; if (isset($_GET["field_id"])) { $edit_field_onload_js = <<<EOF var row_group = \$(".sr_order[value={$_GET["field_id"]}]").closest(".row_group"); if (row_group.length) { fields_ns.edit_field(row_group); } EOF; } $page_vars["head_js"] = <<<END var page_ns = { reserved_words: [{$reserved_words}], form_id: {$form_id},
<?php if (isset($request["update_account_settings"])) { $account_id = $_SESSION["ft"]["account"]["account_id"]; $request["page"] = "settings"; list($g_success, $g_message) = ft_update_client($account_id, $request); } $client_info = ft_get_account_info($account_id); // compile header information $page_vars = array(); $page_vars["head_title"] = ft_eval_smarty_string($_SESSION["ft"]["account"]["settings"]["page_titles"], array("page" => $LANG["phrase_account_settings"])); $page_vars["page"] = "settings"; $page_vars["tabs"] = $tabs; $page_vars["client_info"] = $client_info; $page_vars["page_url"] = ft_get_page_url("client_account_settings"); $js = array("var rules = []"); if ($client_info["settings"]["may_edit_page_titles"] == "yes") { $js[] = "rules.push(\"required,page_titles,{$LANG["validation_no_titles"]}\")"; } if ($client_info["settings"]["may_edit_theme"] == "yes") { $js[] = "rules.push(\"required,theme,{$LANG["validation_no_theme"]}\")"; $js[] = "rules.push(\"function,validate_swatch\")"; } if ($client_info["settings"]["may_edit_logout_url"] == "yes") { $js[] = "rules.push(\"required,logout_url,{$LANG["validation_no_logout_url"]}\")"; } if ($client_info["settings"]["may_edit_language"] == "yes") { $js[] = "rules.push(\"required,ui_language,{$LANG["validation_no_ui_language"]}\")"; } if ($client_info["settings"]["may_edit_timezone_offset"] == "yes") { $js[] = "rules.push(\"required,timezone_offset,{$LANG["validation_no_timezone_offset"]}\")";
continue; } // if this is a NEW field, we just ignore it here. New fields are only added by updating the main page, not // via the Edit Field dialog if (preg_match("/^NEW/", $field_id)) { continue; } list($success, $message) = ft_update_field($form_id, $field_id, $request["data"]["field_{$field_id}"]); if (!$success) { $problems[] = array("field_id" => $field_id, "error" => $message); } } if (!empty($problems)) { $problems_json = ft_convert_to_json($problems); echo "{ \"success\": \"0\", \"problems\": {$problems_json}{$return_str} }"; } else { echo "{ \"success\": \"1\"{$return_str} }"; } break; // used to return a page outlining all the form field placeholders available // used to return a page outlining all the form field placeholders available case "get_form_field_placeholders": $form_id = $request["form_id"]; $text_reference_tab_info = ft_eval_smarty_string($LANG["text_reference_tab_info"], array("g_root_url" => $g_root_url)); $page_vars = array(); $page_vars["form_id"] = $form_id; $page_vars["form_fields"] = ft_get_form_fields($form_id, array("include_field_type_info" => true)); $page_vars["text_reference_tab_info"] = $text_reference_tab_info; ft_display_page("admin/forms/form_placeholders.tpl", $page_vars); break; }
/** * This should be the one and only place that actually generates the content for a field, for it * to be Viewed. This is used on the Submission Listing page, Edit Submission page (for viewable, * non-editable fields), in the Export Manager, in the Email Templates, and anywhere else that needs * to output the content of a field. * * This function is the main source of slowness in 2.1.0. I'll be investigating ways to speed it up * in the Beta. * * @param array $params a hash with the following: * REQUIRED VALUES: * form_id * submission_id * field_info - a hash containing details of the field: * REQUIRED: * field_id * field_type_id * col_name * field_name * settings - all extended settings defined for the field * OPTIONAL: * anything else you want * field_types - all, or any that are relevant. But it should be an array, anyway * value - the actual value stored in the field * settings - (from ft_get_settings()) * @return string */ function ft_generate_viewable_field($params) { global $LANG, $g_root_url, $g_root_dir, $g_multi_val_delimiter, $g_cache; // REQUIRED $form_id = $params["form_id"]; $submission_id = $params["submission_id"]; $field_info = $params["field_info"]; $field_types = $params["field_types"]; $value = $params["value"]; $settings = $params["settings"]; $context = $params["context"]; // loop through the field types and store the one we're interested in in $field_type_info $field_type_info = array(); foreach ($field_types as $curr_field_type) { if ($field_info["field_type_id"] == $curr_field_type["field_type_id"]) { $field_type_info = $curr_field_type; break; } } $markup_with_placeholders = trim($field_type_info["view_field_smarty_markup"]); $field_settings = $field_info["field_settings"]; $output = ""; if ($field_type_info["view_field_rendering_type"] == "none" || empty($markup_with_placeholders)) { $output = $value; } else { $account_info = isset($_SESSION["ft"]["account"]) ? $_SESSION["ft"]["account"] : array(); // now construct all available placeholders $placeholders = array("FORM_ID" => $form_id, "SUBMISSION_ID" => $submission_id, "FIELD_ID" => $field_info["field_id"], "NAME" => $field_info["field_name"], "COLNAME" => $field_info["col_name"], "VALUE" => $value, "SETTINGS" => $settings, "CONTEXTPAGE" => $context, "ACCOUNT_INFO" => $account_info, "g_root_url" => $g_root_url, "g_root_dir" => $g_root_dir, "g_multi_val_delimiter" => $g_multi_val_delimiter); // add in all field type settings and their replacements foreach ($field_type_info["settings"] as $setting_info) { $curr_setting_id = $setting_info["setting_id"]; $curr_setting_field_type = $setting_info["field_type"]; $default_value_type = $setting_info["default_value_type"]; $value = $setting_info["default_value"]; $identifier = $setting_info["field_setting_identifier"]; if (isset($field_settings) && !empty($field_settings)) { for ($i = 0; $i < count($field_settings); $i++) { while (list($setting_id, $setting_value) = each($field_settings[$i])) { if ($setting_id == $curr_setting_id) { $value = $setting_value; break; } } reset($field_settings); } } // next, if the setting is dynamic, convert the stored value if ($default_value_type == "dynamic") { // dynamic setting values should ALWAYS be of the form "setting_name,module_folder/'core'". If they're not, just ignore it $parts = explode(",", $value); if (count($parts) == 2) { $dynamic_setting_str = $value; // "setting_name,module_folder/'core'" if (!array_key_exists("dynamic_settings", $g_cache)) { $g_cache["dynamic_settings"] = array(); } if (array_key_exists($dynamic_setting_str, $g_cache["dynamic_settings"])) { $value = $g_cache["dynamic_settings"][$dynamic_setting_str]; } else { $value = ft_get_settings($parts[0], $parts[1]); $g_cache["dynamic_settings"][$dynamic_setting_str] = $value; } } } // if this setting type is a dropdown list and $value is non-empty, get the option list if ($curr_setting_field_type == "option_list_or_form_field" && !empty($value)) { if (preg_match("/form_field:/", $value)) { $value = ft_get_mapped_form_field_data($value); } else { $option_list_id = $value; if (!array_key_exists("option_lists", $g_cache)) { $g_cache["option_lists"] = array(); } if (array_key_exists($option_list_id, $g_cache["option_lists"])) { $value = $g_cache["option_lists"][$option_list_id]; } else { $value = ft_get_option_list($option_list_id); $g_cache["option_lists"][$option_list_id] = $value; } } } $placeholders[$identifier] = $value; } if ($field_type_info["view_field_rendering_type"] == "php") { $php_function = $field_type_info["view_field_php_function"]; // if this is a module, include the module's library.php file so we have access to the function if ($field_type_info["view_field_php_function_source"] != "core" && is_numeric($field_type_info["view_field_php_function_source"])) { $module_folder = ft_get_module_folder_from_module_id($field_type_info["view_field_php_function_source"]); @(include_once "{$g_root_dir}/modules/{$module_folder}/library.php"); } if (function_exists($php_function)) { $output = $php_function($placeholders); } } else { $output = ft_eval_smarty_string($markup_with_placeholders, $placeholders); } } return $output; }
/** * This function updates the default menu for multiple accounts simultaneously. It's called when * an administrator tries to delete a menu that's current used by some client accounts. They're presented * with the option of setting the menu ID for all the clients. * * There's very little error checking done here... * * @param string $account_id_str a comma delimited list of account IDs * @param integer $theme_id the theme ID */ function ft_update_client_menus($account_ids, $menu_id) { global $LANG, $g_table_prefix; if (empty($account_ids) || empty($menu_id)) { return; } $client_ids = explode(",", $account_ids); $menu_info = ft_get_menu($menu_id); $menu_name = $menu_info["menu"]; foreach ($client_ids as $client_id) { mysql_query("UPDATE {$g_table_prefix}accounts SET menu_id={$menu_id} WHERE account_id = {$client_id}"); } $placeholders = array("menu_name" => $menu_name); $message = ft_eval_smarty_string($LANG["notify_client_account_menus_updated"], $placeholders); return array(true, $message); }
<?php if (isset($request["update_main"])) { list($g_success, $g_message) = ft_update_main_settings($_POST); } $page_vars = array(); $page_vars["page"] = "main"; $page_vars["page_url"] = ft_get_page_url("settings_main"); $page_vars["tabs"] = $tabs; $page_vars["head_title"] = "{$LANG["word_settings"]} - {$LANG["word_main"]}"; $replacement_info = array("datefunctionlink" => '<a href="http://ca3.php.net/manual/en/function.date.php" target="_blank">date()</a>'); $page_vars["text_date_formatting_link"] = ft_eval_smarty_string($LANG["text_date_formatting_link"], $replacement_info); $page_vars["head_js"] = <<<END var rules = []; rules.push("required,program_name,{$LANG["validation_no_program_name"]}"); rules.push("required,num_clients_per_page,{$LANG["validation_no_num_clients_per_page"]}"); rules.push("digits_only,num_clients_per_page,{$LANG["validation_invalid_num_clients_per_page"]}"); rules.push("required,num_emails_per_page,{$LANG["validation_no_num_emails_per_page"]}"); rules.push("digits_only,num_emails_per_page,{$LANG["validation_invalid_num_emails_per_page"]}"); rules.push("required,num_forms_per_page,{$LANG["validation_no_num_forms_per_page"]}"); rules.push("digits_only,num_forms_per_page,{$LANG["validation_invalid_num_forms_per_page"]}"); rules.push("required,num_option_lists_per_page,{$LANG["validation_no_num_option_lists_per_page"]}"); rules.push("digits_only,num_option_lists_per_page,{$LANG["validation_invalid_num_option_lists_per_page"]}"); rules.push("required,num_menus_per_page,{$LANG["validation_no_num_menus_per_page"]}"); rules.push("digits_only,num_menus_per_page,{$LANG["validation_invalid_num_menus_per_page"]}"); rules.push("required,num_modules_per_page,{$LANG["validation_no_num_modules_per_page"]}"); rules.push("digits_only,num_modules_per_page,{$LANG["validation_invalid_num_modules_per_page"]}"); END; ft_display_page("admin/settings/index.tpl", $page_vars);
$page = ft_eval_smarty_string($template, $placeholders); if ($export_group_info["action"] == "new_window" || $export_group_info["action"] == "popup") { // if required, send the HTTP headers if (!empty($export_group_info["headers"])) { $headers = preg_replace("/\r\n|\r/", "\n", $export_group_info["headers"]); $header_lines = explode("\n", $headers); foreach ($header_lines as $header) { header(ft_eval_smarty_string($header, $placeholders)); } } echo $page; } else { $settings = ft_get_settings("", "export_manager"); $file_upload_dir = $settings["file_upload_dir"]; $file_upload_url = $settings["file_upload_url"]; $file = "{$file_upload_dir}/{$placeholders["filename"]}"; if ($handle = @fopen($file, "w")) { fwrite($handle, $page); fclose($handle); @chmod($file, 0777); $placeholders = array("url" => "{$file_upload_url}/{$placeholders["filename"]}"); $message = ft_eval_smarty_string($LANG["export_manager"]["notify_file_generated"], $placeholders); echo "{ \"success\": 1, \"message\": \"{$message}\", \"target_message_id\": \"ft_message\" }"; exit; } else { $placeholders = array("url" => "{$file_upload_url}/{$placeholders["filename"]}", "folder" => $file_upload_dir, "export_manager_settings_link" => "{$g_root_url}/modules/export_manager/settings.php"); $message = ft_eval_smarty_string($LANG["export_manager"]["notify_file_not_generated"], $placeholders); echo "{ \"success\": 0, \"message\": \"{$message}\", \"target_message_id\": \"ft_message\" }"; exit; } }
$updated_field_option_groups = array(); $updated_option_lists = array(); foreach ($option_lists as $option_list) { $list_id = $option_list["list_id"]; // add the number of fields that use this option group $option_list["num_fields"] = ft_get_num_fields_using_option_list($list_id); if ($option_list["num_fields"] > 0) { $option_list["fields"] = ft_get_fields_using_option_list($list_id, array("group_by_form" => true)); } // add the total number of options in this group $option_list["num_option_list_options"] = ft_get_num_options_in_option_list($list_id); $updated_option_lists[] = $option_list; } $all_option_lists = ft_get_option_lists("all"); // ------------------------------------------------------------------------------------------------ // compile template info $page_vars = array(); $page_vars["page"] = "option_lists"; $page_vars["text_option_list_page"] = ft_eval_smarty_string($LANG["text_option_list_page"], array("link" => "../add/step1.php")); $page_vars["page_url"] = ft_get_page_url("option_lists"); $page_vars["head_title"] = $LANG["phrase_option_lists"]; $page_vars["option_lists"] = $updated_option_lists; $page_vars["num_option_lists"] = $num_option_lists; $page_vars["all_option_lists"] = $all_option_lists["results"]; $page_vars["order"] = $order; $page_vars["js_messages"] = array("validation_delete_non_empty_option_list", "confirm_delete_option_list", "phrase_please_confirm", "word_yes", "word_no", "word_edit", "word_remove"); $page_vars["pagination"] = ft_get_page_nav($num_option_lists, $num_option_lists_per_page, $option_list_page); $page_vars["head_string"] = <<<END <script src="{$g_root_url}/global/scripts/manage_option_lists.js"></script> END; ft_display_page("admin/forms/option_lists/index.tpl", $page_vars);
$account_type = isset($_SESSION["ft"]["account"]["account_type"]) ? $_SESSION["ft"]["account"]["account_type"] : ""; $account_id = isset($_SESSION["ft"]["account"]["account_id"]) ? $_SESSION["ft"]["account"]["account_id"] : ""; if ($account_type == "client" && $page_info["access_type"] == "private") { if (!in_array($account_id, $page_info["clients"])) { ft_handle_error("Sorry, you do not have permissions to see this page."); exit; } } $content = $page_info["content"]; switch ($page_info["content_type"]) { case "php": ob_start(); eval($page_info["content"]); $content = ob_get_contents(); ob_end_clean(); break; case "smarty": $content = ft_eval_smarty_string($page_info["content"]); break; } // ------------------------------------------------------------------------------------------------ $page_vars = array(); $page_vars["page"] = "custom_page"; $page_vars["page_id"] = $page_id; $page_vars["phrase_edit_page"] = $LANG["pages"]["phrase_edit_page"]; $page_vars["account_type"] = $account_type; $page_vars["page_url"] = ft_get_page_url("custom_page"); $page_vars["head_title"] = "{$LANG["pages"]["word_page"]} - {$page_info["heading"]}"; $page_vars["page_info"] = $page_info; $page_vars["content"] = $content; ft_display_page("../../modules/pages/templates/page.tpl", $page_vars);
$order = ft_load_field("order", "form_sort_order", "form_id-DESC"); $keyword = ft_load_field("keyword", "form_search_keyword", ""); $status = ft_load_field("status", "form_search_status", ""); $client_id = ft_load_field("client_id", "form_search_client_id", ""); $search_criteria = array("order" => $order, "keyword" => $keyword, "status" => $status, "client_id" => $client_id); $num_forms = ft_get_form_count(); $forms = ft_search_forms($client_id, true, $search_criteria); $clients = ft_get_client_list(); // ------------------------------------------------------------------------------------------------ // compile template info $page_vars = array(); $page_vars["page"] = "admin_forms"; $page_vars["page_url"] = ft_get_page_url("admin_forms"); $page_vars["head_title"] = $LANG["word_forms"]; $page_vars["has_client"] = count($clients) > 0 ? true : false; $page_vars["num_forms"] = $num_forms; $page_vars["max_forms_reached"] = !empty($g_max_ft_forms) && $num_forms >= $g_max_ft_forms ? true : false; $page_vars["max_forms"] = $g_max_ft_forms; $page_vars["notify_max_forms_reached"] = ft_eval_smarty_string($LANG["notify_max_forms_reached"], array("max_forms" => $g_max_ft_forms)); $page_vars["forms"] = $forms; $page_vars["order"] = $order; $page_vars["clients"] = $clients; $page_vars["search_criteria"] = $search_criteria; $page_vars["pagination"] = ft_get_dhtml_page_nav(count($forms), $_SESSION["ft"]["settings"]["num_forms_per_page"], 1); $page_vars["js_messages"] = array("word_remove", "word_edit", "phrase_open_form_in_new_tab_or_win", "word_close", "phrase_show_form"); $page_vars["head_js"] = <<<END \$(function() { ft.init_show_form_links(); }); END; ft_display_page("admin/forms/index.tpl", $page_vars);
$page_vars["selected_user_ids"] = $selected_user_ids; $page_vars["num_clients_on_omit_list"] = $num_clients_on_omit_list; $page_vars["date_field_ids"] = $date_field_ids; $page_vars["view_fields_sortable_id"] = $view_fields_sortable_id; $page_vars["submission_list_sortable_id"] = $submission_list_sortable_id; $page_vars["head_string"] = <<<END <script src="{$g_root_url}/global/scripts/jquery-ui-timepicker-addon.js"></script> <script src="{$g_root_url}/global/scripts/sortable.js?v=2"></script> <script src="{$g_root_url}/global/scripts/manage_views.js?v=4"></script> END; $replacements = array("user_doc_link" => "http://docs.formtools.org/userdoc2_1/index.php?page=view_filters"); $page_vars["text_filters_tips"] = ft_eval_smarty_string($LANG["text_filters_tips"], $replacements); $replacements = array("number" => "<input type=\"text\" name=\"num_standard_filter_rows\" id=\"num_standard_filter_rows\" value=\"1\" size=\"2\" />"); $page_vars["add_standard_filter_num_rows_input_field"] = ft_eval_smarty_string($LANG["phrase_add_num_rows"], $replacements); $replacements = array("number" => "<input type=\"text\" name=\"num_client_map_filter_rows\" id=\"num_client_map_filter_rows\" value=\"1\" size=\"2\" />"); $page_vars["add_client_map_filter_num_rows_input_field"] = ft_eval_smarty_string($LANG["phrase_add_num_rows"], $replacements); $page_vars["js_messages"] = array("word_remove", "validation_no_tabs_defined", "phrase_all_fields_displayed", "validation_invalid_tab_assign_values", "validation_num_rows_to_add", "phrase_please_select", "word_before", "word_after", "word_equals", "phrase_not_equal", "word_like", "phrase_not_like", "validation_no_view_name", "validation_no_num_submissions_per_page", "validation_no_view_fields", "validation_no_column_selected", "validation_no_view_fields_selected", "phrase_first_name", "phrase_last_name", "phrase_company_name", "word_email", "word_notes", "word_id", "phrase_remove_row", "phrase_available_tabs", "word_close", "phrase_add_fields", "phrase_create_group", "word_cancel", "word_yes", "word_no", "phrase_auto_size", "word_width_c"); $field_type_map_lines = array(); while (list($field_type_id, $field_type_name) = each($field_types)) { $field_type_map_lines[] = " \"ft{$field_type_id}\": \"{$field_type_name}\""; } $field_type_map = implode(",\n", $field_type_map_lines); $field_type_map_js = "view_ns.field_type_map = {\n{$field_type_map}\n};"; $page_vars["head_js"] = <<<END {$all_form_fields_js} {$field_type_map_js} {$js_string} \$(function() { ft.init_inner_tabs();