Terry Barriff
Terry Barriff

Reputation: 475

How does AJAX handle multiples instances of a variable?

I am currently editing a WordPress plugin, which allows you to filter posts by category, once a category is selected, the posts for that caregory are displayed as a checklist on the widget, the user can select the posts they wish to display in their sidebar/widget area of the theme.

I have taken the widget to the point that the user can select their post, the widget allows a single post to be selected, however if more than one is selected and the save button is pressed, the form returns only the last slected post.

After some searching, I have found the problem to be on the form return. It is either to do with the update, or the way AJAX handles multiple instances of a variable.

the information posted to the server is as follows:

action  save-widget
add_new 
id_base single_post_super_widget
multi_number    
savewidgets 9bc3d79f1c
sidebar lcp-sb
widget-height   200
widget-id   single_post_super_widget-2
widget-single_post_super_widget[2][object_to_use]   5005
widget-single_post_super_widget[2][object_to_use]   4892
widget-single_post_super_widget[2][object_to_use]   4607
widget-single_post_super_widget[2][object_type] 72
widget-single_post_super_widget[2][paged]   1
widget-single_post_super_widget[2][tab] all
widget-single_post_super_widget[2][title_override]  
widget-width    400
widget_number   2

Where object_to_use is the post(s) being selected.

the information being sent is defined here:

var theArgs = {
    action: jQuery('input.widget_class:hidden', widgetDiv).first().val() + '-get-metabox',
    widget: widgetDivId,
    number: widgetNumber,
    blog_id: jQuery(widgetInputBase + 'blog_id').val(),
    object_type: jQuery(widgetInputBase + 'object_type').val(),
    tab: currentTab,
    paged: currentPage,
    object_to_use: jQuery('input[type=checkbox][name$="[object_to_use]['+currentTab+']"]:checked', widgetDiv).first().val(),
    title_override: jQuery(widgetInputBase + 'title_override').val(),
    excerpt_override: jQuery(widgetInputBase + 'excerpt_override').val(),
    searched: ('search' == currentTab) ? jQuery('input.quick-search', widgetDiv).first().val() : ''
};

and the jQuery.post action:

jQuery.post(
    ajaxurl,
    theArgs,
    function( r ) {
        jQuery('.ajax-feedback').css('visibility', 'hidden');
        if ( r && r.length > 2 ) {
            jQuery('div.widget-content', widgetDiv).html(r);
        }
    }
);

In relation to the question, widget-single_post_super_widget[2][object_to_use] is being posted multiple times, how does AJAX handle this? Does each post/variable have to be unique?

Upvotes: 1

Views: 201

Answers (2)

Quentin
Quentin

Reputation: 943980

widget-single_post_super_widget[2][object_to_use] is being posted multiple times, how does AJAX handle this?

There is nothing Ajax specific about this. You just get multiple copies of the key in the data submitted to the server.

Does each post/variable have to be unique?

No.

In most server side environments, you can get all the data just by using the right function. For example with Perl's CGI.pm module, you just get the parameter in list context:

my @thing = $cgi->param('widget-single_post_super_widget[2][object_to_use]');

… and it will 'just work'.

PHP is special. If the name ends in [] then it will just create an array in $_POST and friends. If it doesn't, then it will discard all but the last item. (Unless I'm misremembering and it keeps the first instead).

Upvotes: 1

FrontEnd Expert
FrontEnd Expert

Reputation: 5803

You can use ajax using jQuery.. then you can pass multiple instances of variable :-

like this :-

 if(roleId !=''  && roleId != '16'){
                jQuery('#user_id_div').hide();
                jQuery('#loading_image').show().html("<label> &nbsp; </label> <img src='<?php echo $this->webroot; ?>img/ajax-loader.gif' alt='Loading...'>");
                urlData = "<?php echo Router::url(array('controller' => 'users', 'action' => 'getmultipleVendors')) ?>" ;
                postData = "vendorType=" + roleId;

                jQuery.ajax({
                    url: urlData,
                    data: postData,
                    success: function(data) {
                        jQuery('#PromoCodeUserId').html(data);
                        jQuery('#user_id_div').show();
                        jQuery('#loading_image').hide();

                    }
                });

in postdata field you can post many data as avariables..

Upvotes: 0

Related Questions