function _check_imported_repeating_fields($f, &$fields_tested) { if (!FrmField::is_repeating_field($f)) { return; } $fields_tested++; self::_check_form_select($f, 'rep_sec_form'); }
function _check_if_form_select_updates($old_form_id, $new_form_id) { // Get all repeating sections in both forms $old_repeating_sections = FrmField::get_all_types_in_form($old_form_id, 'divider'); $new_repeating_sections = FrmField::get_all_types_in_form($new_form_id, 'divider'); if (!$old_repeating_sections) { return; } foreach ($old_repeating_sections as $key => $section) { if (!FrmField::is_repeating_field($section)) { continue; } $old_form_select = $section->field_options['form_select']; $new_form_select = $new_repeating_sections[$key]->field_options['form_select']; $this->assertNotEquals($old_form_select, $new_form_select, 'A form was duplicated, but the form_select was not updated for the repeating section :/'); } }
/** * @covers FrmProFieldsController::toggle_repeat */ function test_toggle_repeat() { /* 1. Start with repeating, switch to regular - move child fields to parent form √ - move child entries to parent form √ - child entries deleted √ - child form deleted √ - form_select and repeat updated √ - check if correct form_id is echoed √ 2. Switch to repeating - child form created w/correct parent_form_id √ - move child fields to child form √ - child entries created from parent data √ - form_select updated and repeat updated √ - check if correct form_id is echoed */ $form_id = $this->factory->form->get_id_by_key('all_field_types'); $section_fields = FrmField::get_all_types_in_form($form_id, 'divider'); foreach ($section_fields as $section) { if (FrmField::is_repeating_field($section)) { $repeating_section = $section; break; } } $child_form_id = $repeating_section->field_options['form_select']; $children = FrmField::get_all_for_form($child_form_id, '', 'include'); $child_ids = array(); foreach ($children as $child) { $child_ids[] = $child->id; } $this->assertNotEmpty($child_ids, 'There were no fields retrieved for the repeating section form'); self::_switch_to_not_repeating($repeating_section, $child_ids); self::_switch_to_repeating($repeating_section, $child_ids); // TODO: Again, but update the form this time // Update form /*self::_switch_to_not_repeating( $repeating_section, $child_ids ); // Update form self::_switch_to_repeating( $repeating_section, $child_ids ); // Update form*/ }
<li><a href="javascript:void(0)" class="frmkeys"><?php _e('Keys', 'formidable'); ?> </a></li> </ul> <ul class="alignleft"><li><?php _e('Fields from your form', 'formidable'); ?> :</li></ul> <ul class="frm_code_list frm_full_width"> <?php if (!empty($fields)) { global $wpdb; $linked_forms[] = array(); foreach ($fields as $f) { if (FrmField::is_repeating_field($f)) { $repeat_field = $f->id; } if (FrmField::is_no_save_field($f->type)) { continue; } if ($f->type == 'data' && (!isset($f->field_options['data_type']) || $f->field_options['data_type'] == 'data' || $f->field_options['data_type'] == '')) { continue; } FrmAppHelper::insert_opt_html(array('id' => $f->id, 'key' => $f->field_key, 'name' => $f->name, 'type' => $f->type)); if ($f->type == 'data') { //get all fields from linked form if (isset($f->field_options['form_select']) && is_numeric($f->field_options['form_select'])) { $linked_form = FrmDb::get_var($wpdb->prefix . 'frm_fields', array('id' => $f->field_options['form_select']), 'form_id'); if (!in_array($linked_form, $linked_forms)) { $linked_forms[] = $linked_form;
public static function is_repeating_field($field) { _deprecated_function(__FUNCTION__, '2.0.09', 'FrmField::is_repeating_field'); return FrmField::is_repeating_field($field); }
/** * Switch repeating section forms to published and give them names */ private static function migrate_to_29() { // Get all section fields $dividers = FrmField::getAll(array('fi.type' => 'divider')); // Update the form name and status for repeating sections foreach ($dividers as $d) { if (!FrmField::is_repeating_field($d)) { continue; } $form_id = $d->field_options['form_select']; $new_name = $d->name; if ($form_id && is_numeric($form_id)) { FrmForm::update($form_id, array('name' => $new_name, 'status' => 'published')); } } }
public static function validate($errors, $field, $value, $args) { $field->temp_id = $args['id']; // Keep current value for "Other" fields because it is needed for correct validation if (!$args['other']) { FrmEntriesHelper::get_posted_value($field, $value, $args); } if ($field->type == 'form' || FrmField::is_repeating_field($field)) { self::validate_embedded_form($errors, $field, $args['exclude']); } else { if ($field->type == 'user_id') { // make sure we have a user ID if (!is_numeric($value)) { $value = FrmAppHelper::get_user_id_param($value); FrmEntriesHelper::set_posted_value($field, $value, $args); } //add user id to post variables to be saved with entry $_POST['frm_user_id'] = $value; } else { if ($field->type == 'time' && is_array($value)) { $value = $value['H'] . ':' . $value['m'] . (isset($value['A']) ? ' ' . $value['A'] : ''); FrmEntriesHelper::set_posted_value($field, $value, $args); } } } // don't validate if going backwards if (FrmProFormsHelper::going_to_prev($field->form_id)) { return array(); } // clear any existing errors if draft if (FrmProFormsHelper::saving_draft() && isset($errors['field' . $field->temp_id])) { unset($errors['field' . $field->temp_id]); } self::validate_file_upload($errors, $field, $args); // if saving draft, only check file type since it won't be checked later // and confirmation field since the confirmation field value is not saved if (FrmProFormsHelper::saving_draft()) { //Check confirmation field if saving a draft self::validate_confirmation_field($errors, $field, $value, $args); return $errors; } self::validate_no_input_fields($errors, $field); if (empty($args['parent_field_id']) && !isset($_POST['item_meta'][$field->id])) { return $errors; } if (($field->type != 'tag' && $value == 0 || $field->type == 'tag' && $value == '') && isset($field->field_options['post_field']) && $field->field_options['post_field'] == 'post_category' && $field->required == '1') { $frm_settings = FrmAppHelper::get_settings(); $errors['field' . $field->temp_id] = !isset($field->field_options['blank']) || $field->field_options['blank'] == '' || $field->field_options['blank'] == 'Untitled cannot be blank' ? $frm_settings->blank_msg : $field->field_options['blank']; } //Don't require fields hidden with shortcode fields="25,26,27" global $frm_vars; if (self::is_field_hidden_by_shortcode($field, $errors)) { unset($errors['field' . $field->temp_id]); $value = ''; } //Don't require a conditionally hidden field self::validate_conditional_field($errors, $field, $value); //Don't require a field hidden in a conditional page or section heading self::validate_child_conditional_field($errors, $field, $value); //make sure the [auto_id] is still unique self::validate_auto_id($field, $value); //check uniqueness self::validate_unique_field($errors, $field, $value); self::set_post_fields($field, $value, $errors); if (!FrmProFieldsHelper::is_field_visible_to_user($field)) { //don't validate admin only fields that can't be seen unset($errors['field' . $field->temp_id]); FrmEntriesHelper::set_posted_value($field, $value, $args); return $errors; } self::validate_confirmation_field($errors, $field, $value, $args); //Don't validate the format if field is blank if (FrmAppHelper::is_empty_value($value)) { FrmEntriesHelper::set_posted_value($field, $value, $args); return $errors; } if (!is_array($value)) { $value = trim($value); } $validate_fields = array('number', 'phone', 'date'); if (in_array($field->type, $validate_fields)) { $function = 'validate_' . $field->type . '_field'; self::$function($errors, $field, $value); } FrmEntriesHelper::set_posted_value($field, $value, $args); return $errors; }
/** * * Update the repeating form name when a repeating section name is updated * * @since 2.0.12 * * @param array $atts */ public static function update_repeating_form_name($atts) { $field = FrmField::getOne($atts['id']); if (FrmField::is_repeating_field($field)) { // Update the repeating form name FrmForm::update($field->field_options['form_select'], array('name' => $atts['value'])); } }
/** * Get the new child IDs for a repeating field's meta_value * * @since 2.0.16 * @param array $meta_value * @param object $field * @param array $saved_entries * @return array $meta_value */ private static function get_repeating_field_metas($meta_value, $field, $saved_entries) { if (FrmField::is_repeating_field($field)) { $new_meta_value = array(); foreach ((array) $meta_value as $old_child_id) { if (isset($saved_entries[$old_child_id])) { $new_meta_value[] = $saved_entries[$old_child_id]; } } $meta_value = $new_meta_value; } return $meta_value; }
/** * @since 2.0 * @return array of repeatable section fields */ public static function has_repeat_field($form_id, $single = true) { $fields = self::has_field('divider', $form_id, $single); if (!$fields) { return $fields; } $repeat_fields = array(); foreach ($fields as $field) { if (FrmField::is_repeating_field($field)) { $repeat_fields[] = $field; } } return $repeat_fields; }
public static function save_sub_entries($values, $action = 'create') { $form_id = isset($values['form_id']) ? (int) $values['form_id'] : 0; if (!$form_id || !isset($values['item_meta'])) { return $values; } $form_fields = FrmProFormsHelper::has_field('form', $form_id, false); $section_fields = FrmProFormsHelper::has_field('divider', $form_id, false); if (!$form_fields && !$section_fields) { // only continue if there could be sub entries return $values; } $form_fields = array_merge($section_fields, $form_fields); $new_values = $values; unset($new_values['item_meta']); // allow for multiple embeded forms foreach ($form_fields as $field) { if (!isset($values['item_meta'][$field->id]) || !isset($field->field_options['form_select']) || !isset($values['item_meta'][$field->id]['form'])) { // don't continue if we don't know which form to insert the sub entries into unset($values['item_meta'][$field->id]); continue; } if ('divider' == $field->type && !FrmField::is_repeating_field($field)) { // only create sub entries for repeatable sections continue; } $field_values = $values['item_meta'][$field->id]; $sub_form_id = $field->field_options['form_select']; unset($field_values['form']); if ($action != 'create' && isset($field_values['id'])) { $old_ids = FrmEntryMeta::get_entry_meta_by_field($values['id'], $field->id); $old_ids = array_filter((array) $old_ids, 'is_numeric'); unset($field_values['id']); } else { $old_ids = array(); } $sub_ids = array(); foreach ($field_values as $k => $v) { $entry_values = $new_values; $entry_values['form_id'] = $sub_form_id; $entry_values['item_meta'] = (array) $v; $entry_values['parent_item_id'] = isset($values['id']) ? $values['id'] : 0; $entry_values['parent_form_id'] = $form_id; // include a nonce just to be sure the parent_form_id is legit $entry_values['parent_nonce'] = wp_create_nonce('parent'); // set values for later user (file upload and tags fields) $_POST['item_meta']['key_pointer'] = $k; $_POST['item_meta']['parent_field'] = $field->id; if (!is_numeric($k) && in_array(str_replace('i', '', $k), $old_ids)) { // update existing sub entries $entry_values['id'] = str_replace('i', '', $k); FrmEntry::update($entry_values['id'], $entry_values); $sub_id = $entry_values['id']; } else { // create new sub entries $sub_id = FrmEntry::create($entry_values); } if ($sub_id) { $sub_ids[] = $sub_id; } unset($k, $v, $entry_values, $sub_id); } $values['item_meta'][$field->id] = $sub_ids; // array of sub entry ids $old_ids = array_diff($old_ids, $sub_ids); if (!empty($old_ids)) { // delete entries that were removed from section foreach ($old_ids as $old_id) { FrmEntry::destroy($old_id); } } unset($field); } return $values; }
/** * Return all the field IDs for the fields inside of a section (not necessarily repeating) or an embedded form * * @since 2.0.13 * @param array $field * @return array $children */ public static function get_children($field) { global $wpdb; $children = array(); // If repeating field or embedded form if (FrmField::is_repeating_field($field) || $field['type'] == 'form') { $repeat_id = isset($field['form_select']) ? $field['form_select'] : $field['field_options']['form_select']; $children = FrmDb::get_col($wpdb->prefix . 'frm_fields', array('form_id' => $repeat_id)); } else { $end_divider_order = FrmDb::get_var($wpdb->prefix . 'frm_fields', array('form_id' => $field['form_id'], 'type' => 'end_divider', 'field_order>' => $field['field_order']), 'field_order', array('order_by' => 'field_order ASC'), 1); $min_field_order = $field['field_order'] + 1; $max_field_order = $end_divider_order - 1; $children = FrmDb::get_col($wpdb->prefix . 'frm_fields', array('form_id' => $field['form_id'], 'field_order>' => $min_field_order, 'field_order<' => $max_field_order)); } return $children; }