ДВе формы регистрации на одной странице

ДВе формы регистрации на одной странице

form_id естественно разный. Набор полей разный и регулируется через alter.

При submit второй формы, всегда происходит validate первой формы! Как устранить эту проблему?

Комментарии

Через тотже форм алтер переопределить валидацию, изменив на свою функцию.

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

тогда и submit нужно переопределять, так как сохраняются данные с первой формы при submit второй

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

не очень хороший выход. Неужели никак по другому? По каким данным идёт анализ, что именно эта форма отправила данные?

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

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

Переопределите сабмит и валидацию, просто скопировав код этих функция с ядра друпала.

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

Иначе, как хороший выход, создайте свои формы, а не используйте готовые.

Но другие формы и существуют для того что бы их копировать и изменять под себя )))

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

колбэк общий конечно user_register(), вопрос в другом почему туда уходят данные с первой формы, хотя submit выполняется формы с иным form_id

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

определите для форм свой идентификатор.. например в $form_state['my_form_id'].. И при валидации и при сабмите производите действия, на основании этого идентификатора..

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

Скорее всего нужно переписать что-то еще. Выведите массив формы и посмотрите что там еще прописано. Может где-то стоит идентификатор, по которому колбэк функция определяет что эту форму тоже нужно обрабатывать.

Например всякие там: form_build_id и т.д.

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

Т.к. я недавно не копал этот процесс, то что именно отвечает за идентификатор в подобной ситуации подсказать не смогу.

Посмотрите функцию валидации и сабмита, может они вам подскажут.

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

в формах form_build_id разные, но первой формы: < input type= "hidden" value= "user_register" style="color: #ff0000;">"edit-user-register" name= "form_id" >

и второй < input type= "hidden" value= "user_register" style="color: #ff0000;">"edit-user-register-1" name= "form_id" >

Смущает что value одинаковый.

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

вызвал таким же образом две другие одинаковые формы - всё работает. происходит сабмит вызываемой.

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

главный параметр вроде "name"

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

чтоб не гадать.. код хука form_alter, чтоли, покажите.

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

Как оказалась, такая проблема только с формами user_register

Вот пример примитивного кода,

При сабмите второй формы, сабмитяться обе.

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

Я увидел где идет опередление при сабмите и валидации.

Посмотрите form.inc там есть строка в которой отлавливаются handler'ы. Там есть иерархия проверки от младшего к родителю. Попробуйте поменять родителя у второй формы.

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

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

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

Вот что я нарыл:

$form [ '#submit' ])) ?>

Вы клонируете форму и меняете у нее $form_id, и не переопределяете функцию сабмита, но есть параметр: "base_form_id". Потому друпал видит родителя и присваивает туже функцию сабмита что и у родителя.

Теперь, на чем основывается сабмит:

Если мы вспомним историю программирования, то раньше мы пользовались конструкцией:

Что делает друпал.. (пока теория, в практику лезть нет времени, оставляю это вам) Так вот, по моему мнению, друпал ставит хэндлер обработчик на загрузку страницы, отлавливает пост запрос и передает на выполнение или стандартной функции сабмита или переопределенной функции. Причем основным условием передачи является наличие в пост запросе данных:

form_id form_buil_id op .

Или чего-то из этого в отдельности. Или чего-то еще. Просто нет времени закончить анализ.

Потом, я предполагаю, друпал читает форму или из кэша или еще откуда-то. Смотрит какие переменные там определены и ищет их в ПОСТ запросе или в состоянии формы.

А у вас две одинаковые формы, (возможно дублированные названия полей - аргумент name), и конечно в момент сабмита абсолютно ВСЕ ФОРМЫ на странице передают ПОСТ, не важно какую из кнопок вы нажали для этого.

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

Если вам не лень, и вы не хотите переопределить функции валидации и сабмита - закончите анализ )))

📎📎📎📎📎📎📎📎📎📎