Drupal 7 drupal_set_message после сабмита формы

Главные вкладки

Аватар пользователя anzebra anzebra 21 декабря 2011 в 15:18

Доброго времени суток!

При сабмите пользовательской формы drupal_set_message отрабатывает, а при сабмите формы регистрации не выводится сообщение из drupal_set_message.
В чем может быть соль?

Всем спасибо за внимание и ответы Smile

Комментарии

Аватар пользователя OldWarrior OldWarrior 21 декабря 2011 в 20:45

"anzebra" wrote:
при сабмите формы регистрации не выводится сообщение из drupal_set_message.
В чем может быть соль?

Возможно, form['#redirect'] ?

А вообще - откуда (из какой процедуры) вызываете drupal_set_message ? (validate, submit, etc...)?

Аватар пользователя anzebra anzebra 22 декабря 2011 в 12:13

но, я же не использую drupal_goto ... или фишка в том что в форме в actions задан один урл, обработчик сабмита ф-я и в ней указан drupal_set_message и $form_state['redirec'] = '', а message хочет выводится на странице указанной в actions....

"бред по модулю"

Аватар пользователя OldWarrior OldWarrior 22 декабря 2011 в 18:24

"anzebra" wrote:
.. или фишка в том что в форме в actions задан один урл, обработчик сабмита ф-я и в ней указан drupal_set_message и $form_state['redirec'] = '', а message хочет выводится на странице указанной в actions...

Ну да, об этом и речь. Ну, как возможная причина.

Попробуйте установить $form['#redirect'] = FALSE в функции конструктора формы.

Аватар пользователя OldWarrior OldWarrior 22 декабря 2011 в 20:32

И всё же мне кажется, что RxB ближе всех к истине.
Форма регистрации же вроде не отображается для залогиненных пользователей. Только как форма редактирования данных пользователя.

anzebra, если нужно всего лишь вывести состояние каких-то переменных, то в случае с сабмитом формы регистрации просто воспользоваться print $some_my_data;

Аватар пользователя anzebra anzebra 23 декабря 2011 в 16:17

посмотрю что там с правами для юзера....но я вроде не замечала .... что то типа "отображение drupal_set_message" .... если такое и реализовано, то не понимаю зачем

Аватар пользователя anzebra anzebra 23 декабря 2011 в 16:22

"OldWarrior" wrote:

Самое интересное что я уже практически не трогаю лично своими руками форму регистрации, только модуль User registration password(для отображения полей ввода пароля), а мессаги ... нехорошие.

Аватар пользователя anzebra anzebra 23 декабря 2011 в 16:51

"RxB" wrote:

Монитор только протереть не предлагают.
Юзера нулевого смотрите

А что значит Юзера нулевого посмотреть??? Как?

И кстати если кто-то скажет что $messages в темплейте не выводится, посмотрела много раз ... есть

Аватар пользователя anzebra anzebra 23 декабря 2011 в 17:49

В результате экспериментов и ковырялок в ядре обнаружено: что если в модуле user.modue написать $form['redirect'] = FALSE,

<?php
function user_register_submit($form, &$form_state) {
....
  
// Administrator approval required.
  
else {
    
_user_mail_notify('register_pending_approval'$account);
    
drupal_set_message(t('Thank you for applying for an account. Your account is currently pending approval by the site administrator.<br />In the meantime, a welcome message with further instructions has been sent to your e-mail address.'));
    
$form_state['redirect'] = false//руками нацарапали!
  
}
}
?>

тогда мессага есть.

У кого есть какие идеи как это сделать на основе хуки или в чем причина, хотя редирект фальсе, тоже не выход...

Аватар пользователя anzebra anzebra 23 декабря 2011 в 18:33

А сейчас вообще интересно.

В abpcoretheme_form_user_register_form_alter добавила дополнительный обработчик сабмита - usr_regstr_sbm().
В usr_regstr_sbm() написала

<?php
             $form_state
['redirect'] = false;
 
?>

Сообщение вернулось...но редирект тоже нужен.

Аватар пользователя OldWarrior OldWarrior 23 декабря 2011 в 22:03

"anzebra" wrote:
У кого есть какие идеи как это сделать на основе хуки или в чем причина, хотя редирект фальсе, тоже не выход...

