Потому то я и не люблю таксономию в шестерке drupal, что возможностей ею управлять хуками почти что нет. В 7-ке ситуация лучше. У меня была задача выводить не все термины словаря, а только их часть. При этом у админа и редакторов оставался полный набор терминов, а простые пользователи должны были пользоваться усеченным списком. Отметку «особенности» терминов я делал в поле описания термина.
Искал готовые решения, работающих не нашел, пришлось придумать что то самому. То, что придумалось в итоге, нельзя назвать в полной мере решением, это скорее обходной путь :).
Судите сами — поле из формы убрать не удаётся, т.к. оно связано с типом публикации и рендерится уже в шаблон формы. Делается это вопреки всему, чтобы бы вы не удаляли из самого определения формы, к примеру, через hook_form_alter.
Мое решение заключается в следующем:
- Прячем поле таксономии от пользователя, добавляя в hook_form_alter что то вроде (если словарь имеет код vid (vocalabury_id) == 1):
1 |
$form['#prefix'] .= '<style>#edit-taxonomy-1-wrapper {display: none} </style>'; |
- К форме в hook_form_alter добавляем поле типа select, которое для пользователя заменяет ввод данных спрятанного поля таксономии.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$form['taxonomy_fake'] = array( '#type' => 'select', '#default_value' => $term_id, //предустановка значения '#required' => 1, //если установка термина обязательна '#options' => array('' => '- Пожалуйста выберите -',), '#title' => 'Термины какого то словаря', '#weight' => -10, '#access' => 1, ); //далее пример заполнения набора значения по словарю //грузим из корня словаря № 1 список терминов. //Подходит, если в словаре нет иерархии $terms = taxonomy_get_children(0, 1); $o = &$form['taxonomy_fake']['#options']; foreach ($terms as $v) { if (...) $o[$v->tid] = $v->name; //используем какой то фильтр, чтобы добавить только нужные термины } |
- После отправки данных нужно подхватить значение из фальшивого списка и заполнить им таксономию. Делаем это в hook_nodeapi.
1 2 3 4 5 6 7 8 9 10 11 |
/* hook node api */ function MyModule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { global $user; if ($op == 'update' || $op == 'presave') { //пример условия для фильтра ролей и типа публикации if (!in_array('редактор', $user->roles) && $node->type == '...') { //подставляем в таксономию (1 - это vid словаря) $node->taxonomy = array(1 => $node->taxonomy_fake); } } } |
Ужасное, не красивое решение, но у меня оставался лишь вариант вообще отказаться от таксономии, а это означало масштабную перепись уже отлаженного кода.
А не подскажете как сделать вот такое? http://xandeadx.ru/blog/drupal/18#comment-14562
Для Drupal 6 необходимо