ДВе формы регистрации на одной странице
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), и конечно в момент сабмита абсолютно ВСЕ ФОРМЫ на странице передают ПОСТ, не важно какую из кнопок вы нажали для этого.
Причем обе ваши формы вызывают одинаковые функции валидации. И если происходит запуск валидации для одной формы то хэндлер видит что и вторую форму нужно тоже обработать.
Если вам не лень, и вы не хотите переопределить функции валидации и сабмита - закончите анализ )))