public static function get_search_ids($s, $form_id, $args = array())
 {
     global $wpdb;
     if (empty($s)) {
         return false;
     }
     preg_match_all('/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/', $s, $matches);
     $search_terms = array_map('trim', $matches[0]);
     $spaces = '';
     $e_ids = $p_search = array();
     $search = array('or' => 1);
     $data_field = FrmProFormsHelper::has_field('data', $form_id, false);
     foreach ((array) $search_terms as $term) {
         $p_search[] = array($spaces . $wpdb->posts . '.post_title like' => $term, $spaces . $wpdb->posts . '.post_content like' => $term, 'or' => 1);
         $search[$spaces . 'meta_value like'] = $term;
         $spaces .= ' ';
         // add a space to keep the array keys unique
         if (is_numeric($term)) {
             $e_ids[] = (int) $term;
         }
         if ($data_field) {
             $df_form_ids = array();
             //search the joined entry too
             foreach ((array) $data_field as $df) {
                 FrmProFieldsHelper::get_subform_ids($df_form_ids, $df);
                 unset($df);
             }
             $data_form_ids = FrmDb::get_col($wpdb->prefix . 'frm_fields', array('id' => $df_form_ids), 'form_id');
             unset($df_form_ids);
             if ($data_form_ids) {
                 $data_entry_ids = FrmEntryMeta::getEntryIds(array('fi.form_id' => $data_form_ids, 'meta_value like' => $term));
                 if ($data_entry_ids) {
                     if (!isset($search['meta_value'])) {
                         $search['meta_value'] = array();
                     }
                     $search['meta_value'] = array_merge($search['meta_value'], $data_entry_ids);
                 }
             }
             unset($data_form_ids);
         }
     }
     $matching_posts = FrmDb::get_col($wpdb->posts, $p_search, 'ID');
     $p_ids = array($search, 'or' => 1);
     if ($matching_posts) {
         $post_ids = FrmDb::get_col($wpdb->prefix . 'frm_items', array('post_id' => $matching_posts, 'form_id' => (int) $form_id));
         if ($post_ids) {
             $p_ids['item_id'] = $post_ids;
         }
     }
     if (!empty($e_ids)) {
         $p_ids['item_id'] = $e_ids;
     }
     $query = array('fi.form_id' => $form_id);
     $query[] = $p_ids;
     return FrmEntryMeta::getEntryIds($query, '', '', true, $args);
 }
 private static function get_entry_link_entries($atts)
 {
     $s = FrmAppHelper::get_param('frm_search', false, 'get', 'sanitize_text_field');
     // Convert logged_in parameter to user_id for other functions
     $atts['user_id'] = false;
     if ($atts['logged_in']) {
         global $wpdb;
         $atts['user_id'] = get_current_user_id();
     }
     if ($s) {
         $entry_ids = FrmProEntriesHelper::get_search_ids($s, $atts['id'], array('is_draft' => $atts['drafts'], 'user_id' => $atts['user_id']));
     } else {
         $entry_ids = FrmEntryMeta::getEntryIds(array('fi.form_id' => (int) $atts['id']), '', '', true, array('is_draft' => $atts['drafts'], 'user_id' => $atts['user_id']));
     }
     if (empty($entry_ids)) {
         return;
     }
     $order = $atts['type'] == 'collapse' || $atts['order'] == 'DESC' ? ' ORDER BY it.created_at DESC' : '';
     $entries = FrmEntry::getAll(array('it.id' => $entry_ids), $order, '', true);
     return $entries;
 }
