Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 14.07.2015, 08:39
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Да, само собой имена всех инпутов должны быть заточены под передачу массивом, то есть кончаться на []
Ответить с цитированием
  #12 (permalink)  
Старый 14.07.2015, 13:23
Аватар для Leon-on12
Аспирант
Отправить личное сообщение для Leon-on12 Посмотреть профиль Найти все сообщения от Leon-on12
 
Регистрация: 07.04.2015
Сообщений: 65

Сообщение от Эдди Посмотреть сообщение
Надо ли изменять эти функции или просто в них добавить вышеуказанный цикл?

Так как вы копируете целую строку таблицы, крутить безумное решение о том что-бы скрипт находил все id в таблице и добавлял или изменял их, бессмысленно.
Вопрос такой, не возникают ли у вас проблемы с name в чекбоксах.
Потому как при клонировании, 2 строчки с чеками будут работать как единый механизм не давая выбрать 2 элемента в этих двух строчках.

При вашем способе клонирования и подобном скрипте клонирования, переписывать скрипт клонирования не имеет смысла.
Ответить с цитированием
  #13 (permalink)  
Старый 14.07.2015, 13:42
Профессор
Отправить личное сообщение для Эдди Посмотреть профиль Найти все сообщения от Эдди
 
Регистрация: 19.06.2010
Сообщений: 279

Если интересно, объясняю.

На самом дело идет об админке на сайте.
Менеджер должен ввести цены на отель.
Отель имеет основной тип размещения - одноместный, двухместный и пр.
Это одна таблица htl_cost_types.
Еще есть дополнительный тип размещения - стандарт, делюкс, супериор и пр.
Это другая таблица htl_room_types.
То есть одноместный может быть как стандарт, так и супериор и т.д.
А может и вообще не иметь дополнительного типа. Просто - одноместный, двухместный и т.д.
Цены хранятся в третьей таблице, которая имеет, в частности, поля: htl_cost_type_id и htl_room_type_id.

Так вот. На страницу выводятся в таблице ВСЕ основные типы размещения с соответствующими чекбоксами, и в той же строке есть селект для выбора дополнительного типа, в котором присутствуют все доп. типы.

В этой же строке кнопки "+" и "-". Добавить строку или удалить.

К примеру менеджеру нужно ввести тип DBL и еще раз DBL, но уже с типом супериор.
Он копирует (вернее клонирует) строку DBL и в клонированной строке в селекте выбирает доп. тип "супериор".

В итоге вся проблема в том, что $_POST передает ВСЕ селекты, которые даже имеют value="", но не передает чекбоксы, которые непомеченные.

В итоге для сохранения данных в таблице цен пары "основной" и "дополнительный" тип размещения не совпадают, поскольку передаваемые ПОСТ массивы имеют разные ключи.

Чтобы ключи совпадали, мне надо передать в скрипт ВСЕ, даже пустые значения чекбоксов. Для этого вставляю дополнительный input Hidden value="" с тем же name.

Но теперь массив дополнительных типов бодет больше основных, поскольку при добавлении строки массив доп. типов включит и новый Hidden.

Именно поэтому мне нужны уникальные id, чтобы при пометке чекбокса спрятать соответствующий ему Hidden (style="display: none")

Сумбурно объяснил, но как сумел.

Может, это и криво, но я вижу только такой вариант.

