Состояние Drush: неисправимая ошибка, вызванная drupal_goto () в hook_init () - PullRequest
3 голосов
/ 26 июля 2011

У меня есть модуль с drupal_goto (), который перенаправляет пользователей, если они не соответствуют требованиям возраста (винный сайт) в hook_init (). Модуль настроен на более тяжелый вес, поэтому он загружается последним.

В PHP 5.3 происходит сбой обновления drush. Тот же код и БД на другом сервере с PHP 5.2 работает нормально.

версия Drush: 7.x-4.4 Версия PHP: 5.3 пример:

Когда я запускаю: состояние drush, я получаю сообщение об ошибке. Вот вывод с флагом отладки и подробностей.

$ drush -d -v status
Bootstrap to phase 0. [0.02 sec, 2.47 MB]                            [bootstrap]
Drush bootstrap phase : _drush_bootstrap_drush() [0.03 sec, 2.67 MB] [bootstrap]
Drush bootstrap phase : _drush_bootstrap_drupal_root() [0.06 sec, 5.49 MB]                                              [bootstrap]
Initialized Drupal 6.22 root directory at /var/www/example.com/public_html [0.07 sec, 6.28 MB]                         [notice]
Drush bootstrap phase : _drush_bootstrap_drupal_site() [0.07 sec, 6.29 MB]                                              [bootstrap]
Initialized Drupal site default at sites/default [0.07 sec, 6.29 MB]                                                       [notice]
Drush bootstrap phase : _drush_bootstrap_drupal_configuration() [0.08 sec, 6.29 MB]                                     [bootstrap]
Drush bootstrap phase : _drush_bootstrap_drupal_database() [0.08 sec, 6.33 MB]                                          [bootstrap]
Successfully connected to the Drupal database. [0.08 sec, 6.33 MB]                                                      [bootstrap]
Drush bootstrap phase : _drush_bootstrap_drupal_full() [0.09 sec, 6.67 MB]                                              [bootstrap]
Drush command terminated abnormally due to an unrecoverable error. [0.34 sec, 31.38 MB]                                 [error]

Теперь возникает вопрос: почему drupal_goto () приводит к сбою drush на сервере PHP 5.3, а не на сервере PHP 5.2.

1 Ответ

0 голосов
/ 11 августа 2011

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

Вместо drupal_goto() используйте drupal_access_denied().Если вы действительно хотите, чтобы люди перенаправлялись на другой URL-адрес, место для этого будет на странице, на которой показан отказ в доступе .

При этом выдается drupal_access_denied(),или, на самом деле, отправка любого заголовка в hook_init() совершенно неверна.Из документации : «Выполнение задач настройки». Отправка заголовков не задача установки.Более того, та же самая документация предупреждает о другой потенциальной проблеме с вашим подходом: «Этот хук не запускается на кэшированных страницах», другими словами, когда взрослый посещает страницу, и она кэшируется, несовершеннолетние посетители не будут перенаправлены или лишены доступаони получат кешированную страницу.

Теперь о том, что вы должны сделать: модуль типа Taxonomy Access (Lite) или более подходящий Node Privacy By Role может использоваться для предоставления доступа к вашему контенту.Обратите внимание, что по умолчанию представления не будут использовать эти права доступа: они будут отображать списки содержимого независимо от доступа пользователя: вам придется перенастроить все ваши представления, чтобы либо соблюдать правила доступа, либо быть полностью недоступными, чтобыопределенные роли.Кроме того, вам нужно дать «несовершеннолетним» отдельную роль: таким образом вы можете предоставить им другой доступ, нежели люди в роли «аутентифицированный пользователь» или даже «взрослый».Вам понадобится какой-то механизм, чтобы автоматически назначать роли .

...