В нашем случае, мы проверяем, является ли объект нодой (причем тип материала должен быть включен в настройках нашего трэкера) и добавляем в отдельную область (fieldset) два чекбокса, которые будут отвечать за наши дополнительные параметры у ноды. Доступ к этим элементам зависит от прав пользователя, которые мы определили в предыдущей части (см. хук perm).
Шаг номер 14:
if (isset($form['type']) && isset($form['#node']) &&
$form['type']['#value'] .'_node_form' == $form_id &&
(in_array($form['type']['#value'], variable_get('cctracker_node_types', array()), TRUE) ||
in_array($form['type']['#value'], variable_get('cctracker_tab_types', array()), TRUE))
) {
$cctracker = db_fetch_object(db_query("SELECT cc_sticky,cc_not_public,cc_sticky_weight FROM {node_cctracker} WHERE nid = %d", $form['#node']->nid));
$form['cctracker'] = array(
'#type' => 'fieldset',
'#title' => t('Cctracker settings'),
'#collapsible' => TRUE,
'#collapsed' => !($cctracker->cc_sticky || $cctracker->cc_not_public),
'#access' => user_access('access not place cctracker') || user_access('access sticky cctracker'),
'#weight' => 30,
);
$form['cctracker']['cc_sticky'] = array(
'#type' => 'checkbox',
'#title' => t('Sticky this node on top tracker'),
'#access' => user_access('access sticky cctracker'),
'#default_value' => $cctracker->cc_sticky,
);
$form['cctracker']['cc_sticky_weight'] = array(
'#type' => 'weight',
'#title' => t('Sticky Weight'),
'#default_value' => $cctracker->cc_sticky_weight,
'#access' => user_access('access sticky cctracker'),
'#delta' => 10,
'#description' => t('Optional. In the tracker, the heavier items will sink and the lighter items will be positioned nearer the top.'),
);
$form['cctracker']['cc_not_public'] = array(
'#type' => 'checkbox',
'#title' => t('Not public in cctracker'),
'#access' => user_access('access not place cctracker'),
'#default_value' => $cctracker->cc_not_public,
);
}
}
Но нам еще надо как то сохранить эти опции в нашей таблице.
Прекрасное место где это можно сделать, хук nodeapi
Как правило, хук nodeapi используется в сочетании с хук form_alter. Модули могут использовать хук form_alter, чтобы разместить дополнительные элементы в форме, а хук nodeapi для чтения и из базы данных и записи в базу дополнительных данных из добавленных полей формы.
Шаг номер 15:
Определяем хук nodeapi в нашем файле cctracker.module
- insert - запись новой ноды
- update - изменение ноды
- delete - удаление ноды
Что бы визуально не перегружать код функции, мы так-же написали вспомогательную функцию _cctracker_node_save, которая собственно и выполняет все действия с базой данных.
if (in_array($node->type, variable_get('cctracker_node_types', array()), TRUE) ||
in_array($node->type, variable_get('cctracker_tab_types', array()), TRUE)
) {
switch ($op) {
case 'insert':
case 'update':
_cctracker_node_save($node, 'update');
break;
case 'delete':
_cctracker_node_save($node, 'delete');
break;
}
}
}
function _cctracker_node_save($node, $op='update') {
$is_existing = db_result(db_query("SELECT COUNT(*) FROM {node_cctracker} WHERE nid = %d", $node->nid));
if ($is_existing ) {
if ($op != 'delete') {
db_query("UPDATE {node_cctracker} SET cc_sticky = %d, cc_not_public = %d, cc_sticky_weight = %d WHERE nid = %d", $node->cc_sticky, $node->cc_not_public, $node->cc_sticky_weight, $node->nid);
}
else {
db_query("DELETE FROM {node_cctracker} WHERE nid = %d", $node->nid);
}
}
else {
if ($op != 'delete') {
db_query("INSERT INTO {node_cctracker} (nid, cc_sticky, cc_not_public,cc_sticky_weight) VALUES(%d, %d, %d, %d)", $node->nid, $node->cc_sticky, $node->cc_sticky_weight, $node->cc_not_public);
}
}
}
