Drupal: Как можно вызвать один хук-выход в пользовательском модуле при каждом запросе страницы? - PullRequest
2 голосов
/ 29 октября 2009

Как можно вызвать один хук-выход в пользовательском модуле при каждом запросе страницы веб-сайта drupal?

Вот код выхода хука в пользовательском модуле:

<?php
function cec_monitoring_exit() {
    if ((arg(0) == 'node') && is_numeric(arg(1)) && arg(2) == '') {
        // database inserts here
    }
}
?>

Это из-за условия if или чего-то еще? Потому что некоторые из пользовательских модулей вызывают хук «cec_monitoring_exit ()», а некоторые другие пользовательские модули - нет.

Заранее спасибо.

Ура, Mark

Ответы [ 3 ]

2 голосов
/ 29 октября 2009

Я тоже не уверен, что вы подразумеваете под it is not called in some of the custom modules, поэтому просто предположим, что вы можете иметь в виду пользовательские страницы, предоставляемые другими модулями:

Как уже отмечали Джереми и Googletorp, ваш блок if

if ((arg(0) == 'node') && is_numeric(arg(1)) && arg(2) == '') {
    // database inserts here
}

будет принимать значение true, только если пользователь запрашивает полную страницу узла (например, «узел / 42»). не будет соответствовать ни одной другой странице , например представлению терминов (например, таксономия / термин / 36), главной странице по умолчанию ("узел") или странице просмотра, предоставляемой модулем представлений (может / иметь /) любой / путь) и т. д.

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

Если вы хотите регистрировать каждый запрос страницы, вы можете просто удалить блок if и выполнить вставку базы данных напрямую.


Редактировать после уточнения в комментариях (cec_monitoring_exit() не вызывается для некоторых страниц, созданных другими модулями):

Я вижу только две возможные причины для этого.

Первой причиной будет ошибка, возникшая сразу после вывода страницы, но перед вызовом вашей реализации hook_exit() ( проверьте журналы вашего сервера на наличие ошибок php при запросах страниц с ошибками ). Если вы посмотрите на index.php (папка верхнего уровня вашего экземпляра Drupal):

require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

$return = menu_execute_active_handler();

// Menu status constants are integers; page content is a string.
if (is_int($return)) {
  switch ($return) {
    case MENU_NOT_FOUND:
      drupal_not_found();
      break;
    case MENU_ACCESS_DENIED:
      drupal_access_denied();
      break;
    case MENU_SITE_OFFLINE:
      drupal_site_offline();
      break;
  }
}
elseif (isset($return)) {
  // Print any value (including an empty string) except NULL or undefined:
  print theme('page', $return);
}

drupal_page_footer();

вы можете видеть, что вывод страницы генерируется путем печати результата theme('page', $return). Вызов hook_exit() происходит сразу после этого в drupal_page_footer().

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

Вторая причина заключается в том, что один из модулей обойдет стандартный поток выполнения Drupal, вызвав саму тему ('page', ...), и впоследствии остановит выполнение. В этом случае drupal_page_footer() не будет вызван, потому что выполнение было бы остановлено задолго до вызова menu_execute_active_handler(). Обратите внимание, что ни один из установленных модулей Drupal не сделает этого, поэтому это маловероятно.

Помимо этих опций, я понятия не имею, что может вызвать это.

1 голос
/ 29 октября 2009

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

Эта трата ресурсов будет ограничена при кэшировании страниц, так как вам нужно будет запускать ловушки только при создании страницы с кэшированием страницы. Другой пример: всякий раз, когда узел загружается node_load , это приводит к запуску большого количества хуков, и, следовательно, это довольно дорого. Таким образом, вы обычно хотите по возможности избегать этого, когда хотите получить доступ к чему-либо на многих узлах, например к их названию.

0 голосов
/ 26 февраля 2012

@ marknt15 Я думаю, что вы не смогли понять, что все это основано на имени, так что hook, являющийся hook_exit (), в вашем случае AKA _exit () вызывается, когда он помещается с префиксом имени вызывающего модуля, например, cec_monitoring_exit. () будет работать только в модуле cec_monitoring, но в вашем другом пользовательском модуле с именем скажем marknt15_loves_drupal тогда будет необходимо использовать hook_exit () как marknt15_loves_drupal_exit ()

drupal затем вызывает его и все остальные хуки с ... call_user_func_array ('modulename' _ 'hookname') или что-то очень похожее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...