简体   繁体   中英

Foreach loop data passed to jquery

Ok, I'm going to try to explain this the best I can.

I have a product filter on my website that is built using php foreach to create the filter headers and options from a data base. The code it generates is below.

<div class="card mb-2 card-body alert-filters">
<h4>Product Filter</h4>
<div class="row">
  <div 
     class="col-md-3">
     <h5>Price</h5>
     <input type="hidden" id="hidden_minimum_price" value="0"> <input 
        type="hidden" id="hidden_maximum_price" value="50">
     <p id="price_show">£0 - £50</p>
     <div 
        id="price_range" class="ui-slider ui-corner-all ui-slider-horizontal ui-widget ui-widget- 
        content">
        <div class="ui-slider-range ui-corner-all ui-widget-header" style="left: 0%; width: 
           100%;"></div>
        <span tabindex="0" class="ui-slider-handle ui-corner-all ui-state-default" 
           style="left: 0%;"></span><span tabindex="0" class="ui-slider-handle ui-corner-all ui- 
state- default" style="left: 100%;"></span>
     </div>
  </div>
  <div class="col-md-3">
     <h5>Material</h5>
     <div 
        style="height: 180px; overflow-y: auto; overflow-x: hidden;">
        <div class="list-group-item 
           checkbox"><label><input type="checkbox" class="common_selector brand1" value="3"> 
Metal</label> 
        </div>
        <div class="list-group-item checkbox"><label><input type="checkbox" 
class="common_selector 
           brand1" value="1"> PLA</label></div>
        <div class="list-group-item checkbox"><label><input 
           type="checkbox" class="common_selector brand1" value="4"> Resin</label></div>
     </div>
  </div>
  <div 
     class="col-md-3">
     <h5>Base</h5>
     <div style="height: 180px; overflow-y: auto; overflow-x: hidden;">
        <div class="list-group-item checkbox"><label><input type="checkbox" 
class="common_selector 
           brand2" value="2"> Included</label></div>
     </div>
  </div>
  <input type="hidden" name="cPath" id="cPath" 
     value="15_13_14">
</div>

The category id is added to the class 'brand'. This is then passed to the jquery below -

$(document).ready(function(){

    filter_data();

    function filter_data()
    {
        $('.filter_data').html('<div id="loading" style="" ></div>');
        var action = 'fetch_data';
        var minimum_price = $('#hidden_minimum_price').val();
        var maximum_price = $('#hidden_maximum_price').val();
        var cPath = $("#cPath").val();
        var brand = get_filter('brand');
        $.ajax({
            url:"ext/filter/fetch_data.php",
            method:"POST",
            data:{action:action, minimum_price:minimum_price, maximum_price:maximum_price, 
    brand:brand, cPath: cPath},
            success:function(data){
                $("#product_list").html(data);
            }
        });
    }

    function get_filter(class_name)
    {
        var filter = [];
        $('.'+class_name+':checked').each(function(){
            filter.push($(this).val());
        });
        return filter;
    }

    $('.common_selector').click(function(){
        filter_data();
    });

    $('#price_range').slider({
        range:true,
        min:0,
        max:50,
        values:[0, 50],
        step:1,
        stop:function(event, ui)
        {
            $('#price_show').html('£' + ui.values[0] + ' - ' + '£' + ui.values[1]);
            $('#hidden_minimum_price').val(ui.values[0]);
            $('#hidden_maximum_price').val(ui.values[1]);
            filter_data();
        }
    });

});

This works fine if I do not add the category ID as it just uses the 'brand'.

What I am wanting to do is have a var for 'brand1', 'brand2' etc depending on how many categories there are or a way to group them together and I can split them out on the proceeding page.

If I am understanding you, you need a way of cycling through different brands without knowing ahead of time what those brands are. You're using the brand 'name' as a class. Instead you can set it as a separate attribute (not a classname), so as to make it easier to segregate. Here I used rel to store the brand name and a simple loop to gather the checked category ids after clicking.

 let selected $(document).ready(function() { $('.common_selector').click(function() { selected = {} $('.common_selector:checked').each(function() { if (selected[$(this).attr('rel')]) selected[$(this).attr('rel')].push($(this).val()); else selected[$(this).attr('rel')] = [$(this).val()] }) console.log('selected:', selected); }) })
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <label><input type="checkbox" class="common_selector" rel="brand1" value="2"> Included</label> <label><input type="checkbox" class="common_selector" rel="brand1" value="4"> Included</label> <label><input type="checkbox" class="common_selector" rel="brand2" value="5"> Included</label> <label><input type="checkbox" class="common_selector" rel="brand3" value="10"> Included</label>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM