From 674f27a0d43e89c1373cfec87754236f28d55cc9 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 27 Mar 2019 17:42:46 +0100 Subject: [PATCH 1/7] fixed frontend --- cmb2-field-ajax-search.php | 26 ++++++++++++++------------ js/ajax-search.js | 13 +++++++------ 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/cmb2-field-ajax-search.php b/cmb2-field-ajax-search.php index 514e542..ec0ffc4 100644 --- a/cmb2-field-ajax-search.php +++ b/cmb2-field-ajax-search.php @@ -46,19 +46,23 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { add_filter( 'cmb2_pre_field_display_term_ajax_search', array( $this, 'display' ), 10, 3 ); // Sanitize - add_action( 'cmb2_sanitize_post_ajax_search', array( $this, 'sanitize' ), 10, 4 ); - add_action( 'cmb2_sanitize_user_ajax_search', array( $this, 'sanitize' ), 10, 4 ); - add_action( 'cmb2_sanitize_term_ajax_search', array( $this, 'sanitize' ), 10, 4 ); + //add_action( 'cmb2_sanitize_post_ajax_search', array( $this, 'sanitize' ), 10, 4 ); + //add_action( 'cmb2_sanitize_user_ajax_search', array( $this, 'sanitize' ), 10, 4 ); + //add_action( 'cmb2_sanitize_term_ajax_search', array( $this, 'sanitize' ), 10, 4 ); // Ajax request add_action( 'wp_ajax_cmb_ajax_search_get_results', array( $this, 'get_results' ) ); } + public function convert_as_id_css( $name ) { + return str_replace( '__', '_', str_replace( '[', '_', str_replace( ']', '_', $name ) ) ); + } + /** * Render field */ public function render( $field, $value, $object_id, $object_type, $field_type ) { - $field_name = $field->_name(); + $field_name = $this->convert_as_id_css($field->_name()); $default_limit = 1; // Current filter is cmb2_render_{$object_to_search}_ajax_search ( post, user or term ) @@ -78,9 +82,9 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { ?>
  • args( 'sortable' ) ) : ?> - - - object_text( $field_name, $val, $object_to_search ); ?> + + + object_text( $field->_name(), $val, $object_to_search ); ?>
  • @@ -108,7 +112,7 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { echo $field_type->input( array( 'type' => 'text', - 'name' => $field_name . '_input', + 'name' => $field->_name() . '_input', 'id' => $field_name . '_input', 'class' => 'cmb-ajax-search cmb-' . $object_to_search . '-ajax-search', 'value' => $input_value, @@ -167,12 +171,10 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { * Optionally save the latitude/longitude values into two custom fields */ public function sanitize( $override_value, $value, $object_id, $field_args ) { - $fid = $field_args['id']; + $value = false; - if($field_args['render_row_cb'][0]->data_to_save[$field_args['id']]) { + if( isset( $field_args['render_row_cb'][0]->data_to_save[$field_args['id']] ) ) { $value = $field_args['render_row_cb'][0]->data_to_save[$field_args['id']]; - } else { - $value = false; } return $value; diff --git a/js/ajax-search.js b/js/ajax-search.js index 47d6dce..ad63f40 100644 --- a/js/ajax-search.js +++ b/js/ajax-search.js @@ -4,7 +4,7 @@ $(this).attr('data-ajax-search', true); var input_id = $(this).attr('id'); // Field id with '_input' sufix (the searchable field) - var field_id = $(this).attr('id').replace( new RegExp('_input$'), '' ); // Field id, the true one field + var field_id = $(this).attr('id').replace( new RegExp('_input$'), '' ).replace(/[\[\]']+/g, '_'); // Field id, the true one field var object_type = $(this).attr('data-object-type'); var query_args = $(this).attr('data-query-args'); @@ -50,15 +50,16 @@ }, onSelect: function ( suggestion ) { $(this).devbridgeAutocomplete('clearCache'); - - var field_name = $(this).attr('id').replace( new RegExp('_input$'), '' ); + + var field_name = $(this).attr('name').replace( new RegExp('_input$'), '' ); var multiple = $(this).attr('data-multiple'); var limit = parseInt( $(this).attr('data-limit') ); var sortable = $(this).attr('data-sortable'); - + var field_name_temp = field_name.replace( /[\[\]']+/g, '_' ); + if( multiple == 1 ) { // Multiple - $('#' + field_name + '_results' ).append( '
  • ' + + $('#' + field_name_temp + '_results' ).append( '
  • ' + ( ( sortable == 1 ) ? '' : '' ) + '' + '' + suggestion.value + '' + @@ -68,7 +69,7 @@ $(this).val( '' ); // Checks if there is the max allowed results, limit < 0 means unlimited - if( limit > 0 && limit == $('#' + field_name + '_results li').length ) { + if( limit > 0 && limit == $('#' + field_name_temp + '_results li').length ) { $(this).prop( 'disabled', 'disabled' ); } else { $(this).focus(); From a67510374bda83b08bd56f8cf906289d5bc42a5e Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 27 Mar 2019 18:30:14 +0100 Subject: [PATCH 2/7] fix --- cmb2-field-ajax-search.php | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/cmb2-field-ajax-search.php b/cmb2-field-ajax-search.php index ec0ffc4..33794d6 100644 --- a/cmb2-field-ajax-search.php +++ b/cmb2-field-ajax-search.php @@ -46,9 +46,9 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { add_filter( 'cmb2_pre_field_display_term_ajax_search', array( $this, 'display' ), 10, 3 ); // Sanitize - //add_action( 'cmb2_sanitize_post_ajax_search', array( $this, 'sanitize' ), 10, 4 ); - //add_action( 'cmb2_sanitize_user_ajax_search', array( $this, 'sanitize' ), 10, 4 ); - //add_action( 'cmb2_sanitize_term_ajax_search', array( $this, 'sanitize' ), 10, 4 ); + add_action( 'cmb2_sanitize_post_ajax_search', array( $this, 'sanitize' ), 10, 4 ); + add_action( 'cmb2_sanitize_user_ajax_search', array( $this, 'sanitize' ), 10, 4 ); + add_action( 'cmb2_sanitize_term_ajax_search', array( $this, 'sanitize' ), 10, 4 ); // Ajax request add_action( 'wp_ajax_cmb_ajax_search_get_results', array( $this, 'get_results' ) ); @@ -171,13 +171,16 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { * Optionally save the latitude/longitude values into two custom fields */ public function sanitize( $override_value, $value, $object_id, $field_args ) { - $value = false; + if ( !is_array( $value ) || !( array_key_exists('repeatable', $field_args ) && $field_args['repeatable'] == TRUE ) ) { + return $override_value; + } - if( isset( $field_args['render_row_cb'][0]->data_to_save[$field_args['id']] ) ) { - $value = $field_args['render_row_cb'][0]->data_to_save[$field_args['id']]; - } + $new_values = array(); + foreach ( $value as $key => $val ) { + $new_values[$key] = array_filter( array_map( 'sanitize_text_field', $val ) ); + } - return $value; + return array_filter( array_values( $new_values ) ); } /** From 267047211d11140bbd2e751d0828ffcb79cad79d Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 27 Mar 2019 19:10:13 +0100 Subject: [PATCH 3/7] fix --- cmb2-field-ajax-search.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cmb2-field-ajax-search.php b/cmb2-field-ajax-search.php index 33794d6..a737af2 100644 --- a/cmb2-field-ajax-search.php +++ b/cmb2-field-ajax-search.php @@ -74,6 +74,10 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { ?>
      input( array( 'type' => 'hidden', - 'name' => $field_name, + 'name' => $field->_name(), 'value' => $value, 'desc' => false ) ); @@ -171,6 +175,7 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { * Optionally save the latitude/longitude values into two custom fields */ public function sanitize( $override_value, $value, $object_id, $field_args ) { + error_log($field_args['id']); if ( !is_array( $value ) || !( array_key_exists('repeatable', $field_args ) && $field_args['repeatable'] == TRUE ) ) { return $override_value; } From 12bee95561b68144a266283e4ec57219cb33abda Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 27 Mar 2019 19:37:30 +0100 Subject: [PATCH 4/7] fix --- cmb2-field-ajax-search.php | 8 ++++---- js/ajax-search.js | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/cmb2-field-ajax-search.php b/cmb2-field-ajax-search.php index a737af2..249c952 100644 --- a/cmb2-field-ajax-search.php +++ b/cmb2-field-ajax-search.php @@ -68,16 +68,16 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { // Current filter is cmb2_render_{$object_to_search}_ajax_search ( post, user or term ) $object_to_search = str_replace( 'cmb2_render_', '', str_replace( '_ajax_search', '', current_filter() ) ); + if( ! is_array( $value ) && strpos( $value, ', ' ) ) { + $value = explode(', ', $value); + } + if( $field->args( 'multiple' ) == true ) { $default_limit = -1; // 0 or -1 means unlimited ?>
        Date: Wed, 27 Mar 2019 20:08:25 +0100 Subject: [PATCH 5/7] fix --- cmb2-field-ajax-search.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/cmb2-field-ajax-search.php b/cmb2-field-ajax-search.php index 249c952..a0b492a 100644 --- a/cmb2-field-ajax-search.php +++ b/cmb2-field-ajax-search.php @@ -45,6 +45,8 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { add_filter( 'cmb2_pre_field_display_user_ajax_search', array( $this, 'display' ), 10, 3 ); add_filter( 'cmb2_pre_field_display_term_ajax_search', array( $this, 'display' ), 10, 3 ); + add_filter( 'cmb2_override_meta_value', array( $this, 'get_value' ), 10, 4 ); + // Sanitize add_action( 'cmb2_sanitize_post_ajax_search', array( $this, 'sanitize' ), 10, 4 ); add_action( 'cmb2_sanitize_user_ajax_search', array( $this, 'sanitize' ), 10, 4 ); @@ -54,6 +56,14 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { add_action( 'wp_ajax_cmb_ajax_search_get_results', array( $this, 'get_results' ) ); } + public function get_value( $string, $object_id, $a, $object ) { + if ( ( $object->args( 'type' ) === 'post_ajax_search' || $object->args( 'type' ) === 'puser_ajax_search' || $object->args( 'type' ) === 'term_ajax_search' ) && $object->group ) { + $data = get_metadata( $a['type'], $a['id'], $a['field_id'], ( $a['single'] || $a['repeat'] ) ); + return $data[ 0 ]; + } + return $string; + } + public function convert_as_id_css( $name ) { return str_replace( '__', '_', str_replace( '[', '_', str_replace( ']', '_', $name ) ) ); } @@ -175,7 +185,6 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { * Optionally save the latitude/longitude values into two custom fields */ public function sanitize( $override_value, $value, $object_id, $field_args ) { - error_log($field_args['id']); if ( !is_array( $value ) || !( array_key_exists('repeatable', $field_args ) && $field_args['repeatable'] == TRUE ) ) { return $override_value; } From f6cbf3b434f9470114fe34bfe944a9f56fa81252 Mon Sep 17 00:00:00 2001 From: Daniele Scasciafratte Date: Wed, 27 Mar 2019 20:18:16 +0100 Subject: [PATCH 6/7] fix --- cmb2-field-ajax-search.php | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/cmb2-field-ajax-search.php b/cmb2-field-ajax-search.php index a0b492a..e09b020 100644 --- a/cmb2-field-ajax-search.php +++ b/cmb2-field-ajax-search.php @@ -45,8 +45,6 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { add_filter( 'cmb2_pre_field_display_user_ajax_search', array( $this, 'display' ), 10, 3 ); add_filter( 'cmb2_pre_field_display_term_ajax_search', array( $this, 'display' ), 10, 3 ); - add_filter( 'cmb2_override_meta_value', array( $this, 'get_value' ), 10, 4 ); - // Sanitize add_action( 'cmb2_sanitize_post_ajax_search', array( $this, 'sanitize' ), 10, 4 ); add_action( 'cmb2_sanitize_user_ajax_search', array( $this, 'sanitize' ), 10, 4 ); @@ -56,14 +54,6 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { add_action( 'wp_ajax_cmb_ajax_search_get_results', array( $this, 'get_results' ) ); } - public function get_value( $string, $object_id, $a, $object ) { - if ( ( $object->args( 'type' ) === 'post_ajax_search' || $object->args( 'type' ) === 'puser_ajax_search' || $object->args( 'type' ) === 'term_ajax_search' ) && $object->group ) { - $data = get_metadata( $a['type'], $a['id'], $a['field_id'], ( $a['single'] || $a['repeat'] ) ); - return $data[ 0 ]; - } - return $string; - } - public function convert_as_id_css( $name ) { return str_replace( '__', '_', str_replace( '[', '_', str_replace( ']', '_', $name ) ) ); } @@ -82,7 +72,7 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { $value = explode(', ', $value); } - if( $field->args( 'multiple' ) == true ) { + if( $field->args( 'multiple-item' ) == true ) { $default_limit = -1; // 0 or -1 means unlimited ?>
          'cmb-ajax-search cmb-' . $object_to_search . '-ajax-search', 'value' => $input_value, 'desc' => false, - 'data-multiple' => $field->args( 'multiple' ) ? $field->args( 'multiple' ) : '0', + 'data-multiple' => $field->args( 'multiple-item' ) ? $field->args( 'multiple-item' ) : '0', 'data-limit' => $field->args( 'limit' ) ? $field->args( 'limit' ) : $default_limit, 'data-sortable' => $field->args( 'sortable' ) ? $field->args( 'sortable' ) : '0', 'data-object-type' => $object_to_search, From 716920f25ac87de01c1dea3b45f398d469c8b87f Mon Sep 17 00:00:00 2001 From: Mte90 Date: Wed, 27 Mar 2019 21:50:14 +0100 Subject: [PATCH 7/7] bump and updated changelog --- cmb2-field-ajax-search.php | 6 +++--- js/ajax-search.js | 8 ++++---- readme.md | 12 +++++++++--- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/cmb2-field-ajax-search.php b/cmb2-field-ajax-search.php index e09b020..112d59e 100644 --- a/cmb2-field-ajax-search.php +++ b/cmb2-field-ajax-search.php @@ -27,7 +27,7 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { /** * Current version number */ - const VERSION = '1.0.2'; + const VERSION = '1.0.3'; /** * Initialize the plugin by hooking into CMB2 @@ -116,8 +116,8 @@ if( ! class_exists( 'CMB2_Field_Ajax_Search' ) ) { echo $field_type->input( array( 'type' => 'text', - 'name' => $field->_name() . '_input', - 'id' => $field_name . '_input', + 'name' => '_' . $field->_name(), + 'id' => $field_name, 'class' => 'cmb-ajax-search cmb-' . $object_to_search . '-ajax-search', 'value' => $input_value, 'desc' => false, diff --git a/js/ajax-search.js b/js/ajax-search.js index aa2e9b2..41de292 100644 --- a/js/ajax-search.js +++ b/js/ajax-search.js @@ -3,7 +3,7 @@ $('.cmb-ajax-search:not([data-ajax-search="true"])').each(function () { $(this).attr('data-ajax-search', true); - var field_id = $(this).attr('id').replace( new RegExp('_input$'), '' ).replace(/[\[\]']+/g, '_'); // Field id, the true one field + var field_id = $(this).attr('id').replace(/[\[\]']+/g, '_'); // Field id, the true one field var object_type = $(this).attr('data-object-type'); var query_args = $(this).attr('data-query-args'); @@ -50,17 +50,17 @@ onSelect: function ( suggestion ) { $(this).devbridgeAutocomplete('clearCache'); - var field_name = $(this).attr('name').replace( new RegExp('_input$'), '' ); + var field_name = $(this).attr('name'); var multiple = $(this).attr('data-multiple'); var limit = parseInt( $(this).attr('data-limit') ); var sortable = $(this).attr('data-sortable'); - var field_name_temp = field_name.replace( /[\[\]']+/g, '_' ); + var field_name_temp = field_name.substring(1).replace( /[\[\]']+/g, '_' ); if( multiple == 1 ) { // Multiple $('#' + field_name_temp + '_results' ).append( '
        • ' + ( ( sortable == 1 ) ? '' : '' ) + - '' + + '' + '' + suggestion.value + '' + '' + '
        • ' ); diff --git a/readme.md b/readme.md index 6f5b4a0..55d6c5e 100644 --- a/readme.md +++ b/readme.md @@ -62,7 +62,7 @@ function cmb2_ajax_search_metabox() { 'desc' => __( 'Field description (optional)', 'cmb2' ), 'id' => $prefix . 'posts', 'type' => 'post_ajax_search', - 'multiple' => true, + 'multiple-item' => true, 'limit' => 10, 'query_args' => array( 'post_type' => array( 'post', 'page' ), @@ -88,7 +88,7 @@ function cmb2_ajax_search_metabox() { 'desc' => __( 'Field description (optional)', 'cmb2' ), 'id' => $prefix . 'users', 'type' => 'user_ajax_search', - 'multiple' => true, + 'multiple-item' => true, 'limit' => 5, 'query_args' => array( 'role__not_in' => array( 'Administrator', 'Editor' ), @@ -113,7 +113,7 @@ function cmb2_ajax_search_metabox() { 'desc' => __( 'Field description (optional)', 'cmb2' ), 'id' => $prefix . 'terms', 'type' => 'term_ajax_search', - 'multiple' => true, + 'multiple-item' => true, 'limit' => -1, 'query_args' => array( 'taxonomy' => 'post_tag', @@ -156,6 +156,12 @@ If multiple == true will return an array of IDs of attached object: ## Changelog +### 1.0.3 + +* Fixed issues with repeatable fields +* Removed unused code +* Moved to new paramenter `multiple-item` to avoid conflicts with CMB2 + ### 1.0.2 * Updated devbridgeAutocomplete lib