Прячем словарь через 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.

Комментарии