В процессе разработки модуля Taxonomy ToDo возникла задача спрятать в форме создания/редактирования нодов селектор терминов словаря ToDo для тех, у кого нет на это права 'create todo items'. Как выяснилось, это легко делается через hook_form_alter:
/**
* Implements hook_form_alter, removes ToDo vocabulary from node form if user can't add todo items
*
* @param array $form - form to alter
* @param array $form_state - form state
* @param string $form_id - form id
*/
function taxonomy_todo_form_alter(&$form,$form_state,$form_id) {
//we alter only node edit forms
if (isset($form['type']) && isset($form['#node']) && $form['type']['#value'] .'_node_form' == $form_id) {
if (!user_access('create todo items')) {
//alter form if user may not create todo items
$vid = variable_get('taxonomy_todo_vocabulary',0);
if (isset($form['taxonomy'][$vid])) {
//unset todo vocabulary form fields so user can't add todo terms
unset($form['taxonomy'][$vid]);
}
}
}
} //function taxonomy_todo_form_alter
При этом есть два небольших подводных камня:
- вес у разрабатываемого модуля должен быть больше, чем у модуля таксономии, так как последний тоже использует hook_form_alter для добавления своих подформ в форму редактирования нодов;
- кроме того, нельзя использовать более конкретный hook_form_FORM_ID_alter, поскольку эти хуки вызываются движком друпала до hook_form_alter.