Example #3
0
 private static function filter_entry_ids($args, $where_field, $entry_ids, &$new_ids)
 {
     $where_statement = array('fi.id' => (int) $args['where_opt']);
     $field_key = 'meta_value ' . (in_array($where_field->type, array('number', 'scale')) ? ' +0 ' : '') . FrmDb::append_where_is($args['temp_where_is']);
     $nested_where = array($field_key => $args['where_val']);
     if (isset($args['where_val_esc']) && $args['where_val_esc'] != $args['where_val']) {
         $nested_where['or'] = 1;
         $nested_where[' ' . $field_key] = $args['where_val_esc'];
     }
     $where_statement[] = $nested_where;
     $args['entry_ids'] = $entry_ids;
     $where_statement = apply_filters('frm_where_filter', $where_statement, $args);
     $filter_args = array('is_draft' => $args['drafts']);
     self::add_group_by($filter_args, $args);
     // If the field is from a repeating section (or embedded form?) get the parent ID
     $filter_args['return_parent_id'] = $where_field->form_id != $args['form_id'];
     // Add entry IDs to $where_statement. Meant for use when showing one entry.
     if ($args['use_ids']) {
         if (is_array($where_statement)) {
             if ($filter_args['return_parent_id']) {
                 $where_statement['parent_item_id'] = $entry_ids;
             } else {
                 $where_statement['item_id'] = $entry_ids;
             }
         } else {
             // if the filter changed the query to a string, allow it
             $where_statement .= FrmAppHelper::prepend_and_or_where(' AND ', array('item_id' => $entry_ids));
         }
     }
     $new_ids = FrmEntryMeta::getEntryIds($where_statement, '', '', true, $filter_args);
     if ($args['where_is'] != $args['temp_where_is']) {
         $new_ids = array_diff((array) $entry_ids, $new_ids);
     }
 }
 private static function get_ajax_time_options($values, array &$remove)
 {
     $time_key = str_replace('field_', '', $values['time_field']);
     $date_key = str_replace('field_', '', $values['date_field']);
     $values['date'] = FrmProAppHelper::maybe_convert_to_db_date($values['date'], 'Y-m-d');
     $date_entries = FrmEntryMeta::getEntryIds(array('fi.field_key' => $date_key, 'meta_value' => $values['date']));
     $remove = apply_filters('frm_allowed_times', $remove, $values);
     if (!$date_entries || empty($date_entries)) {
         return;
     }
     global $wpdb;
     $query = array('fi.field_key' => $time_key, 'it.item_id' => $date_entries);
     if (isset($values['entry_id']) && is_numeric($values['entry_id'])) {
         $query['it.item_id !'] = $values['entry_id'];
     }
     $used_times = FrmDb::get_col($wpdb->prefix . 'frm_item_metas it LEFT JOIN ' . $wpdb->prefix . 'frm_fields fi ON (it.field_id = fi.id)', $query, 'meta_value');
     if (!$used_times || empty($used_times)) {
         return;
     }
     $number_allowed = apply_filters('frm_allowed_time_count', 1, $time_key, $date_key);
     $count = array();
     foreach ($used_times as $used) {
         if (isset($remove[$used])) {
             continue;
         }
         if (!isset($count[$used])) {
             $count[$used] = 0;
         }
         $count[$used]++;
         if ((int) $count[$used] >= $number_allowed) {
             $remove[$used] = $used;
         }
     }
 }
 function ajax_time_options()
 {
     global $frmpro_settings, $frmdb, $wpdb;
     //posted vars = $time_field, $date_field, $step, $start, $end, $date, $clock
     extract($_POST);
     $time_key = str_replace('field_', '', $time_field);
     $date_key = str_replace('field_', '', $date_field);
     if (!preg_match('/^\\d{4}-\\d{2}-\\d{2}$/', trim($date))) {
         $date = FrmProAppHelper::convert_date($date, $frmpro_settings->date_format, 'Y-m-d');
     }
     $date_entries = FrmEntryMeta::getEntryIds("fi.field_key='{$date_key}' and meta_value='{$date}'");
     $opts = array('' => '');
     $time = strtotime($start);
     $end = strtotime($end);
     $step = explode(':', $step);
     $step = isset($step[1]) ? $step[0] * 3600 + $step[1] * 60 : $step[0] * 60;
     $format = $clock ? 'H:i' : 'h:i A';
     while ($time <= $end) {
         $opts[date($format, $time)] = date($format, $time);
         $time += $step;
     }
     if ($date_entries and !empty($date_entries)) {
         $used_times = $wpdb->get_col("SELECT meta_value FROM {$frmdb->entry_metas} it LEFT JOIN {$frmdb->fields} fi ON (it.field_id = fi.id) WHERE fi.field_key='{$time_key}' and it.item_id in (" . implode(',', $date_entries) . ")");
         if ($used_times and !empty($used_times)) {
             $number_allowed = apply_filters('frm_allowed_time_count', 1, $time_key, $date_key);
             $count = array();
             foreach ($used_times as $used) {
                 if (!isset($opts[$used])) {
                     continue;
                 }
                 if (!isset($count[$used])) {
                     $count[$used] = 0;
                 }
                 $count[$used]++;
                 if ((int) $count[$used] >= $number_allowed) {
                     unset($opts[$used]);
                 }
             }
             unset($count);
         }
     }
     echo json_encode($opts);
     die;
 }
 public static function meta_through_join($hide_field, $selected_field, $observed_field_val, $this_field = false, &$metas)
 {
     if (is_array($observed_field_val)) {
         $observed_field_val = array_filter($observed_field_val);
     }
     if (empty($observed_field_val) || !is_numeric($observed_field_val) && !is_array($observed_field_val)) {
         return;
     }
     $observed_info = FrmField::getOne($hide_field);
     if (!$selected_field || !$observed_info) {
         return;
     }
     $form_id = FrmProFieldsHelper::get_parent_form_id($selected_field);
     $join_fields = FrmField::get_all_types_in_form($form_id, 'data');
     if (empty($join_fields)) {
         return;
     }
     foreach ($join_fields as $jf) {
         if (isset($jf->field_options['form_select']) && isset($observed_info->field_options['form_select']) && $jf->field_options['form_select'] == $observed_info->field_options['form_select']) {
             $join_field = $jf->id;
         }
     }
     if (!isset($join_field)) {
         return;
     }
     $observed_field_val = array_filter((array) $observed_field_val);
     $query = array('field_id' => (int) $join_field);
     $sub_query = array('it.meta_value' => $observed_field_val);
     foreach ($observed_field_val as $obs_val) {
         $sub_query['or'] = 1;
         $sub_query['it.meta_value LIKE'] = ':"' . $obs_val . '"';
     }
     $query[] = $sub_query;
     $user_id = '';
     if ($this_field && isset($this_field->field_options['restrict']) && $this_field->field_options['restrict']) {
         $query['e.user_id'] = get_current_user_id();
     }
     // the ids of all the entries that have been selected in the linked form
     $entry_ids = FrmEntryMeta::getEntryIds($query);
     if (!empty($entry_ids)) {
         if ($form_id != $selected_field->form_id) {
             // this is a child field so we need to get the child entries
             global $wpdb;
             $entry_ids = FrmDb::get_col($wpdb->prefix . 'frm_items', array('parent_item_id' => $entry_ids));
         }
         if (!empty($entry_ids)) {
             $metas = FrmEntryMeta::getAll(array('item_id' => $entry_ids, 'field_id' => $selected_field->id), ' ORDER BY meta_value');
         }
     }
 }
