CakePHP добавляет данные формы при отправке

У меня есть страница, которая добавляет людей. У человека есть имя, дата рождения и т. д. У человека также может быть много телефонных номеров и много адресов (домашний и/или почтовый). На мой взгляд, у меня есть некоторый jQuery, который позволяет пользователю добавлять дополнительные номера телефонов и адреса в новую запись человека. Нет ограничений на количество, которое они могут добавить.

В настоящее время я делаю следующее: когда форма отправляется, jQuery берет все номера телефонов и адреса, преобразует их в JSON и вставляет в скрытое поле. В контроллере эти данные JSON затем преобразуются в массив PHP, а затем добавляются к остальным данным перед вызовом для них saveAll.

Мой вопрос: это лучший способ добиться этого? Есть ли способ отправить эти данные в контроллер, как и остальные данные формы, чтобы мне не нужно было ничего делать в контроллере, кроме вызова saveAll на нем?


person nuutrino    schedule 11.08.2014    source источник


Ответы (1)


да. Когда вы добавляете поля с помощью jQuery, вам просто нужно придерживаться соглашений об именах Cake.

Атрибут «имя» ваших полей ввода должен иметь форму:

data[ModelName][X][field_name]

где X — целое число, представляющее номер этой записи. Например. если у вас было 3 связанных адреса, каждый с полем line_1 и line_2, ваши сгенерированные поля должны выглядеть так:

<input type=​"text" name=​"data[Address]​[1]​[line_1]​" id=​"Address1Line1">​
<input type=​"text" name=​"data[Address]​[1]​[line_2]​" id=​"Address1Line2">​
<input type=​"text" name=​"data[Address]​[2]​[line_1]​" id=​"Address2Line1">​
<input type=​"text" name=​"data[Address]​[2]​[line_2]​" id=​"Address2Line2">​
<input type=​"text" name=​"data[Address]​[3]​[line_1]​" id=​"Address3Line1">​
<input type=​"text" name=​"data[Address]​[3]​[line_2]​" id=​"Address3Line2">​

Обратите внимание, что X не является идентификатором или чем-то еще — это просто число, используемое для различия между разными записями, когда их несколько из одной и той же модели.

Если вы придерживаетесь соглашений Cake, Cake просто обрабатывает их автоматически в контроллере.

person joshua.paling    schedule 11.08.2014
comment
Спасибо за ответ. Я думал об этом. Моя настройка для адресов, например, представляет собой единый набор полей, который добавляет адрес в таблицу на странице добавления человека. Вместо создания нового набора полей каждый раз, когда пользователь хочет добавить другой адрес. Мне пришло в голову создать набор скрытых полей для этих новых адресов, которые были добавлены в таблицу, которая затем будет добавлена ​​к данным сообщения, однако я решил, что будет проще управлять и более элегантно просто использовать JSON в скрытое поле. Я надеялся каким-то образом внедрить эти данные JSON в данные формы. - person nuutrino; 12.08.2014
comment
В этом случае похоже, что то, как вы это делаете, просто прекрасно. - person joshua.paling; 12.08.2014
comment
На самом деле я подумал о вашем предложении, и теперь я считаю, что это правильный путь. Добавляя набор скрытых полей в строку таблицы, содержащую отправляемые данные, я значительно сокращаю накладные расходы jQuery и JSON. Особенно, когда речь идет о создании, обновлении и удалении строк. Это также означает, что торт делает свое дело и добавляет данные без моих прыжков через несколько обручей. Еще раз спасибо за ответ, он дал мне автоматический выключатель, который мне нужен. - person nuutrino; 12.08.2014