Поиск объекта по неизвестному id
Здравствуйте.
Долго думал над заголовком и не придумал ничего лучшего Ситуация такая: В контроллере создаю массив: $array_next_state= Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT os.`id_order_state`, IF(osn.`id_order_state_next`, 1, 0) checked, osl.`name` FROM ..... далее из этого массива в tpl форме создаю таблицу из двух колонок - чекбоксы и наименования: <table class="table"> <tbody> {foreach $fields_value.array_next_state as $next_state} <tr> <td><input type="checkbox" id="{$next_state.id_order_state}" {if $next_state.checked == 1}checked="checked"{/if}></td> <td>{$next_state.name}</td> </tr> {/foreach} </tbody> </table> Дальше нужно сделать скрипт, который после "чеканья" пользователя занесет обратно в исходный массив значения checked каждого измененного чекбокса, чтобы вернуть этот массив в контроллер для обработки. Я понимаю, что по правилам хорошего тона, я должен был выложить на всеобщий суд мой код, но у меня по всем пунктам непонимание: 1. Какое событие у чекбокса: onchange или другое? 2. Как привязать это событие к конкретному экземпляру чекбокса, если id заранее неизвестен? Или я не рационально задал их id? 3. Ну а дальше без первых двух пунктов вообще пустота, которая заполнится вопросами после решения п. 1 и 2. |
Огонек,
В общем то для идентификации флажков (задание обработчика и т.п.) эти ID и не нужны по большому счету. А коли выбор флажков должен возвращаться серверу, то ему как раз важно знать какие флажки (идентификаторы) выбраны/сброшены. Исходя из того, что не выбранный флажок на сервер не будет передан, в качестве свойства value флажкам нужно как раз указывать их идентификаторы (id_order_state, если это и есть уникальные значения записей или т.п.). С установкой обработчиков проблем не будет, а вот с передачей их серверу, тут вопрос - если форма передается естественным образом, то сервер их не получит, поле без имени на сервер не передается, посредством Ajax можно. |
Цитата:
id="{$next_state.id_order_state}" на value="{$next_state.id_order_state}" ни на миллиметр не открыла для меня понимания способа решения задачи. А для передачи серверу я и хочу обновить массив с булевыми значениями |
Цитата:
Все остальное вторично и решается просто. |
Опережая: ответ на ваш вопрос очень сильно зависит от того, каким образом планируется обмен с сервером - обычная передача формы, передача формы асинхронным методом или каждое индивидуальное изменение флажка, это запрос сервера.
|
На последний пост - обычная передача формы
На предпоследний пост - вы, по сути, перефразировали мой 2 вопрос в первом посте и задали эти вопросы мне. Если вы таким образом хотели "подтолкнуть" меня к решению, то вот изменения, которые я внес: <table class="table"> <tbody> {assign var=ir value=0} {foreach $fields_value.array_next_state as $next_state} <tr> <td><input type="checkbox" id="my_check_{$ir++}" value="{$next_state.id_order_state}" {if $next_state.checked == 1}checked="checked"{/if}></td> <td>{$next_state.name}</td> </tr> {/foreach} </tbody> </table> Теперь каждый чек имеет id = my_check_(1,2,3,...) и value = id_order_state. А дальше что? |
Цитата:
Отправьте такую форму: <form> <input value="Hello!"> <button>Send</button> </form> По умолчанию форма передается методом GET, то есть ее передача будет отображена в адресной строке браузера. Что либо будет из формы в этой строке? И только если дадим имя полю, например name="as", тогда мы увидим в адресной строке ?as=Hello! Теперь встает вопрос как именовать флажки. Лучший способ, это (для РНР) именование их как элементы массива, например так: <input type="checkbox" name="check[]" value="{$next_state.id_order_state}" {if $next_state.checked == 1}checked="checked"{/if}> Идентификаторы выброшены за ненадобностью. Если передать форму с такими именованием флажков, то сервер получит массив в котором под ключом check будут его элементы - идентификаторы флажков, которые выбраны. Если ни один флажок не будет выбран, этого массива сервер не получит вообще, так как не выбранные флажки не передаются формой. Картина может измениться, если передавать серверу форму асинхронно, можно и отказать от имен, но это нецелесообразно, а вот если изменение каждого флажка порождает запрос на сервер, тут хватит и ID, а формы в общем-то и не требуется. |
Разобрался, спасибо, помогло.
|
Неа, поспешил радоваться:
Я поставил name="check[]" и проверил на первом по порядку флажке: на сервере в $_GET["check"] получил 1 и успокоился. А потом оказалось, что если я отмечаю любой один или несколько флажков, то сервер получает 1, если ни одного - то 0. |
Цитата:
Допустим таблица (tbl) содержит всего 5 записей (первое поле id, второе состояние set) со следующими состояниями: 12 1 24 0 17 0 19 1 85 1 В форму выводятся все пять записей, то есть флажки и их состояния, и кроме флажков других полей форма не имеет. Форма передается методом POST и в итоге будет такой: <form method="post"> <input name="check[]" value="12" checked type="checkbox"> <input name="check[]" value="24" type="checkbox"> <input name="check[]" value="17" type="checkbox"> <input name="check[]" value="19" checked type="checkbox"> <input name="check[]" value="85" checked type="checkbox"> <button>Send</button> </form> При передаче формы на сервер будут переданы только те флажки, которые установлены, поэтому "если я отмечаю любой один или несколько флажков, то сервер получает 1, если ни одного - то 0" быть никак не может. Если не меняя состояние флажков отправить форму, то на сервере будет $_POST массив: Код:
Array $sql = 'UPDATE tbl SET `set`=0'; Если есть выбор, то так: if($check = array_diff(array_map('intval', $_POST['check']), [0])) { print_r($check); //массив выбранных флажков } Теперь можно обновлять, но сначала нужно сбросить все, то есть установить 0 в поле set у всех записей, а затем в цикле установить 1 для выбранных: foreach($check as $id) { $sql = 'UPDATE tbl SET `set`=1 WHERE id='.$id; //запрос } Примечание: Если же иметь ввиду, что обновляется только одно поле, других полей обновляемых нет в вашей форме, то все можно решить одним запросом, без цикла: $sql = 'UPDATE tbl SET `set`=1 WHERE id IN('.implode(',', $check).')'; Но если из таблицы выбраны не все записи и форма содержит пусть три флажка для записей с id 24, 19, 85, и какие-то будут сброшены установлены, то обновить состояние этих записей, предварительно сбросив все состояние в таблице, уже нельзя. А для того, чтобы оперировать только теми записями, которые описывает форма, лишь два пути: 1) сервер хранит массив id=>"состояние" переданных клиенту флажков, а при приеме формы пересечениями массивов хранимого на сервере и полученного от формы формирует результирующий массив для обновления. 2) отказаться от полей типа checkbox и использовать поля типа radio, где группы из двух кнопок со значениями 0 и 1, и имеющий из них атрибут checked определяют состояние записи в базе. Если форму отправлять асинхронным методом, то набор значений "установить в 0/1", подобное с полями radio, можно сформировать даже если форма использует поля типа checkbox. |
Часовой пояс GMT +3, время: 08:38. |