Как создать массив группы элементов внутри формы HTML - PullRequest
2 голосов
/ 04 ноября 2010

Я пытаюсь создать форму в соответствии со следующим (я знаю, что это недопустимый HTML, но, надеюсь, это иллюстрирует, что и почему я пытаюсь это сделать):

<form method="post" action="test.php">
    <input type="text" name="teamName">
    <br />Players:
    <grouping name="players[]">
        <input type="text" name="firstName"><br />
        <input type="text" name="lastName"><br />
    </grouping>
    <input type="submit" value="submit">
</form>

Через javascript я бы добавил элемент группировки столько раз, сколько необходимо. Когда форма будет отправлена, я смогу получить доступ к элементам элемента группировки следующим образом:

foreach ($players as $player) {
    $fName = $player->firstName;
    $lName = $player->lastName;
}

То есть, прежде чем я начну, я не знаю, сколько игроков будет в команде, но я знаю, как выглядит игрок. Я хочу, чтобы все это отображалось на одном экране, чтобы пользователь мог добавлять игроков в свою команду на одной странице, и я хочу иметь возможность добавлять группировку полей в группу. Однако я также хотел бы, чтобы эта группировка сохранялась как массив, а не выполняла что-то вроде:

<form method="post" action="test.php">
    <input type="text" name="teamName">
    <br />Players:
    <input type="text" name="firstName[]"><br />
    <input type="text" name="lastName[]"><br />
    <input type="submit" value="submit">
</form>

, что означало бы, что я мог бы перебирать отдельные элементы в группе, но не через группу в целом.

Есть идеи, как мне это сделать?

Ответы [ 3 ]

9 голосов
/ 04 ноября 2010

Однако, глядя на вашу структуру, я бы порекомендовал перейти к более надежной структуре массива:

foreach ($players as $i => $player) {
    $fName = $player->firstName;
    $lName = $player->lastName;

    echo '<input type="text" name="players['.$i.'][firstName]" value="'.$fName.'" />';
    echo '<input type="text" name="players['.$i.'][lastName]" value="'.$lName .'" />';

}

Когда вы отправите это, вы получите:

players => Array(
  [0] => Array (
    firstName => a name,
    lastName => another name,
  ),
  [1] => Array (
    firstName => a name,
    lastName => another name,
  ),
etc...
)

В качестве альтернативы, вместо генерации $ i в операторе foreach, вы можете сделать приращение $ i ++ в последнем поле ввода, но я считаю, что для целей отладки часто приятно знать, какой индекс вы используете из исходного массива. *

Я рекомендую этот подход на примере вашего вопроса, так как он также позволяет вам подсчитывать / перебирать $ _POST ['Players']

Надеюсь, это поможет

3 голосов
/ 05 ноября 2010

Это звучит как работа для: <fieldset>

оберните ваши элементы <input> в элемент <fieldset> и, возможно, дайте fieldset ID, некоторые классы или что угодно.

затем убедитесь, что входные имена используют правильную структуру массива:

players[NUMBER][firstName] и players[NUMBER][lastName] должны работать нормально (NUMBER, конечно, заменяется индексом).

Не забудьте дать вашим <input> элементам <label> для доступности. Давать <fieldset> a <legend> также хорошая идея.

0 голосов
/ 04 ноября 2010

Множество способов решить эту проблему:

1) создать счетчик $i = 0 вне вашего цикла и внутри него сделать $i++.Вместо именования firstName[] используйте firstName[<?php echo $i; ?>]

2) Если это буквально просто имя и второе имя - вы можете использовать один <input> и затем проанализировать его в php.

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...