Example #7
0
 function widget($args, $instance)
 {
     global $wpdb;
     $display = FrmProDisplay::getOne($instance['display_id'], false, true);
     $title = apply_filters('widget_title', empty($instance['title']) && $display ? $display->post_title : $instance['title']);
     $limit = empty($instance['limit']) ? ' LIMIT 100' : " LIMIT {$instance['limit']}";
     $post_id = !$display || empty($display->frm_post_id) ? $instance['post_id'] : $display->frm_post_id;
     $page_url = get_permalink($post_id);
     $order_by = '';
     $cat_field = false;
     if ($display && is_numeric($display->frm_form_id) && !empty($display->frm_form_id)) {
         //Set up order for Entries List Widget
         if (isset($display->frm_order_by) && !empty($display->frm_order_by)) {
             //Get only the first order field and order
             $order_field = reset($display->frm_order_by);
             $order = reset($display->frm_order);
             FrmAppHelper::esc_order_by($order);
             if ($order_field == 'rand') {
                 //If random is set, set the order to random
                 $order_by = ' RAND()';
             } else {
                 if (is_numeric($order_field)) {
                     //If ordering by a field
                     //Get all post IDs for this form
                     $posts = FrmDb::get_results($wpdb->prefix . 'frm_items', array('form_id' => $display->frm_form_id, 'post_id >' => 1, 'is_draft' => 0), 'id, post_id');
                     $linked_posts = array();
                     foreach ($posts as $post_meta) {
                         $linked_posts[$post_meta->post_id] = $post_meta->id;
                     }
                     //Get all field information
                     $o_field = FrmField::getOne($order_field);
                     $query = 'SELECT m.id FROM ' . $wpdb->prefix . 'frm_items m INNER JOIN ';
                     $where = array();
                     //create query with ordered values
                     //if field is some type of post field
                     if (isset($o_field->field_options['post_field']) && $o_field->field_options['post_field']) {
                         if ($o_field->field_options['post_field'] == 'post_custom' && !empty($linked_posts)) {
                             //if field is custom field
                             $where['pm.post_id'] = array_keys($linked_posts);
                             FrmDb::get_where_clause_and_values($where);
                             array_unshift($where['values'], $o_field->field_options['custom_field']);
                             $query .= $wpdb->postmeta . ' pm ON pm.post_id=m.post_id AND pm.meta_key=%s ' . $where['where'] . ' ORDER BY CASE when pm.meta_value IS NULL THEN 1 ELSE 0 END, pm.meta_value ' . $order;
                         } else {
                             if ($o_field->field_options['post_field'] != 'post_category' && !empty($linked_posts)) {
                                 //if field is a non-category post field
                                 $where['p.ID'] = array_keys($linked_posts);
                                 FrmDb::get_where_clause_and_values($where);
                                 $query .= $wpdb->posts . ' p ON p.ID=m.post_id ' . $where['where'] . ' ORDER BY CASE p.' . sanitize_title($o_field->field_options['post_field']) . ' WHEN "" THEN 1 ELSE 0 END, p.' . sanitize_title($o_field->field_options['post_field']) . ' ' . $order;
                             }
                         }
                     } else {
                         //if field is a normal, non-post field
                         $where['em.field_id'] = $o_field->id;
                         FrmDb::get_where_clause_and_values($where);
                         $query .= $wpdb->prefix . 'frm_item_metas em ON em.item_id=m.id ' . $where['where'] . ' ORDER BY CASE when em.meta_value IS NULL THEN 1 ELSE 0 END, em.meta_value' . ($o_field->type == 'number' ? ' +0 ' : '') . ' ' . $order;
                     }
                     //Get ordered values
                     if (!empty($where)) {
                         $metas = $wpdb->get_results($wpdb->prepare($query, $where['values']));
                     } else {
                         $metas = false;
                     }
                     unset($query, $where);
                     if (!empty($metas)) {
                         $order_by_array = array();
                         foreach ($metas as $meta) {
                             $order_by_array[] = $wpdb->prepare('it.id=%d DESC', $meta->id);
                         }
                         $order_by = implode(', ', $order_by_array);
                         unset($order_by_array);
                     } else {
                         $order_by .= 'it.created_at ' . $order;
                     }
                     unset($metas);
                 } else {
                     if (!empty($order_field)) {
                         //If ordering by created_at or updated_at
                         $order_by = 'it.' . sanitize_title($order_field) . ' ' . $order;
                     }
                 }
             }
             if (!empty($order_by)) {
                 $order_by = ' ORDER BY ' . $order_by;
             }
         }
         if (isset($instance['cat_list']) && (int) $instance['cat_list'] == 1 && is_numeric($instance['cat_id'])) {
             if ($cat_field = FrmField::getOne($instance['cat_id'])) {
                 $categories = maybe_unserialize($cat_field->options);
             }
         }
     }
     echo $args['before_widget'];
     if ($title) {
         echo $args['before_title'] . $title . $args['after_title'];
     }
     echo '<ul id="frm_entry_list' . ($display ? $display->frm_form_id : '') . '">' . "\n";
     //if Listing entries by category
     if (isset($instance['cat_list']) && (int) $instance['cat_list'] == 1 && isset($categories) && is_array($categories)) {
         foreach ($categories as $cat_order => $cat) {
             if ($cat == '') {
                 continue;
             }
             echo '<li>';
             if (isset($instance['cat_name']) && (int) $instance['cat_name'] == 1 && $cat_field) {
                 echo '<a href="' . esc_url(add_query_arg(array('frm_cat' => $cat_field->field_key, 'frm_cat_id' => $cat_order), $page_url)) . '">';
             }
             echo $cat;
             if (isset($instance['cat_count']) && (int) $instance['cat_count'] == 1) {
                 echo ' (' . FrmProFieldsHelper::get_field_stats($instance['cat_id'], 'count', false, $cat) . ')';
             }
             if (isset($instance['cat_name']) && (int) $instance['cat_name'] == 1) {
                 echo '</a>';
             } else {
                 $entry_ids = FrmEntryMeta::getEntryIds(array('meta_value like' => $cat, 'fi.id' => $instance['cat_id']));
                 $items = false;
                 if ($entry_ids) {
                     $items = FrmEntry::getAll(array('it.id' => $entry_ids, 'it.form_id' => (int) $display->frm_form_id), $order_by, $limit);
                 }
                 if ($items) {
                     echo '<ul>';
                     foreach ($items as $item) {
                         $url_id = $display->frm_type == 'id' ? $item->id : $item->item_key;
                         $current = FrmAppHelper::simple_get($display->frm_param) == $url_id ? ' class="current_page"' : '';
                         if ($item->post_id) {
                             $entry_link = get_permalink($item->post_id);
                         } else {
                             $entry_link = add_query_arg(array($display->frm_param => $url_id), $page_url);
                         }
                         echo '<li' . $current . '><a href="' . esc_url($entry_link) . '">' . FrmAppHelper::kses($item->name) . '</a></li>' . "\n";
                     }
                     echo '</ul>';
                 }
             }
             echo '</li>';
         }
     } else {
         // if not listing entries by category
         if ($display) {
             $items = FrmEntry::getAll(array('it.form_id' => $display->frm_form_id, 'is_draft' => '0'), $order_by, $limit);
         } else {
             $items = array();
         }
         foreach ($items as $item) {
             $url_id = $display->frm_type == 'id' ? $item->id : $item->item_key;
             $current = FrmAppHelper::simple_get($display->frm_param) == $url_id ? ' class="current_page"' : '';
             echo '<li' . $current . '><a href="' . esc_url(add_query_arg(array($display->frm_param => $url_id), $page_url)) . '">' . FrmAppHelper::kses($item->name) . '</a></li>' . "\n";
         }
     }
     echo "</ul>\n";
     echo $args['after_widget'];
 }
 /**
  * Get fields with specified field value 'frm_cat' = field key/id,
  * 'frm_cat_id' = order position of selected option
  * @since 2.0.6
  */
 private static function maybe_add_cat_query(&$where)
 {
     $frm_cat = FrmAppHelper::simple_get('frm_cat', 'sanitize_title');
     $frm_cat_id = FrmAppHelper::simple_get('frm_cat_id', 'sanitize_title');
     if (!$frm_cat || !isset($_GET['frm_cat_id'])) {
         return;
     }
     $cat_field = FrmField::getOne($frm_cat);
     if (!$cat_field) {
         return;
     }
     $categories = maybe_unserialize($cat_field->options);
     if (isset($categories[$frm_cat_id])) {
         $cat_entry_ids = FrmEntryMeta::getEntryIds(array('meta_value' => $categories[$frm_cat_id], 'fi.field_key' => $frm_cat));
         if ($cat_entry_ids) {
             $where['it.id'] = $cat_entry_ids;
         } else {
             $where['it.id'] = 0;
         }
     }
 }