2014-10-21 2 views
0

У меня есть список продуктов, отображаемых в таблице, каждый из которых имеет флажок, позволяющий пользователю выбрать этот продукт. Я хочу иметь возможность выполнять другие операции над выбранными продуктами, как только пользователь нажимает кнопку.Codeigniter как вызвать функцию контроллера через JQuery

До сих пор у меня есть код JQuery, прикрепленный к кнопке, которая строит массив идентификаторов выбранных продуктов, но теперь я застрял. Я хотел бы иметь возможность вызвать контроллер на этом этапе и передать массив; он затем может выполнять операции над выбранными элементами и отображать результаты в другом представлении, например.

Мой JQuery код выглядит следующим образом: (это очень многословным, поскольку он содержит много отладочных сообщений)

/* 
Respond to the clicking of the 'With Selected->[Update Retail Outlets]' button 
*/ 
$('#btn_uro').click(function() { 
    alert('Update Retail Outlets'); 
    var w = 0; 
    var str_status; 
    var sel_array = []; 
    $('.chk_sel_pdt').each(function() { 
     var $this = $(this); 
     if ($this.is(':checked')) { 
      str_status = "Checked"; 
      sel_array.push($this.val()); 
     } else { 
      str_status = "Unchecked"; 
     } 
     console.log (w + ": " + $(this).val() + " - " + str_status); 
     w++; 
    }); 
    console.log(sel_array); 

    // now try to send the array to a CI controller so that it can process the 
    // update request. 

Может кто-нибудь сказать мне, как я могу вызвать функцию контроллера здесь и передать sel_array [] к нему , Я ценю, что это может быть неправильный подход полностью, поэтому, пожалуйста, не стесняйтесь предлагать альтернативу.

Заранее спасибо. Г.

ответ

0

Вместо преобразования его в массиве, вы можете просто сцепить строки идентификаторов, как в коде

var selectedProducts = ""; 
$('.chk_sel_pdt').each(function() { 
    var $this = $(this); 
    if ($this.is(':checked')) { 
     str_status = "Checked"; 
     selectedProducts += $this.val()+","; 
    } else { 
     str_status = "Unchecked"; 
    } 
    console.log (w + ": " + $(this).val() + " - " + str_status); 
    w++; 
}); 

и отправить эти данные на вызов Ajax контроллер функции почтового атрибута

$.ajax({ 
     url: "controller_name/action_name", 
     data:{ selected_products: selectedProducts}, 

}); 

В контроллере вы можете просто использовать PHP explode для преобразования этих идентификаторов в массив и выполнения своей бизнес-логики.

В случае успеха ajax вы можете сделать что-либо с вашими элементами пользовательского интерфейса в соответствии с вашим ответом.

Счастливый Coding Uzair

+0

Спасибо, Узайр, это очень элегантное решение. Однако, когда я вызываю функцию контроллера, она не работает. То есть, функция контроллера загружает представление, но представление не отображается. Если я проверяю структуру GET с помощью Firebug, все представления находятся прямо на вкладке HTML, но CI не загружает его в мой браузер. Есть идеи? Благодарю. – unplugngo

+0

Привет, unplugngo. Вам нужно вернуть этот html в переменную типа $ html = $ this-> load-> view ($ view_name, $ data, true); он сохранит это представление в переменной и вернет эту переменную (желательно в json) в ответ ajax и проанализирует json в вашем js-успехе и покажет, что html-данные, где бы вы ни захотели, используя метод jQuery $ (element) .html(). Cheers – Uzair

0

логика, которая дается Uzair хорошо. добавление к тому, что в случае если вы не хотите, чтобы сделать AJAX вызов, то следующий код будет полезным

$('#btn_uro').click(function() { 
    alert('Update Retail Outlets'); 
    var w = 0; 
    var str_status; 
    var sel_str = ""; 
    $('.chk_sel_pdt').each(function() { 
     var $this = $(this); 
     if ($this.is(':checked')) { 
      str_status = "Checked"; 
      if(sel_str == "") 
       sel_str = $this.val(); 
      else 
       sel_str = sel_str + "," + $this.val(); 
     } 
     console.log (w + ": " + $(this).val() + " - " + str_status); 
     w++; 
    }); 
    console.log(sel_str); 
    $form = $('<form>'); 
    $form.attr('action',"ACTUAL URL").attr('method','POST'); 
    $('<input />').attr('type', 'hidden').attr('name','selectedproducts').attr('value',sel_str).appendTo($form); 
    $form.appendTo('body'); 
    $form.submit(); 
}) 

Вы можете получить selectedproducts как post переменной в контроллере.

+0

Спасибо - работает очень красиво. Я не уверен, что все это понимаю, но я расскажу позже. Хороший :-) – unplugngo

Смежные вопросы