#php #javascript #forms
#php #javascript #формы
Вопрос:
Я изменяю компонент формы, который является частью веб-приложения, для поддержки пользователей, добавляющих и удаляющих дополнительные поля формы во время выполнения.
Данные из формы устанавливаются в объект php при отправке формы:
<?php
class users {
public function setName($name){
(...)
}
public function getName(){
(...)
}
public function setSomeAttribute($name){
(...)
}
public function getSomeAttribute(){
(...)
}
}
Форма создается следующим образом:
$form = new Form();
$form->addField('Text', 'Name', (... some other parameters...))
->addField('Address', 'SomeAttribute', (... some other parameters...));
Создается представление, содержащее дерево объектов, представляющих каждое поле (некоторые «поля», такие как адреса, могут содержать дочерние поля, такие как текстовые вводы.
Учитывая, что мы знаем имя свойства объекта, компонент формы может затем легко привязать результат этого поля формы к соответствующему свойству объекта, используя геттеры и сеттеры.
Проблема, с которой я сталкиваюсь сейчас, заключается в следующем: мне нужно разрешить пользователю добавлять поля во время выполнения. Это будет работать с использованием Jquery, а также для пользователей без javascript.
Предположим, у нас есть страница, на которой пользователь может редактировать свой профиль и добавлять несколько адресов доставки. У него будет кнопка с надписью «добавить адрес». Нажатие этой кнопки приведет к следующему:
- Для пользователей с включенным javascript пользователь сразу увидит новое «поле адреса», которое состоит из нескольких выпадающих списков и добавленных текстовых полей.
- Для пользователей без включенного javascript страница обновится, и будет добавлено новое «поле адреса», состоящее из нескольких выпадающих списков и текстовых полей.
Каков наилучший способ сообщить стороне PHP, что эти новые поля существуют, и нам нужно получить из них опубликованные данные?
Ответ №1:
все элементы формы будут отправлены в запросе и доступны для PHP. поэтому вам просто нужно ссылаться на элементы, используя любое имя, которое было присвоено элементам в форме.
для страны для 2 адресов вы хотели бы назвать элементы типа «addr_1_country», «addr_2_country» или поочередно «addr_country []», чтобы оба значения были доступны в массиве. если вы используете первое, вы можете перебирать имена «addr_ $ i_country», пока не обнаружите, что они не установлены (или получить jQuery для обновления значения count, которое также отправляется, например, «addr_count», который сообщает вам, как долго нужно выполнять цикл).
в любом случае вам просто нужно знать имена. но если вы можете указать только «Адреса» и / или дочерним полям присваиваются имена, которые вы не можете назначить самостоятельно, тогда у вас может возникнуть проблема. возможно, ваш «-> addField ()» достаточно умен, чтобы назвать их для вас. в противном случае обновите «Форму» на имя автоматически или примите аргументы «имя».
Ответ №2:
В любом случае, ваша форма при отправке заполнит массив в $_REQUEST (который является $ _GET и $ _POST) со всеми полями формы и их необходимыми значениями. У вас может быть функция установки, которая принимает этот массив, находит что-то новое и динамически устанавливает их.
Я предполагаю, что у вас есть заданное количество новых полей, вы можете просто предварительно создать для них геттеры и сеттеры и выполнить цикл через $_REQUEST при отправке на стороне php и вызвать сеттеры для соответствующего поля.
foreach ($_REQUEST[] as $field){ // IF STATEMENT TO DETERMINE WHAT FIELD THIS IS BASED ON FIELD NAME }