Где-то читал, что $form[#redirect] вроде как имеет приоритет над $form_state['redirect'].

И ещё, как вариант, можно как-то так:
сделать редирект на собственный адрес после удачного сабмита, в которой и выводить drupal_set_message('...конгратс, чувак.... Ты успешно бла..бла..бла..', 'status');

То есть установить form_state['redirect'] на другой (отличный) адрес. Соответственно и создать процедуру вывода страницы в hook_menu.

Аватар пользователя anzebra anzebra 26 декабря 2011 в 12:13

"OldWarrior" wrote:
И ещё, как вариант, можно как-то так:
сделать редирект на собственный адрес после удачного сабмита, в которой и выводить drupal_set_message('...конгратс, чувак.... Ты успешно бла..бла..бла..', 'status');

То есть установить form_state['redirect'] на другой (отличный) адрес. Соответственно и создать процедуру вывода страницы в hook_menu.

Так и делаю но не работает

Аватар пользователя anzebra anzebra 26 декабря 2011 в 12:30

Добавила 0 юзера, после регистрации появился зелёный message но почему то без текста, а если нажать f5, то вот такой error:

Notice: Undefined offset: 0 в функции theme_status_messages() (строка 1348 в файле /home/logistautoru/data/www/anzebra.logistauto.ru/logistauto/includes/theme.inc).
Аватар пользователя OldWarrior OldWarrior 26 декабря 2011 в 22:46

"RxB" wrote:
Тогда слушайте спецов дальше, ога

Можешь рассказать в чём дело?
Ну пожалуйста, не томи. Wink

А то прям какой-то загадочный user 0 получился.
Типа мифического персонажа.

Аватар пользователя deb deb 27 декабря 2011 в 20:27

Соовщения drupal_set_message() хранятся в сессии. Друпал имеет свой обработчик сессий, все данные о сессиях хранятся в БД. Если в таблице {users} нет записи для uid = 0, то для анонимов не получится загрузить сессию. Но почему у кого-то эта запись для uid = 0 пропадает, для меня загадка.

Аватар пользователя OldWarrior OldWarrior 27 декабря 2011 в 0:36

anzebra
Вот здесь ещё кое-что нашлось:
http://drupal.org/node/264132

В общем, судя по всему, помимо создания пользователя user 0 нужно ещё и установить ему роль. В примере по ссылке выше ему привязывается роль анонима (1).

<?php
INSERT INTO users 
(uidnamemailVALUES ('0''''');
INSERT INTO users_roles (uidridVALUES (01);
?>

В общем, нужно просто любым способом добавить новую запись в таблицу users_roles (с uid = 0 и rid = 1).

Аватар пользователя anzebra anzebra 27 декабря 2011 в 20:37

"deb" wrote:

Соовщения drupal_set_message() хранятся в сессии. Друпал имеет свой обработчик сессий, все данные о сессиях хранятся в БД. Если в таблице {users} нет записи для uid = 0, то для анонимов не получится загрузить сессию. Но почему у кого-то эта запись для uid = 0 пропадает, для меня загадка.


[quote="deb"]

как там говорят ... "Умом Россию не понять ..."

Аватар пользователя deb deb 27 декабря 2011 в 20:40

"anzebra" wrote:
то вот такой error:

Не знаю че там в 7-ке происходит, но 1-е что приходит на ум, так это запрос DELETE FROM sessions WHERE uid = 0, если сайт на локалхосте.

Аватар пользователя erikson erikson 17 июля 2012 в 2:49

Прицепились к анонимусу. Вот сижу с обычной формой (не авторизации, D6) и опять же если $form['#redirect']=FALSE, то прописанный в функции сабмита drupal_set_message выводится, но без редиректа. А если $form['#redirect']='node/1' (например) - редиректится, но без мессаг. Аналогично и с $form_state['redirect'].

Масса подобных начатых веток и все без решений.

Аватар пользователя erikson erikson 18 июля 2012 в 13:55

Если не брать во внимание нулевые uid'ы, а рассматривать просто форму, то можно по form['#action'] перейти на какую-либо страницу, а там в функции (по hook_menu) уже мессагить, обрабатывать пришедший $_POST и переходить (drupal_goto) куда надо.

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

Туманно? Криво? Этажно? С удовольствием выслушаю критику.

Аватар пользователя erikson erikson 18 июля 2012 в 14:10

"erikson" wrote:
Только не догоняю как после заполнения и обработки формы возвращаться на страницу из которой форма была вызвана.

В форме создаю hidden-элемент с referer-ссылкой:

$explode_referer = explode(
$_SERVER['SERVER_NAME'] . '/',
$_SERVER['HTTP_REFERER']
);

$form['redirect_page'] = array(
'#type' => 'hidden',
'#value' => $explode_referer[1],
);

И этот элемент появляется в массиве $_POST.

Аватар пользователя erikson erikson 21 июля 2012 в 4:46

Конечно. Трабла в девеловских выводах. Строчки типа drupal_set_message(krumo_ob($form_state, true)); мешали. Углубляться не стал, закомментировал и получил редирект после сабмита с выводом сообщений.