2012-01-03 2 views
0

Как заставить Drupal 7 перенаправить пользователя на определенную страницу (которая содержит форму), где пользователь нажимает на сайт после входа в систему, пока не заполнит эту форму?Drupal 7 - Как перенаправить пользователя на определенную страницу, пока они не изменят настройку на этой странице?

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

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

Кроме того, решение должно проверить, если запрос страницы является фактической отправки формы (в противном случае они не смогут отправить форму)

Любые идеи, предложения?

+0

почему вы не можете использовать hook_init кэшированных страниц? Как только вы очистите кеш, init будет идеально подходит. –

ответ

1

Итак, кажется, что hook_init() - это решение, и проблема была вызвана объектом $ user. Фокус в том, что вам нужно перезагрузить объект $ user, так как глобальный не содержит значений полей.

Очень простой пример кода:

function mymodule_init(){ 
    global $user; 

    if($user->uid && $user->uid != 1){ 

     $account = user_load($user->uid); 
     $account = entity_metadata_wrapper('user', $account); 

     $destination = drupal_get_destination(); 

     if(!$account->field_setup_completed->value()){ 
      drupal_set_message('Setup incomplete.', 'error'); 

      if($destination['destination'] != 'setup-page' && $destination['destination'] != 'user/logout'){ 
       drupal_set_message('Redirecting to setup', 'error'); 
       drupal_goto('setup-page'); 
      } 
     } 
    } 
} 
+0

Спасибо за проверку и размещение решения. – Day

+0

Я должен спросить ... вы используете 'entity_metadata_wrapper()' по какой-либо конкретной причине? Это лишний дополнительный шаг, поскольку вы можете просто проверить для '$ account-> field_setup_completed [$ user-> language] [0] ['value']' как только вы вызвали 'user_load()'. Причина, о которой я прошу, заключается в том, что я никогда раньше не видел, чтобы она использовалась таким образом, и мне было бы интересно узнать ваши рассуждения :) – Clive

+0

Клайв, вы правы, нет смысла конвертировать его туда, я просто привык к этому, поскольку я работают в основном с организациями. (также я намерен использовать этот объект $ account позже, чтобы внести изменения в пользователя, но это не является частью примера) –

Смежные вопросы