hook_nodeapi
- Drupal 5
- Drupal 6
developer/hooks/core.php, строка 1358
- Версии
- 5 – 6
hook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL)
Выполняет действия над нодами.
Несмотря на то, что имя может сбить с толку, hook_nodeapi()
не зарезервирован только для модулей, которые определяют свои типы нодов.
Наоборот, он позволяет модулям реагировать на действия, влияющие на все виды нод, не зависимо от того, определил ли соответствующий модуль ноду.
В основном hook_nodeapi()
используется в связке с hook_form_alter()
. Модули используют hook_form_alter()
для дополнения форм редактирования новыми элементами и hook_nodeapi()
для чтения и записи значений этих элементов из и в базу данных.
Не используйте данный хук для выполнения операций только с типом ноды, созданного вашим модулем. Вместо этого используйте хуки предназначенные для модулей создающих новый тип ноды, такие как hook_insert()
и hook_form()
. Но для некоторых операций, таких как 'delete revision'
или 'rss item'
, нет соответствующего хука, поэтому даже если модуль определяет тип ноды, необходимо использовать hook_nodeapi()
.
Параметры
&$node
Нода, над которой будет производиться действие.
$op
Тип выполняемого действия. Возможные значения:
'alter'
: массив$node
->content отрендерен, так что тело ноды или тизер прошли фильтры и теперь содержат HTML. Это действие должно использоваться только тогда, когда необходимы подстановка текста, фильтрация или иные операции с необработанным (raw) текстом.'delete'
: Нода удаляется.'delete revision'
: Удаляется редакция ноды. Вы можете удалить данные связанных с редакцией.'insert'
: Нода создается (добавлена в базу данных).'load'
: Нода готова к загрузке из базы данных. Этот хук может быть использован для добавления дополнительных данных в это время.'prepare'
: Нода готова к отображению в форме добавления/редактирования.'prepare translation'
: Создается клон ноды для перевода. Вы можете загружать дополнительные данные, либо копировать значения$node
->translation_source.'print'
: Подготовлен образ ноды для печати. Используется для получения адаптивного для принтера представления ноды в book_module.'rss item'
: Создана лента RSS. Модуль может получить доступ к свойствам, определнным для элемента RSS ленты данной ноды. Смотрите comment_nodeapi() и upload_nodeapi() для примера. Для добавления или удаления содержимого элементов RSS ленты можно также воспользоваться модификацией переменной$node
.'search result'
: Нода отображается как результат поиска. Если вы хотите вывести дополнительную информацию с результатами, воспользуйтесь этим возвращаемым значением.'presave'
: Нода прошла проверку и вскоре будет сохранена. Модули могут использовать этот хук, чтобы внести изменения в ноду, прежде чем она сохранится в базу данных.'update'
: Существующая нода обновляется.'update index'
: Нода почти проиндексирована. Если вы хотите проиндексировать дополнительную информацию, которая не видна через nodeapi посредством операции'view'
, то вы должны вернуть её из nodeapi сейчас.'validate'
: Пользователь только что закончил редактирование данных ноды и пытается предпросмотреть или сохранить ее. Этот хук может использоваться для проверки данных ноды. Ошибки нужно устанавливать с помощью функции form_set_error().'view'
: Произошла сборка содержимого ноды перед рендерингом. Модуль может добавлять элементы$node
->content до рендеринга. Этот хук будет вызван после hook_view(). Формат$node
->content такой же, как в API формах.
$a3
- Для
'view'
, передается параметр$teaser
из node_view(). - Для
'validate'
, передается параметр$form
из node_validate().
$a4
- Для
'view'
, передается параметр$page
из node_view().
Возвращаемое значение
Значение зависит от операции.
- Операции
'presave'
,'insert'
,'update'
,'delete'
,'print'
и'view'
не возвращают значения. - Операция
'load'
должна вернуть массив, содержащий пары поля => значения, которые, вследствие, будут объединены в объект ноды.
Связанные темы
Код
<?php
function hook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
switch ($op) {
case 'presave':
if ($node->nid && $node->moderate) {
// Reset votes when node is updated:
$node->score = 0;
$node->users = '';
$node->votes = 0;
}
break;
case 'insert':
case 'update':
if ($node->moderate && user_access('access submission queue')) {
drupal_set_message(t('The post is queued for approval'));
}
elseif ($node->moderate) {
drupal_set_message(t('The post is queued for approval. The editors will decide whether it should be published.'));
}
break;
case 'view':
$node->content['my_additional_field'] = array(
'#value' => theme('mymodule_my_additional_field', $additional_field),
'#weight' => 10,
);
break;
}
}
?>
Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии