Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.07.2017, 11:58
Аспирант
Отправить личное сообщение для Огонек Посмотреть профиль Найти все сообщения от Огонек
 
Регистрация: 11.06.2017
Сообщений: 45

Поиск объекта по неизвестному 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.
Ответить с цитированием
  #2 (permalink)  
Старый 22.07.2017, 12:11
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Огонек,
В общем то для идентификации флажков (задание обработчика и т.п.) эти ID и не нужны по большому счету. А коли выбор флажков должен возвращаться серверу, то ему как раз важно знать какие флажки (идентификаторы) выбраны/сброшены. Исходя из того, что не выбранный флажок на сервер не будет передан, в качестве свойства value флажкам нужно как раз указывать их идентификаторы (id_order_state, если это и есть уникальные значения записей или т.п.).

С установкой обработчиков проблем не будет, а вот с передачей их серверу, тут вопрос - если форма передается естественным образом, то сервер их не получит, поле без имени на сервер не передается, посредством Ajax можно.
Ответить с цитированием
  #3 (permalink)  
Старый 22.07.2017, 12:18
Аспирант
Отправить личное сообщение для Огонек Посмотреть профиль Найти все сообщения от Огонек
 
Регистрация: 11.06.2017
Сообщений: 45

Цитата:
laimas
Спасибо за участие, но замена
id="{$next_state.id_order_state}"

на
value="{$next_state.id_order_state}"

ни на миллиметр не открыла для меня понимания способа решения задачи.
А для передачи серверу я и хочу обновить массив с булевыми значениями
Ответить с цитированием
  #4 (permalink)  
Старый 22.07.2017, 12:31
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Огонек
А для передачи серверу я и хочу обновить массив с булевыми значениями
Вот это первично в задаче, но возникает вопрос - как вы это сможете сделать, если ваши поля формы (флажки): а) не имеют имен; б) неизвестно какой флажок какой записи принадлежит.

Все остальное вторично и решается просто.
Ответить с цитированием
  #5 (permalink)  
Старый 22.07.2017, 12:44
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Опережая: ответ на ваш вопрос очень сильно зависит от того, каким образом планируется обмен с сервером - обычная передача формы, передача формы асинхронным методом или каждое индивидуальное изменение флажка, это запрос сервера.
Ответить с цитированием
  #6 (permalink)  
Старый 22.07.2017, 13:00
Аспирант
Отправить личное сообщение для Огонек Посмотреть профиль Найти все сообщения от Огонек
 
Регистрация: 11.06.2017
Сообщений: 45

На последний пост - обычная передача формы
На предпоследний пост - вы, по сути, перефразировали мой 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.
А дальше что?

Последний раз редактировалось Огонек, 22.07.2017 в 13:03.
Ответить с цитированием
  #7 (permalink)  
Старый 22.07.2017, 13:24
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Огонек
Если вы таким образом хотели "подтолкнуть" меня к решению
Я ничего не пытаюсь, а ваша задача пояснять, что требуется. Я ведь упоминал об именах, где черным по белому было написано: поля формы не имеющие имен на сервер не передаются. А вы даже это и во внимание не приняли, каким же образом вы хотите их получить на сервере, флажки свои?

Отправьте такую форму:

<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, а формы в общем-то и не требуется.

Последний раз редактировалось laimas, 22.07.2017 в 13:27.
Ответить с цитированием
  #8 (permalink)  
Старый 22.07.2017, 13:41
Аспирант
Отправить личное сообщение для Огонек Посмотреть профиль Найти все сообщения от Огонек
 
Регистрация: 11.06.2017
Сообщений: 45

Разобрался, спасибо, помогло.
Ответить с цитированием
  #9 (permalink)  
Старый 22.07.2017, 20:36
Аспирант
Отправить личное сообщение для Огонек Посмотреть профиль Найти все сообщения от Огонек
 
Регистрация: 11.06.2017
Сообщений: 45

Неа, поспешил радоваться:
Я поставил name="check[]" и проверил на первом по порядку флажке:
на сервере в $_GET["check"] получил 1 и успокоился.
А потом оказалось, что если я отмечаю любой один или несколько флажков, то сервер получает 1, если ни одного - то 0.
Ответить с цитированием
  #10 (permalink)  
Старый 23.07.2017, 04:05
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Огонек
Неа, поспешил радоваться
А я был уверен на 99%, что return в тему будет, а все потому, что рассуждения ваши не с нужного начинаются. Обновление состояния поля в таблице будут определять все: сколько и как, что в итоге определит какими элементами будет удобнее представить флажки в форме. Я тоже не знаю всей конкретики задачи, я могу только предполагать и исходить из общих условий. Поэтому будет написано по-примерно.

Допустим таблица (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
(
    [check] => Array
        (
            [0] => 12
            [1] => 19
            [2] => 85
        )

)
Если сбросить все и отправить форму, то массив $_POST будет пуст. О каких 1 и 0 идет речь? Если проверка массива показала, что он пуст, а мы знаем, что сброшенные флажки не передаются, значит мы знаем, что пользователь сбросил все, а значит всем записям состояние нужно изменить на 0:

$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.

Последний раз редактировалось laimas, 23.07.2017 в 07:31.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При вызове локальной функции объекта не могу использовать свойства объекта Gudsaf Общие вопросы Javascript 7 17.09.2016 20:23
Canvas. Как сделать или вообще нельзя? Вращение рандомизированно изменяемого объекта. Zemsky Общие вопросы Javascript 30 19.12.2013 19:44
Скрипт вычисления координат объекта banderasantonio197555 Events/DOM/Window 4 16.08.2011 17:37
Поиск в тексте javascript jQuery 3 31.05.2011 11:40
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00