Прячем словарь через hook_form_alter
В процессе разработки модуля 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.
Вес модулей определяет очередность выполнения хуков, реализованных в них. То есть, если два модуля реализуют, например, hook_user(), то первым выполнится хук в модуле с меньшим весом. А при равных весах — в алфавитном порядке.
В Drupal 6 к сожалению нет штатного средства для отображения и смены веса модуля, поэтому нужно править поле weight в таблице {system}.












А что такое вес модуля, и где он определяется?