Второй вариант, который был бы более простым - сделать так, чтобы непомеченный select (Ну, в первом option которого, скажем, выводится --- НЕТ ---, не передавался в скрипт. Тогда всю остальную мутотень можно и выкинуть на фиг.
Но лично я не представляю, как это сделать.
Вот и пришлось мудрить...

Последний раз редактировалось Эдди, 14.07.2015 в 13:45.
Ответить с цитированием
  #14 (permalink)  
Старый 14.07.2015, 14:27
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Эдди
В этой же строке кнопки "+" и "-". Добавить строку или удалить.
Этого было бы достаточно, чтобы понять цель. А если Добавить, то клонирование существующих полей формы не годится. Нужно добавлять "чистые поля", и все, которые необходимы для добавления новых данных. И не значение id нужно увеличивать, а индексы полей или же в случае, если дынные привязываются какому либо идентификатору, то копировать в новые добавляемые поля эти идентификаторы, в случае же добавления новых записей, то временный идентификатор, диапазон которого зависит от максимального значения первичного ключа.

Попробуйте написать если и не универсальное на все случаи, но хотя бы в рамках этого администрирования, если вставка нужна не только для данной задачи. А делать это лучше так, например, пусть сам тег формы или иной удобный родитель содержит html-код вставки. Не времени все подробно пояснять, поэтому кратко:

1) html-код вставки - описывает полностью структуру "строки" в форме в которая добавляется, а не только поля формы. То есть, например, если элементы формы находятся в ячейках таблицы, то вставляемый код будет: <tr><td><input name="name(k1:)[]"></td>td><input name="name(k2:)[]"></td>...</td>.

2) :k1:, :k2:,... условно значения имен, ключей и т.п., которые после вставки нужно заменить значениями.

3) кнопка добавления новой строки в атрибутах data должна описывать замещаемые значения и значения на которые они будут замещены. Например, data-rem=":k1:,name1/:k2,<?=$id?>:",...
Подобным образом задаются любые иные параметры, которые необходимо изменять, добавлять или же передавать как значения в функцию, как и содержать ссылки на функции, которые нужно выполнить, если нельзя написать универсально для любой вставки, и требуется выполнение неких специфичных функций.

4) если имена привязываются к первичному ключу/ключам, это означает, на значение сверху наложен лимит. Поэтому вставка должна иметь счетчик, значения которого используются при вставке, и ссылка на счетчик указана в data-rem.

5) html-код вставки храниться также в атрибуте data-ins, а кнопка "Добавить" имеет ссылку на этот атрибут, по ins. то есть вставляемых "html_вариаций" может быть сколь угодно, как и кнопок добавления, каждая из которых будет добавлять свой html-код. При чем вставляемый html-код также может иметь кнопку "Добавить" - добавление внутри добавляемого.

6) кнопка "Добавить" также должна иметь атрибут содержащий указатель родительского элемента в который вставляется код. В примере с таблицей, это будет например, data-prt="table".

7) вставляемый код содержит кнопку "Удалить" содержащую указатель на удаляемого родителя, для пример это будет data-prt="tr".

Непосредственно спрятать в атрибут data html-код не получиться, поэтому можно прибегнуть к base64, но лучше url кодирование, значения будут короче. То есть типа <form data-ins="<?=rawurlencode(вставляемый html-код)?>", а на клиенте в обработчике кнопки "Добавить" получать его - decodeURIComponent(this.getAttribute("data-ins")). Если все обдумать, то единый обработчик будет добавлять любой html-код на страницу, параметры которого описаны в атрибутах.
Ответить с цитированием
  #15 (permalink)  
Старый 14.07.2015, 14:54
Профессор
Отправить личное сообщение для Эдди Посмотреть профиль Найти все сообщения от Эдди
 
Регистрация: 19.06.2010
Сообщений: 279

Laimas. Интересно. Но я сейчас добью первый вариант из принципа. Если будет ок, то пусть уже менеджеры начнут работать. А потом спокойно разберусь с Вашим вариантом. Если он будет проще и правильнее - заменить - как два пальца
Ответить с цитированием
  #16 (permalink)  
Старый 14.07.2015, 15:12
Профессор
Отправить личное сообщение для Эдди Посмотреть профиль Найти все сообщения от Эдди
 
Регистрация: 19.06.2010
Сообщений: 279

Есть еще один вариант. Простейший. Но самый тупой Вообще без скриптов.
Вывести все основные типы размешения и рядом все доп.типы.
Если учесть, что основных типов штук 100, а дополн тельных штук 50, то получим таблицу в 5000 строк А если еще учесть, что из них в каждом отеле надо выбрать в среднем 3-5, то у менеджера это займет кучу времени. Потому и заморочился...
Ответить с цитированием
  #17 (permalink)  
