Пример #1
0
 /**
  * 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;
 }
Пример #2
0
/**
 * 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);
    }
}
Пример #3
0
 /**
  * Inits messages.
  */
 private static function _set_messages()
 {
     // Set outside in /admin.php
     self::$messages = wpcf_admin_validation_messages();
 }
Пример #4
0
/**
 * 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;
}
Пример #5
0
/**
 * 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";
}
Пример #6
0
/**
 * 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;
}
Пример #7
0
    /**
     * 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);
    }
Пример #8
0
/**
 * 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;
}
Пример #9
0
    /**
     * 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;
    }