/** * Return method invalid message. * * @param type $method * @return type */ public static function get_message($method, $sprintf = '') { return wpcf_admin_validation_messages($method, $sprintf); if (is_null(self::$messages)) { self::_set_messages(); } if (isset(self::$messages[$method])) { return self::$messages[$method]; } return null; }
/** * Bulk translation. */ function wpcf_admin_bulk_string_translation() { if (!function_exists('icl_register_string')) { return false; } require_once WPCF_EMBEDDED_INC_ABSPATH . '/fields.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/custom-types.php'; require_once WPCF_INC_ABSPATH . '/custom-types-form.php'; require_once WPCF_EMBEDDED_INC_ABSPATH . '/custom-taxonomies.php'; require_once WPCF_INC_ABSPATH . '/custom-taxonomies-form.php'; // Register groups $groups = wpcf_admin_fields_get_groups(); foreach ($groups as $group_id => $group) { wpcf_translate_register_string('plugin Types', 'group ' . $group_id . ' name', $group['name']); if (isset($group['description'])) { wpcf_translate_register_string('plugin Types', 'group ' . $group_id . ' description', $group['description']); } } // Register fields $fields = wpcf_admin_fields_get_fields(); foreach ($fields as $field_id => $field) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' name', $field['name']); if (isset($field['description'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' description', $field['description']); } // For radios or select if (!empty($field['data']['options'])) { foreach ($field['data']['options'] as $name => $option) { if ($name == 'default') { continue; } if (isset($option['title'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' title', $option['title']); } if (isset($option['value'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' value', $option['value']); } if (isset($option['display_value'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' display value', $option['display_value']); } } } if ($field['type'] == 'checkbox' && (isset($field['set_value']) && $field['set_value'] != '1')) { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value', $field['set_value']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_selected'])) { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value selected', $field['display_value_selected']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_not_selected'])) { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value not selected', $field['display_value_not_selected']); } // Validation message if (!empty($field['data']['validate'])) { foreach ($field['data']['validate'] as $method => $validation) { if (!empty($validation['message'])) { // Skip if it's same as default $default_message = wpcf_admin_validation_messages($method); if ($validation['message'] != $default_message) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' validation message ' . $method, $validation['message']); } } } } } // Register types $custom_types = get_option('wpcf-custom-types', array()); foreach ($custom_types as $post_type => $data) { wpcf_custom_types_register_translation($post_type, $data); } // Register taxonomies $custom_taxonomies = get_option('wpcf-custom-taxonomies', array()); foreach ($custom_taxonomies as $taxonomy => $data) { wpcf_custom_taxonimies_register_translation($taxonomy, $data); } }
/** * Inits messages. */ private static function _set_messages() { // Set outside in /admin.php self::$messages = wpcf_admin_validation_messages(); }
/** * Saves field. * * @param type $field * @return type */ function wpcf_admin_fields_save_field($field) { if (!isset($field['name']) || !isset($field['type'])) { return false; } if (empty($field['slug'])) { $field['slug'] = sanitize_title($field['name']); } else { $field['slug'] = sanitize_title($field['slug']); } $field['id'] = $field['slug']; // Set field specific data // NOTE: This was $field['data'] = $field and seemed to work on most systems. // I changed it to asign via a temporary variable to fix on one system. $temp_field = $field; $field['data'] = $temp_field; // Unset default fields unset($field['data']['type'], $field['data']['slug'], $field['data']['name'], $field['data']['description'], $field['data']['user_id'], $field['data']['id'], $field['data']['data']); // Merge previous data (added because of outside fields) // @TODO Remember why if (wpcf_types_cf_under_control('check_outsider', $field['id'])) { $field_previous_data = wpcf_admin_fields_get_field($field['id']); if (!empty($field_previous_data['data'])) { $field['data'] = array_merge($field_previous_data['data'], $field['data']); } } $field['data'] = apply_filters('wpcf_fields_' . $field['type'] . '_meta_data', $field['data'], $field); // Check validation if (isset($field['data']['validate'])) { foreach ($field['data']['validate'] as $method => $data) { if (!isset($data['active'])) { unset($field['data']['validate'][$method]); } } if (empty($field['data']['validate'])) { unset($field['data']['validate']); } } $save_data = array(); $save_data['id'] = $field['id']; $save_data['slug'] = $field['slug']; $save_data['type'] = $field['type']; $save_data['name'] = $field['name']; $save_data['description'] = $field['description']; $save_data['data'] = $field['data']; $save_data['data']['disabled_by_type'] = 0; // For radios or select if (!empty($field['data']['options'])) { foreach ($field['data']['options'] as $name => $option) { if (isset($option['title'])) { $option['title'] = $field['data']['options'][$name]['title'] = htmlspecialchars_decode($option['title']); } if (isset($option['value'])) { $option['value'] = $field['data']['options'][$name]['value'] = htmlspecialchars_decode($option['value']); } if (isset($option['display_value'])) { $option['display_value'] = $field['data']['options'][$name]['display_value'] = htmlspecialchars_decode($option['display_value']); } // For checkboxes if ($field['type'] == 'checkboxes' && isset($option['set_value']) && $option['set_value'] != '1') { $option['set_value'] = $field['data']['options'][$name]['set_value'] = htmlspecialchars_decode($option['set_value']); } if ($field['type'] == 'checkboxes' && !empty($option['display_value_selected'])) { $option['display_value_selected'] = $field['data']['options'][$name]['display_value_selected'] = htmlspecialchars_decode($option['display_value_selected']); } if ($field['type'] == 'checkboxes' && !empty($option['display_value_not_selected'])) { $option['display_value_not_selected'] = $field['data']['options'][$name]['display_value_not_selected'] = htmlspecialchars_decode($option['display_value_not_selected']); } } } // For checkboxes if ($field['type'] == 'checkbox' && $field['set_value'] != '1') { $field['set_value'] = htmlspecialchars_decode($field['set_value']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_selected'])) { $field['display_value_selected'] = htmlspecialchars_decode($field['display_value_selected']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_not_selected'])) { $field['display_value_not_selected'] = htmlspecialchars_decode($field['display_value_not_selected']); } // Save field $fields = get_option('wpcf-fields', array()); $fields[$field['slug']] = $save_data; update_option('wpcf-fields', $fields); $field_id = $field['slug']; // WPML register strings if (function_exists('icl_register_string')) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' name', $field['name']); wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' description', $field['description']); // For radios or select if (!empty($field['data']['options'])) { foreach ($field['data']['options'] as $name => $option) { if ($name == 'default') { continue; } if (isset($option['title'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' title', $option['title']); } if (isset($option['value'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' value', $option['value']); } if (isset($option['display_value'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' display value', $option['display_value']); } // For checkboxes if (isset($option['set_value']) && $option['set_value'] != '1') { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' value', $option['set_value']); } if (!empty($option['display_value_selected'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' display value selected', $option['display_value_selected']); } if (!empty($option['display_value_not_selected'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' display value not selected', $option['display_value_not_selected']); } } } if ($field['type'] == 'checkbox' && $field['set_value'] != '1') { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value', $field['set_value']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_selected'])) { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value selected', $field['display_value_selected']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_not_selected'])) { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value not selected', $field['display_value_not_selected']); } // Validation message if (!empty($field['data']['validate'])) { foreach ($field['data']['validate'] as $method => $validation) { if (!empty($validation['message'])) { // Skip if it's same as default $default_message = wpcf_admin_validation_messages($method); if ($validation['message'] != $default_message) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' validation message ' . $method, $validation['message']); } } } } } return $field_id; }
/** * Renders JS validation rules. * * @return type */ function wpcf_form_render_js_validation($form = '.wpcf-form-validate') { $elements = wpcf_form_add_js_validation('get'); if (empty($elements)) { return ''; } echo "\r\n" . '<script type="text/javascript">' . "\r\n" . '/* <![CDATA[ */' . "\r\n" . 'jQuery(document).ready(function(){' . "\r\n" . 'if (jQuery("' . $form . '").length > 0){' . "\r\n" . 'jQuery("' . $form . '").validate({ errorClass: "wpcf-form-error", errorPlacement: function(error, element){ error.insertBefore(element); }, highlight: function(element, errorClass, validClass) { jQuery(element).parents(\'.collapsible\').slideDown(); jQuery("input#publish").addClass("button-primary-disabled"); jQuery("input#save-post").addClass("button-disabled"); jQuery("#save-action .ajax-loading").css("visibility", "hidden"); jQuery("#publishing-action #ajax-loading").css("visibility", "hidden"); // jQuery.validator.defaults.highlight(element, errorClass, validClass); // Do not add class to element }, unhighlight: function(element, errorClass, validClass) { jQuery("input#publish, input#save-post").removeClass("button-primary-disabled").removeClass("button-disabled"); // jQuery.validator.defaults.unhighlight(element, errorClass, validClass); }, });' . "\r\n"; foreach ($elements as $id => $element) { if (in_array($element['#type'], array('radios'))) { echo 'jQuery(\'input:[name="' . $element['#name'] . '"]\').rules("add", {' . "\r\n"; } else { echo 'jQuery("#' . $id . '").rules("add", {' . "\r\n"; } $rules = array(); $messages = array(); foreach ($element['#validate'] as $method => $args) { if (!isset($args['value'])) { $args['value'] = 'true'; } $rules[] = $method . ': ' . $args['value']; if (empty($args['message'])) { $args['message'] = wpcf_admin_validation_messages($method); } // TODO Why is this here? // if (!empty($args['message'])) { // $messages[] = $method . ': "' . wpcf_translate('field ' . $element['wpcf-id'] . ' validation message ' . $method, $args['message']) . '"'; // } } echo implode(',' . "\r\n", $rules); if (!empty($messages)) { echo ',' . "\r\n" . 'messages: {' . "\r\n" . implode(',' . "\r\n", $messages) . "\r\n" . '}'; } echo "\r\n" . '});' . "\r\n"; } echo "\r\n" . '/* ]]> */' . "\r\n" . '}' . "\r\n" . '})' . "\r\n" . '</script>' . "\r\n"; }
/** * Saves field. * Modified by Gen, 13.02.2013 * * @param type $field * @return type */ function wpcf_admin_fields_save_field($field, $post_type = TYPES_CUSTOM_FIELD_GROUP_CPT_NAME, $meta_name = 'wpcf-fields') { if (!isset($field['name']) || !isset($field['type'])) { return new WP_Error('wpcf_save_field_no_name_or_type', __("Error saving field", 'wpcf')); } $field = wpcf_sanitize_field($field); if (empty($field['name']) || empty($field['slug'])) { return new WP_Error('wpcf_save_field_no_name', __("Please set name for field", 'wpcf')); } $field['id'] = $field['slug']; // Set field specific data // NOTE: This was $field['data'] = $field and seemed to work on most systems. // I changed it to asign via a temporary variable to fix on one system. $temp_field = $field; $field['data'] = $temp_field; // Unset default fields unset($field['data']['type'], $field['data']['slug'], $field['data']['name'], $field['data']['description'], $field['data']['user_id'], $field['data']['id'], $field['data']['data']); // Merge previous data (added because of outside fields) // @TODO Remember why if (wpcf_types_cf_under_control('check_outsider', $field['id'], $post_type, $meta_name)) { $field_previous_data = wpcf_admin_fields_get_field($field['id'], false, true, false, $meta_name); if (!empty($field_previous_data['data'])) { $field['data'] = array_merge($field_previous_data['data'], $field['data']); } } $field['data'] = apply_filters('wpcf_fields_' . $field['type'] . '_meta_data', $field['data'], $field); // Check validation if (isset($field['data']['validate'])) { foreach ($field['data']['validate'] as $method => $data) { if (!isset($data['active'])) { unset($field['data']['validate'][$method]); } } if (empty($field['data']['validate'])) { unset($field['data']['validate']); } } $save_data = array(); $save_data['id'] = $field['id']; $save_data['slug'] = $field['slug']; $save_data['type'] = $field['type']; $save_data['name'] = $field['name']; $save_data['description'] = $field['description']; $save_data['data'] = $field['data']; $save_data['data']['disabled_by_type'] = 0; // For radios or select if (!empty($field['data']['options'])) { foreach ($field['data']['options'] as $name => $option) { if (isset($option['title'])) { $option['title'] = $field['data']['options'][$name]['title'] = htmlspecialchars_decode($option['title']); } if (isset($option['value'])) { $option['value'] = $field['data']['options'][$name]['value'] = htmlspecialchars_decode($option['value']); } if (isset($option['display_value'])) { $option['display_value'] = $field['data']['options'][$name]['display_value'] = htmlspecialchars_decode($option['display_value']); } // For checkboxes if ($field['type'] == 'checkboxes' && isset($option['set_value']) && $option['set_value'] != '1') { $option['set_value'] = $field['data']['options'][$name]['set_value'] = htmlspecialchars_decode($option['set_value']); } if ($field['type'] == 'checkboxes' && !empty($option['display_value_selected'])) { $option['display_value_selected'] = $field['data']['options'][$name]['display_value_selected'] = htmlspecialchars_decode($option['display_value_selected']); } if ($field['type'] == 'checkboxes' && !empty($option['display_value_not_selected'])) { $option['display_value_not_selected'] = $field['data']['options'][$name]['display_value_not_selected'] = htmlspecialchars_decode($option['display_value_not_selected']); } } } // For checkboxes if ($field['type'] == 'checkbox' && $field['set_value'] != '1') { $field['set_value'] = htmlspecialchars_decode($field['set_value']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_selected'])) { $field['display_value_selected'] = htmlspecialchars_decode($field['display_value_selected']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_not_selected'])) { $field['display_value_not_selected'] = htmlspecialchars_decode($field['display_value_not_selected']); } // Save field $fields = get_option($meta_name, array()); $fields[$field['slug']] = $save_data; update_option($meta_name, $fields); $field_id = $field['slug']; // WPML register strings if (function_exists('icl_register_string')) { if (isset($_POST['wpml_cf_translation_preferences'][$field_id])) { $__wpml_action = intval($_POST['wpml_cf_translation_preferences'][$field_id]); } else { $__wpml_action = wpcf_wpml_get_action_by_type($field['type']); } wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' name', $field['name']); wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' description', $field['description']); // For radios or select if (!empty($field['data']['options'])) { foreach ($field['data']['options'] as $name => $option) { if ($name == 'default') { continue; } if (isset($option['title'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' title', $option['title']); } if ($__wpml_action === 2) { if (isset($option['value'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' value', $option['value']); } } if (isset($option['display_value'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' display value', $option['display_value']); } // For checkboxes if (isset($option['set_value']) && $option['set_value'] != '1') { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' value', $option['set_value']); } if (!empty($option['display_value_selected'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' display value selected', $option['display_value_selected']); } if (!empty($option['display_value_not_selected'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' display value not selected', $option['display_value_not_selected']); } } } if ($field['type'] == 'checkbox' && $field['set_value'] != '1') { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value', $field['set_value']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_selected'])) { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value selected', $field['display_value_selected']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_not_selected'])) { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value not selected', $field['display_value_not_selected']); } // Validation message if (!empty($field['data']['validate'])) { foreach ($field['data']['validate'] as $method => $validation) { if (!empty($validation['message'])) { // Skip if it's same as default $default_message = wpcf_admin_validation_messages($method); if ($validation['message'] != $default_message) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' validation message ' . $method, $validation['message']); } } } } } /** * WPML update translation status */ if (isset($save_data['data']) && isset($save_data['data']['submit-key'])) { if (isset($_POST['wpml_cf_translation_preferences'][$save_data['data']['submit-key']])) { do_action('wpml_config', array('section' => 'custom-fields', 'key' => wpcf_types_get_meta_prefix(wpcf_admin_fields_get_field($save_data['slug'])) . $save_data['slug'], 'value' => intval($_POST['wpml_cf_translation_preferences'][$save_data['data']['submit-key']]), 'read_only' => true)); } } return $field_id; }
/** * Returns formatted JS. * * @param type $selector Can be CSS class or element ID * @return string */ function fields_js($selector = '.wpcf-form-validate') { // Get collected validation rules $elements = wpcf_form_add_js_validation('get'); // Not collected! if (empty($elements)) { return ''; } /* * Start output */ $output = ''; /* * Open tags and trigger jQuery validation. */ $output .= "\r\n" . '<script type="text/javascript">' . "\r\n" . '/* <![CDATA[ */' . "\r\n" . 'jQuery(document).ready(function(){' . "\r\n" . 'if (jQuery("' . $selector . '").length > 0){' . "\r\n" . 'jQuery("' . $selector . '").validate({ errorPlacement: function(error, element){ error.insertBefore(element); }, highlight: function(element, errorClass, validClass) { jQuery(\'#publishing-action .spinner\').css(\'visibility\', \'hidden\'); jQuery(\'#publish\').bind(\'click\', function(){ jQuery(\'#publishing-action .spinner\').css(\'visibility\', \'visible\'); }); jQuery(element).parents(\'.collapsible\').slideDown(); '; if ($selector == '#post') { $output .= 'var box = jQuery(element).parents(\'.postbox\'); if (box.hasClass(\'closed\')) { box.find(\'.handlediv\').trigger(\'click\'); }'; } $output .= ' jQuery(element).parents(\'.collapsible\').slideDown(); jQuery("input#publish").addClass("button-primary-disabled"); jQuery("input#save-post").addClass("button-disabled"); jQuery("#save-action .ajax-loading").css("visibility", "hidden"); jQuery("#publishing-action #ajax-loading").css("visibility", "hidden"); // jQuery.validator.defaults.highlight(element, errorClass, validClass); // Do not add class to element }, unhighlight: function(element, errorClass, validClass) { jQuery("input#publish, input#save-post").removeClass("button-primary-disabled").removeClass("button-disabled"); // jQuery.validator.defaults.unhighlight(element, errorClass, validClass); },'; /* * jQuery invalidHandler * http://docs.jquery.com/Plugins/Validation/validate#toptions * * Since Types 1.1.5 we apply filters on invalid handler */ $additional_js = apply_filters('wpcf_validation_js_invalid_handler', '', $elements, $selector, array('form', 'validator')); $output .= ' invalidHandler: function(form, validator) { elements = new Array(); // validator.errorList contains an array of objects, where each object has properties "element" and "message". element is the actual HTML Input. for (var i=0;i<validator.errorList.length;i++){ var el = validator.errorList[i].element; elements.push(jQuery(el).attr(\'id\')); } // validator.errorMap is an object mapping input names -> error messages // for (var i in validator.errorMap) { // console.log(i, ":", validator.errorMap[i]); // } var form = jQuery(\'' . $selector . '\'); var passed = false; ' . $additional_js . ' // alert(passed); if (passed) { jQuery(\'' . $selector . '\').validate().cancelSubmit = true; jQuery(\'' . $selector . '\').submit(); } }, '; $output .= 'errorClass: "wpcf-form-error"'; $output .= '});' . "\r\n"; /* * * * Render JS validation code for each element collected */ foreach ($elements as $id => $element) { // Basic check if (empty($element['#validate'])) { continue; } /* * * Adjust rules according to field type * * TODO Document why radios selects 'name' instead of 'id' */ if (in_array($element['#type'], array('radios'))) { $output .= 'jQuery(\'input[name="' . $element['#name'] . '"]\').rules("add", {' . "\r\n"; } else { $output .= 'jQuery("#' . $id . '").rules("add", {' . "\r\n"; } $rules = array(); // Rules output $messages = array(); // Messages output $collected = array(); // Various collected data (for hooks) /* * $method is registered jQuery validation method * $args['value'] is custom tailored parameter * $args['message'] is custom message that will be displayed on failure * * $args may be used to pass other useful properties */ foreach ($element['#validate'] as $method => $args) { // Set generic value 'true' if (!isset($args['value'])) { $args['value'] = 'true'; } // Set rule // since Types 1.1.5 we use element ID $rules[$id][$method] = $method . ': ' . $args['value']; // Set message if (empty($args['message'])) { $args['message'] = wpcf_admin_validation_messages($method); } // since Types 1.1.5 we use element ID $messages[$id][$method] = $method . ': \'' . esc_js($args['message']) . '\''; // Collect! $collected[$id][$method] = $args; } /* * * Add rules to output */ $_rules_o = apply_filters('wpcf_validation_js_fields_rules', $rules, $collected); foreach ($_rules_o as $_rules) { $output .= implode(',' . "\r\n", $_rules); } /* * * Add messages to output */ if (!empty($messages)) { $_messages_o = apply_filters('wpcf_validation_js_fields_messages', $messages, $collected); foreach ($_messages_o as $_messages) { $output .= ',' . "\r\n" . 'messages: {' . "\r\n" . implode(',' . "\r\n", $_messages) . "\r\n" . '},'; } } // Close main jQuery function call $output .= "\r\n" . '});' . "\r\n"; } // Close tag $output .= "\r\n" . '/* ]]> */' . "\r\n" . '}' . "\r\n" . '})' . "\r\n" . '</script>' . "\r\n"; return apply_filters('wpcf_validation_js_fields_output', $output, $collected); }
/** * Saves field. * * Note: This is (probably) intended only for saving field definition data on the Edit Field Group pages. * * @param array $field Field data * @param string $post_type * @param string $option_name * * @return string|WP_Error Field slug or an error object. */ function wpcf_admin_fields_save_field($field, $post_type = TYPES_CUSTOM_FIELD_GROUP_CPT_NAME, $option_name = 'wpcf-fields') { if (!isset($field['name']) || !isset($field['type'])) { return new WP_Error('wpcf_save_field_no_name_or_type', __("Error saving field", 'wpcf')); } $field = wpcf_sanitize_field($field); if (empty($field['name']) || empty($field['slug'])) { return new WP_Error('wpcf_save_field_no_name', __("Please set name for field", 'wpcf')); } $field['id'] = $field['slug']; // Set field specific data // NOTE: This was $field['data'] = $field and seemed to work on most systems. // I changed it to asign via a temporary variable to fix on one system. $temp_field = $field; $field['data'] = $temp_field; // Unset default fields // fixme These lines effectively erases all new values in "data", does anyone know why? // fixme This function needs SERIOUS review. unset($field['data']['type'], $field['data']['slug'], $field['data']['name'], $field['data']['description'], $field['data']['user_id'], $field['data']['id'], $field['data']['data']); // Merge previous data (added because of outside fields) // @TODO Remember why if (wpcf_types_cf_under_control('check_outsider', $field['id'], $post_type, $option_name)) { $field_previous_data = wpcf_admin_fields_get_field($field['id'], false, true, false, $option_name); if (!empty($field_previous_data['data'])) { $field['data'] = array_merge($field_previous_data['data'], $field['data']); } } $field['data'] = apply_filters('wpcf_fields_' . $field['type'] . '_meta_data', $field['data'], $field); // Check validation if (isset($field['data']['validate'])) { foreach ($field['data']['validate'] as $method => $data) { if (!isset($data['active'])) { unset($field['data']['validate'][$method]); } } if (empty($field['data']['validate'])) { unset($field['data']['validate']); } } $save_data = array(); $save_data['id'] = $field['id']; $save_data['slug'] = $field['slug']; $save_data['type'] = $field['type']; $save_data['name'] = $field['name']; $save_data['description'] = $field['description']; $save_data['data'] = $field['data']; $save_data['data']['disabled_by_type'] = 0; // For radios or select if (!empty($field['data']['options'])) { foreach ($field['data']['options'] as $name => $option) { if (isset($option['title'])) { $option['title'] = $field['data']['options'][$name]['title'] = htmlspecialchars_decode($option['title']); } if (isset($option['value'])) { $option['value'] = $field['data']['options'][$name]['value'] = htmlspecialchars_decode($option['value']); } if (isset($option['display_value'])) { $option['display_value'] = $field['data']['options'][$name]['display_value'] = htmlspecialchars_decode($option['display_value']); } // For checkboxes if ($field['type'] == 'checkboxes' && isset($option['set_value']) && $option['set_value'] != '1') { $option['set_value'] = $field['data']['options'][$name]['set_value'] = htmlspecialchars_decode($option['set_value']); } if ($field['type'] == 'checkboxes' && !empty($option['display_value_selected'])) { $option['display_value_selected'] = $field['data']['options'][$name]['display_value_selected'] = htmlspecialchars_decode($option['display_value_selected']); } if ($field['type'] == 'checkboxes' && !empty($option['display_value_not_selected'])) { $option['display_value_not_selected'] = $field['data']['options'][$name]['display_value_not_selected'] = htmlspecialchars_decode($option['display_value_not_selected']); } } } // For checkboxes if ('checkbox' == $field['type'] && isset($field['set_value']) && $field['set_value'] != '1') { $field['set_value'] = htmlspecialchars_decode($field['set_value']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_selected'])) { $field['display_value_selected'] = htmlspecialchars_decode($field['display_value_selected']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_not_selected'])) { $field['display_value_not_selected'] = htmlspecialchars_decode($field['display_value_not_selected']); } // Save field $fields = get_option($option_name, array()); // prevent erasing saved conditional display data (it's controlled via ajax) if (isset($fields[$field['slug']]['data']['conditional_display']) && !empty($fields[$field['slug']]['data']['conditional_display'])) { $save_data['data']['conditional_display'] = $fields[$field['slug']]['data']['conditional_display']; } // on changing a field slug if (isset($field['slug-pre-save']) && $field['slug'] != $field['slug-pre-save']) { // takeover conditions on renamed slug if (isset($fields[$field['slug-pre-save']]['data']['conditional_display']) && !empty($fields[$field['slug-pre-save']]['data']['conditional_display'])) { $save_data['data']['conditional_display'] = $fields[$field['slug-pre-save']]['data']['conditional_display']; } // field is assigned ONLY to current group $belongs_to_groups = wpcf_admin_fields_get_groups_by_field($field['slug-pre-save'], $post_type); if (isset($_GET['group_id']) && isset($fields[$field['slug-pre-save']]) && count($belongs_to_groups) == 1 && isset($belongs_to_groups[$_GET['group_id']])) { global $wpdb; // as it's the only group with this field we can update the slug for all items $wpdb->update($wpdb->postmeta, array('meta_key' => 'wpcf-' . $field['slug']), array('meta_key' => 'wpcf-' . $field['slug-pre-save']), array('%s'), array('%s')); // change slug in field conditions foreach ($fields as $key => &$single_field) { if (isset($single_field['data']['conditional_display']['conditions'])) { foreach ($single_field['data']['conditional_display']['conditions'] as &$single_condition) { if ($single_condition['field'] == $field['slug-pre-save']) { $single_condition['field'] = $field['slug']; } } } } // get all group conditions which contain the old slug $groups_conditions = $wpdb->get_results("\n SELECT post_id, meta_value\n FROM {$wpdb->postmeta}\n WHERE meta_key = '_wpcf_conditional_display'\n AND meta_value LIKE '%" . $field['slug-pre-save'] . "%'\n\t "); if ($groups_conditions) { foreach ($groups_conditions as $group_condition) { $meta_value = unserialize($group_condition->meta_value); // proper proof for slug if (isset($meta_value['conditions'])) { foreach ($meta_value['conditions'] as &$single_condition) { if ($single_condition['field'] == $field['slug-pre-save']) { // update conditions slug $single_condition['field'] = $field['slug']; update_post_meta($group_condition->post_id, '_wpcf_conditional_display', $meta_value); break; } } } } } // delete field wpcf_admin_fields_delete_field($field['slug-pre-save'], $post_type, $option_name); unset($fields[$field['slug-pre-save']]); // update items by post type } elseif (isset($_GET['group_id'])) { switch ($post_type) { case 'wp-types-group': $group = Types_Field_Group_Post_Factory::load($_GET['group_id']); break; case 'wp-types-term-group': $group = Types_Field_Group_Term_Factory::load($_GET['group_id']); break; case 'wp-types-user-group': $group = Types_Field_Group_User_Factory::load($_GET['group_id']); break; } if (null != $group) { $assigned_types = $group->get_assigned_to_types(); if (!empty($assigned_types)) { $items = $group->get_assigned_to_items(); if (is_array($items) && !empty($items)) { global $wpdb; foreach ($items as $item) { $wpdb->update($wpdb->postmeta, array('meta_key' => 'wpcf-' . $field['slug']), array('meta_key' => 'wpcf-' . $field['slug-pre-save'], 'post_id' => $item->ID), array('%s', '%d'), array('%s')); } } } } } } $fields[$field['slug']] = $save_data; update_option($option_name, $fields); $field_id = $field['slug']; // WPML register strings if (function_exists('icl_register_string')) { if (isset($_POST['wpml_cf_translation_preferences'][$field_id])) { $__wpml_action = intval($_POST['wpml_cf_translation_preferences'][$field_id]); } else { $__wpml_action = wpcf_wpml_get_action_by_type($field['type']); } wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' name', $field['name']); wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' description', $field['description']); // For radios or select if (!empty($field['data']['options'])) { foreach ($field['data']['options'] as $name => $option) { if ($name == 'default') { continue; } if (isset($option['title'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' title', $option['title']); } if ($__wpml_action === 2) { if (isset($option['value'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' value', $option['value']); } } if (isset($option['display_value'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' display value', $option['display_value']); } // For checkboxes if (isset($option['set_value']) && $option['set_value'] != '1') { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' value', $option['set_value']); } if (!empty($option['display_value_selected'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' display value selected', $option['display_value_selected']); } if (!empty($option['display_value_not_selected'])) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' option ' . $name . ' display value not selected', $option['display_value_not_selected']); } } } if ($field['type'] == 'checkbox' && $field['set_value'] != '1') { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value', $field['set_value']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_selected'])) { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value selected', $field['display_value_selected']); } if ($field['type'] == 'checkbox' && !empty($field['display_value_not_selected'])) { // we need to translate the check box value to store wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' checkbox value not selected', $field['display_value_not_selected']); } // Validation message if (!empty($field['data']['validate'])) { foreach ($field['data']['validate'] as $method => $validation) { if (!empty($validation['message'])) { // Skip if it's same as default $default_message = wpcf_admin_validation_messages($method); if ($validation['message'] != $default_message) { wpcf_translate_register_string('plugin Types', 'field ' . $field_id . ' validation message ' . $method, $validation['message']); } } } } } /** * WPML update translation status */ if (isset($save_data['data']) && isset($save_data['data']['submit-key'])) { if (isset($_POST['wpml_cf_translation_preferences'][$save_data['data']['submit-key']])) { do_action('wpml_config', array('section' => 'custom-fields', 'key' => wpcf_types_get_meta_prefix(wpcf_admin_fields_get_field($save_data['slug'])) . $save_data['slug'], 'value' => intval($_POST['wpml_cf_translation_preferences'][$save_data['data']['submit-key']]), 'read_only' => true)); } } return $field_id; }
/** * Returns formatted JSON validation data. * * @param type $selector Can be CSS class or element ID * @return string */ static function renderJsonData($selector = '.wpcf-form-validate') { // Get collected validation rules $elements = wpcf_form_add_js_validation('get'); // Not collected! if (empty($elements)) { return ''; } $json = array('selector' => $selector, 'elements' => array()); foreach ($elements as $id => $element) { // Basic check or skip read-only if (empty($element['#validate']) || isset($element['#attributes']['readonly'])) { continue; } $json['elements'][$id] = array('id' => $id); // Set selectors if (in_array($element['#type'], array('radios'))) { $json['elements'][$id]['selector'] = "input[name=\"{$element['#name']}\"]"; } else { $json['elements'][$id]['selector'] = "#{$id}"; } foreach ($element['#validate'] as $method => $args) { $args['value'] = !isset($args['value']) ? 'true' : $args['value']; if (empty($args['message'])) { $args['message'] = wpcf_admin_validation_messages($method, $args['value']); } //Check if wordpress date format is d/m/Y and use ITA validation if ($method == 'date' && isset($element['wpcf-type']) && $element['wpcf-type'] == 'date' && get_option('date_format') == 'd/m/Y') { $method = 'dateITA:true'; } // Set JSON data $json['elements'][$id]['rules'][] = array('method' => $method, 'value' => $args['value'], 'message' => $args['message']); } } ob_start(); ?> <script type="text/javascript"> //<![CDATA[ types.validation.push(<?php echo json_encode($json); ?> ); <?php if (defined('DOING_AJAX')) { ?> jQuery(document).ready(function($) { typesValidation.setRules(); }); <?php } ?> /* ]]> */ </script> <?php $output = ob_get_contents(); ob_get_clean(); wp_enqueue_script('types-validation'); return $output; }