Старый 14.07.2015, 16:37
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Если добавление в данном, это частный и единственный случай, делайте ajax запрос и получайте html-код вставки от сервера, или пропишите его в каком либо скрытом элементе на странице. Это же не проблематично. А вот плодить лишнее "кашу маслом не испортишь", так это не только проблемы на клиенте для менеджера, но и обработка пустого и не нужного на сервере.
Ответить с цитированием
  #18 (permalink)  
Старый 14.07.2015, 18:59
Профессор
Отправить личное сообщение для Эдди Посмотреть профиль Найти все сообщения от Эдди
 
Регистрация: 19.06.2010
Сообщений: 279

Сообщение от laimas Посмотреть сообщение
Если добавление в данном, это частный и единственный случай, делайте ajax запрос и получайте html-код вставки от сервера, или пропишите его в каком либо скрытом элементе на странице. Это же не проблематично. А вот плодить лишнее "кашу маслом не испортишь", так это не только проблемы на клиенте для менеджера, но и обработка пустого и не нужного на сервере.
Согласен, что плодить лишнего не надо.
Если бы речь шла о конечном пользователе, то я бы вылизал все, что можно.
А работники - им главное чтобы ввести данные.
К сожалению, со вчерашнего дня не смог работать. С завтрашего утра начну.
Там посмотрим, чья правда.

Кстати. В данном случае про аякс не понял. Что я должен от него получить?
У отеля нет вообще никаких данных в БД. Какой php скрипт мне что выдаст?
Я только собираюсь забить в БД данные и выбираю, какие. Упс.
Получить данные об основных и дополнительных типах размещения?
Да они у меня вот уже есть. Бес всякого аякса. Простым sql запросом.

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

Сообщение от Эдди
У отеля нет вообще никаких данных в БД.
То есть даже не знаем и структуры данных, а форма для их приема тоже нечто абстрактное? Ответ сервера, это не обязательно данные из базы.
Ответить с цитированием
  #20 (permalink)  
Старый 14.07.2015, 21:46
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от Эдди
В итоге вся проблема в том, что $_POST передает ВСЕ селекты, которые даже имеют value="", но не передает чекбоксы, которые непомеченные.

Это потому что у вас там колхоз. Вы даже слова такого не знаете - datagrid - которую вы и делаете. В качестве годного примера - phpMyAdmin видели? - это datagrid в основе. Само собой термин тянется небось с микрософта, я не проверял, но так все кто пишет называют эту интерактивную таблицу.

Теперь про колхоз. Пустые чекбоксы не successful элементы и конечно не приходят с браузера на сервер вообще. Что никак не мешает опознать отсутствие по наличию модели. Скрипт обработки данных "знает" что должно быть и если его нет - ставит не выбрано, null, 0, или значение по умолчанию.

Еще про колхоз. Размножать инпуты вообще не обязательно. Их можно подставлять по координатам выбранной строки - как в том самом PMA и делается и делается это в общем-то довольно просто. Как тогда отгружать? Ну либо сразу аяксом - по кнопке сохранить или какому-то явному событию, или собирать все добавленные и обновленные данные в json и отгружать через одно текстовое поле, на сервере декодировать и с колес юзать без мороки с постами всякими там.

Последний раз редактировалось kostyanet, 14.07.2015 в 21:51.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сменить название класса у всех элементов AlexJ Events/DOM/Window 4 23.05.2012 09:33
Как изменить свойство css у всех элементов одного класса AlexJ Events/DOM/Window 7 19.03.2011 06:25
Как изменить background всех дочерних элементов внутри <div>? libinstyle Общие вопросы Javascript 2 24.03.2010 13:25
как записать id всех элементов в массив? SunYang Общие вопросы Javascript 21 06.02.2010 22:50
Как снять фокус со всех элементов? Logo Общие вопросы Javascript 7 02.07.2009 23:53