Team Sense: Многопользовательский календарь, заменяем радиокнопки на чекбоксы в выборе преподавателей. Массивы в Javascript.

Team Sense: Многопользовательский календарь, заменяем радиокнопки на чекбоксы в выборе преподавателей. Массивы в Javascript. Для внедрения возможности одновременного подключения нескольких календарей-расписаний на одном заменяем radiobuttons на checkboxes.

Многопользовательский календарь на FullCalendar с радиокнопками выбора преподавателей:

Многопользовательский календарь на FullCalendar с радиокнопками выбора преподавателей

Многопользовательский календарь на FullCalendar с чекбоксами выбора/подключения преподавателей.

Многопользовательский календарь на FullCalendar с чекбоксами для подключения нескольких календарей преподавателей

Замена radiobuttons на checkboxes повлекла за собой изменения в логике. Главным образом это касается передачи состояния чекбоксов. Если радиокнопкой мы делали единственный выбор, а значит, для передачи хватало одной переменной (id чекнутого учителя), то с внедрением checkboxes получаем возможность множественного выбора, а значит передавать нужно массив (значения id всех чекнутых учителей).

Для этого в моделе расписания заменяем условие where('teacher_id =', $sch_teacher_id) на where_in('teacher_id', $sch_teacher_id). Таким образом, проверяем попадает ли строка в таблице с teacher_id в нужные нам события, то есть содержится ли значение teacher_id в новоиспечённом массиве $sch_teacher_id. Такая замена правомерна, и переменная $sch_teacher_id может теперь не только принимать конкретные значения, например, "121" (массив с единственным элементом), но и являться массивом, например, array('121', '137', '14'). Это первый шаг.

В контроллере ничего не меняем, там с помощью $this->input->get('sch_teacher_id'); мы можем принимать и число и массив.

В виде же теперь мы будем наполнять массив значениями value чекбоксов, если стоит галочка, причём это будем проверять асинхронно, с каждым нажатием/отжатием галочек. В этом нам помогает .push

$("input[type='checkbox'][name='teacher']").each( function() {  
if(this.checked) {
events1.data.sch_teacher_id.push($(this).attr("value")); 
events2.data.sch_teacher_id.push($(this).attr("value"));
events3.data.sch_teacher_id.push($(this).attr("value"));
}   
});

Но каждый раз необходимо обнулять массив, иначе в него будут push'аться повторы и не будет убираться календарь учителя при снятии с него галочки. То есть выше этого цикла опустошаю массив

events1.data.sch_teacher_id = [];
events2.data.sch_teacher_id = [];
events3.data.sch_teacher_id = [];
Также теперь переменную в JavaScript объявляю как массив
var sch_teacher_id = new Array("<?php echo $sch_teacher_id; ?>");
Подробности решения смотрите: Pairs key=value are splitting by each symbol code when Ajax call [SOLVED]
 
 
Ответ на изначальный вопрос почему в строке запроса GET key=value pairs transform into symbols and in my ajax GET call I have:
GET /admin_schedule/get_schedule_db/?0=%5B&1=o&2=b&3=j&4=e&5=c&6=t&7=+&8=O&9=b&10=j&11=e&12=c&13=t&14=%5D&15=%22&16=%26&17=t&18=e&19=a&20=c
instead of
GET /admin_schedule/get_schedule_db/?teacherArray[]=128&teacherArray[]=134...
следующий (Jan Dvorak):
 
Concatenating a string with an object is almost never a good idea as Object#toString always returns "[object Object]". Unless you override toString in your object, the object is cast to string as this string (meaning its content is lost) before it's concatenated. Moreover, the resulting string is not a valid query string.
 
Instead of
 
eventss += "&teacherArray[]=" + $(this).attr("value");
...
events1.data += eventss;
try creating an empty teacherArray in data and
 
events1.data.teacherArray.push($(this).attr("value"));
Also consider using $("#my-form").serialize()
Источник: loco.ru

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (0)     Подпишитесь на RSS комментариев к этой статье.