modules weight и form_alter

Главные вкладки

Аватар пользователя wanders.32 wanders.32 20 июня 2008 в 13:53

была такая задача - убрать ненужные табы при создании контента - аттачменты, настройки меню, прочее. конечному пользователю оно не надо)
делали это естественно form_alter'ом. как оказалось, из модуля всю форму видно не было - например я не видел в ней URL settings. Почему? потомучто к форме этот таб добавлялся тоже форм_альтером. и как дальше оказалось, форм_альтеры эти, из всех модулях применяются в порядке их следования, т.е буквально - по имени модуля. мой модуль начинался с буквы M, урловский - с буквы U. решение естественно нашли сразу - модуль с именем zzzz:) но так как этот подход посчитался негламурным, начали ковырят. итог: база данных, таблица system - где храниться список модулей сайта - имеет поле weight. по умолчанию вес 0, что нужно было - поставить "тяжелый" вес для нашего модуля, то есть form_alter, написанный в нем, применится в самую последнюю очередь. из админки весы эти редактировать нельзя, поэтому лезем в базу и редактируем там. все:-)

Комментарии

Аватар пользователя Purgas Purgas 20 июня 2008 в 18:40

Есть еще и такой вариант:
в файле mymodule.install в хуке mymodule_update_N

function mymodule_update_N() {
  $ret = array();

  switch ($GLOBALS['db_type']) {
    case 'mysql':
    case 'mysqli':
      $max_weight = (int)db_result(db_query('SELECT MAX(weight) '.
                                            'FROM {system} '.
                                            "WHERE type = 'module'"));
      $max_weight ++;
      $ret[] = update_sql('UPDATE {system} '.
                          'SET weight = '. $max_weight .
                          " WHERE name = 'mymodule' AND type = 'module'");
     
      break;
  }

  return $ret;
}