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

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

graker
Аватар пользователя graker

Вес модулей определяет очередность выполнения хуков, реализованных в них. То есть, если два модуля реализуют, например, hook_user(), то первым выполнится хук в модуле с меньшим весом. А при равных весах — в алфавитном порядке.

В Drupal 6 к сожалению нет штатного средства для отображения и смены веса модуля, поэтому нужно править поле weight в таблице {system}.

Отправить комментарий

CAPTCHA
Пройдите, пожалуйста, проверку. Она нужна, чтобы отличать людей от спам-роботов. А если не хотите проходить эту проверку регулярно — зарегистрируйтесь.
Image CAPTCHA
Введите цифры, изображенные на картинке (без пробелов).