Как я могу разместить новое текстовое поле на вкладке словари в типе контента?


Я хочу поместить новое текстовое поле в набор полей "Словари" узла; текстовое поле не является тегом.

Я использую модуль Вертикальные вкладки , и мои поля в типе контента находятся в группе.

Ниже приведена структура моего типа контента:

  • Название
  • Словари (таксономия) -> Здесь я тоже хочу разместить поле.
  • набор полей 1 (Поля: поле 1, поле 2 и поле 3)
  • набор полей 2 (Поля: поле 4, поле 5)
Author: kiamlaluno, 2011-08-14

1 answers

Набор полей для словарей, используемых узлом, добавляется из taxonomy_form_alter(), используя следующий код (соответствующая часть находится между "//3" и "// 4"):

// 1
if (!isset($node->taxonomy)) {
  $terms = empty($node->nid) ? array() : taxonomy_node_get_terms($node);
}
else {
  // After a preview or form reload, the terms must be converted to objects.
  reset($node->taxonomy);
  if (!is_object(current($node->taxonomy))) {
    $node->taxonomy = taxonomy_preview_terms($node);
  }
  $terms = $node->taxonomy;
}

$c = db_query(db_rewrite_sql("SELECT v.* FROM {vocabulary} v INNER JOIN {vocabulary_node_types} n ON v.vid = n.vid WHERE n.type = '%s' ORDER BY v.weight, v.name", 'v', 'vid'), $node->type);

while ($vocabulary = db_fetch_object($c)) {
  if ($vocabulary->tags) {
    if (isset($form_state['node_preview'])) {
      // Typed string can be changed by the user before preview,
      // so we just insert the tags directly as provided in the form.
      $typed_string = $node->taxonomy['tags'][$vocabulary->vid];
    }
    else {
      $typed_string = taxonomy_implode_tags($terms, $vocabulary->vid) . (array_key_exists('tags', $terms) ? $terms['tags'][$vocabulary->vid] : NULL);
    }
// 2
    if ($vocabulary->help) {
      $help = filter_xss_admin($vocabulary->help);
    }
    else {
      $help = t('A comma-separated list of terms describing this content. Example: funny, bungee jumping, "Company, Inc.".');
    }
    $form['taxonomy']['tags'][$vocabulary->vid] = array(
      '#type' => 'textfield', 
      '#title' => $vocabulary->name, 
      '#description' => $help, 
      '#required' => $vocabulary->required, 
      '#default_value' => $typed_string, 
      '#autocomplete_path' => 'taxonomy/autocomplete/' . $vocabulary->vid, 
      '#weight' => $vocabulary->weight, 
      '#maxlength' => 1024,
    );
  }
  else {
    // Extract terms belonging to the vocabulary in question.
    $default_terms = array();
    foreach ($terms as $term) {
      // Free tagging has no default terms and also no vid after preview.
      if (isset($term->vid) && $term->vid == $vocabulary->vid) {
        $default_terms[$term->tid] = $term;
      }
    }

// 3
    $form['taxonomy'][$vocabulary->vid] = taxonomy_form($vocabulary->vid, array_keys($default_terms), filter_xss_admin($vocabulary->help));
    $form['taxonomy'][$vocabulary->vid]['#weight'] = $vocabulary->weight;
    $form['taxonomy'][$vocabulary->vid]['#required'] = $vocabulary->required;
  }
}
if (!empty($form['taxonomy']) && is_array($form['taxonomy'])) {
  if (count($form['taxonomy']) > 1) {
    // Add fieldset only if form has more than 1 element.
    $form['taxonomy'] += array(
      '#type' => 'fieldset', 
      '#title' => t('Vocabularies'), 
      '#collapsible' => TRUE, 
      '#collapsed' => FALSE,
    );
  }
  $form['taxonomy']['#weight'] = -3;
  $form['taxonomy']['#tree'] = TRUE;
// 4
}

Набор полей, который затем изменяется модулем Вертикальных вкладок на вкладке, добавляется только в том случае, если с типом содержимого создаваемого узла связано более одного словаря.

Чтобы добавить новое поле в этот набор полей, вы должны реализовать hook_form_alter() в модуле и добавить код, аналогичный следующему:

function mymodule_form_alter(&$form, $form_state, $form_id) {
  if (isset($form['type']) && isset($form['#node']) && && $form['type']['#value'] . '_node_form' == $form_id) {
    if (isset($form['taxonomy']['#type']) && $form['taxonomy']['#type'] == 'fieldset') {
      // Add your field.
      $form['taxonomy']['mymodule_field] = array(
        // …
      );
    }
  }
}

Модуль, который вы пишете, должен быть выполнен после модуля таксономии, иначе модуль не найдет набор полей, добавленный модулем таксономии. Модуль выполняется после модуля таксономии, если он имеет такое имя, как TaxonomyAddendum, или если вес модуля превышает вес модуля таксономии (10 должно быть достаточно).

Что касается изменения существующих полей для терминов таксономии, вам следует посмотреть код между комментарии "//1" и "//2"; поскольку форма строится с использованием идентификатора словаря, как в $form['taxonomy'][$vocabulary->vid], вам необходимо знать его, чтобы получить все поля формы, используемые для терминов таксономии. Если вы хотите изменить поле формы для словаря, для которого вы знаете идентификатор, то код проще, так как вам не нужно получать все словари, связанные с редактируемым узлом; это также верно, если вы хотите изменить поле формы для словаря, который вы знаете по имени. Вы можете использовать следующий код для получения словаря объект, знающий название словаря.

$result = db_fetch_object(db_query(db_rewrite_sql("SELECT v.vid, v.*, n.type FROM {vocabulary} v LEFT JOIN {vocabulary_node_types} n ON v.vid = n.vid WHERE n.type = '%s' AND v.name = '%s' ORDER BY v.weight, v.name", 'v', 'vid'), $type, $vocabulary_name));

$type является ли тип контента, который в вашем случае $form['#node']->type; $vocabulary_name это название словаря.

Если вы знаете идентификатор словаря, то вы можете просто использовать taxonomy_vocabulary_load(), чтобы получить объект словаря, который может потребоваться для заполнения поля формы термина таксономии.

 0
Author: kiamlaluno, 2011-08-15 00:24:00