Как PHP может определить, нажал ли пользователь клавишу Enter или кнопку Submit? - PullRequest
4 голосов
/ 28 апреля 2009

Проблема, с которой я столкнулся, заключается в том, что у меня есть несколько отправленных входных данных в одной форме. Каждый из этих входных данных имеет свое значение, и я бы предпочел сохранить их как отправленные.

Всякий раз, когда пользователь нажимает ввод, создается впечатление, будто нажимается самый верхний ввод отправки, и поэтому возникают проблемы с проверкой кода, по которому ввод был нажат

Есть ли способ для PHP определить, был ли выбран ввод или нет, или это был только ввод, который был выбран, когда пользователь нажал клавишу Enter?

Ответы [ 5 ]

11 голосов
/ 28 апреля 2009

Вы можете определить, какая кнопка была использована, если вы правильно структурировали свой HTML

<input type="submit" name="action" value="Edit">
<input type="submit" name="action" value="Preview">
<input type="submit" name="action" value="Post">

Массив $_POST (или $_GET/$_REQUEST) будет содержать ключ "action" со значением введенной кнопки (независимо от того, нажата она или нет).

Теперь «щелчок» явно является поведением на стороне клиента - если вы хотите провести различие между щелчком и нажатием клавиши, вам нужно добавить некоторые скрипты в форму, чтобы помочь в этом определении.

Редактировать

В качестве альтернативы, вы можете быть «хитрым» и использовать скрытую отправку, которая должна правильно определять нажатие клавиши для отправки, но это, вероятно, оказывает существенное влияние на доступность.

<code><?php

if ( 'POST' == $_SERVER['REQUEST_METHOD'] )
{
    echo '<pre>';
    print_r( $_POST );
    echo '
'; } ?>
5 голосов
/ 28 апреля 2009

Роберто,

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

Один из способов сделать это - использовать Javascript в вашем клиентском коде.

См. Эту страницу как отправную точку для обработки событий отправки формы с использованием Javascript. http://www.w3schools.com/jsref/jsref_onSubmit.asp

Вам также может понадобиться добавить прослушиватель событий нажатия клавиш на вашей странице, чтобы захватить пользователя, нажав клавишу Enter, а затем записав эту информацию. http://www.howtocreate.co.uk/tutorials/javascript/domevents предлагает обсуждение темы добавления / удаления прослушивателей событий в Javascript, но вы должны быть очень осторожны при использовании событий, потому что при неправильном использовании они могут быть источником утечек памяти, которые трудно отлаживать и приводят к несчастным пользователи:)

2 голосов
/ 28 апреля 2009

Только PHP не может определить, как было инициировано событие отправки формы, потому что это происходит на стороне клиента, в то время как PHP является языком на стороне сервера. Вам нужно будет реализовать Javascript для прослушивания и регистрации на стороне сервера нажатий клавиш и щелчков мыши, а затем анализировать эти данные, чтобы найти то, что вы ищете.

Теперь PHP может сказать , какой отправленный ввод был инициирован, так как он будет отображаться в данных формы, в то время как другие не будут. Большинство браузеров делают первый ввод вводом по умолчанию (тот, который запускается при нажатии клавиши Enter ). Вы можете изменить порядок всех своих отправлений, чтобы определить, какая отправка инициирована.

1 голос
/ 28 апреля 2009

PHP не может действительно знать, что произошло на стороне клиента.

Я бы рекомендовал использовать JavaScript. Когда пользователь выполнит действие, перехватите его и сохраните в скрытом поле, которое будет отправлено с формой. Вы также можете отслеживать, какой вход активен, и сохранять его в скрытом поле.

Код будет выглядеть примерно так (я не проверял синтаксис)

<input type="text" onfocus="setCurrent(this)" id="1" />
<input type="hidden" id="hid" />

function setCurrent(o){
  $('hid').value = o.id;
}

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

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

0 голосов
/ 28 апреля 2009

Это то, как вы пишете разметку на стороне клиента.

Например, вот один (не XHTML) способ сделать это:

В файле HTML:

<form method="post" action="myform.php" id="myform">
  ... form items here ...

<input type="submit" name="enter_key" value="true" style="display:none">
<input type="hidden" name="pressed_button" id="pressed_button" value="false">
<input type="button" value="Submit"
  onclick="document.getElementById('pressed_button').value='true';document.getElementById('myform').submit();">
</form>

В myform.php:

if ($_POST['pressed_button']=='false') {
   // Logic for enter key
} else {
   // Logic for button press
}
...