it-swarm-eu.dev

V Node Reference, jak zobrazit vlastní pole místo názvu?

Je možné při odkazování na uzel zobrazit ve výběrovém seznamu další pole místo názvu?

6
Oscar Mederos

Aserieerman říká, že můžete použít View jako zdroj, ale CCK si hraje s View v zákulisí (právě jsem zjistil v důsledku této otázky;). Pokud se podíváte na nodereference.module Na funkci _nodereference_potential_references_views(), najdete následující kód:

// We do need title field, so add it if not present (unlikely, but...)
$fields = $view->get_items('field', $display);
if (!isset($fields['title'])) {
  $view->add_item($display, 'field', 'node', 'title');
}

// If not set, make all fields inline and define a separator.
$options = $view->display_handler->get_option('row_options');
if (empty($options['inline'])) {
  $options['inline'] = drupal_map_assoc(array_keys($view->get_items('field', $display)));
}
if (empty($options['separator'])) {
  $options['separator'] = '-';
}
$view->display_handler->set_option('row_options', $options);

To znamená, že

  • pokud pole názvu nezadáte, bude to zahrnuto pro vás;
  • pokud všechna pole nezařazíte do řádku a nedefinujete oddělovač, bude to provedeno za vás.

Pokud tedy nakonfigurujete pole titulu tak, aby bylo skryto, a určete vhodný oddělovač, měli byste být schopni vytvořit téměř jakýkoli efekt. Pokud nemůžete dosáhnout toho, co chcete, pomocí pohledu (např. Pořadí uzlů podle jejich pozice v nabídce), pak budete chtít použít jiný přístup.

Mohli byste si vytvořit svůj vlastní widget CCK, nebo (jednodušší) můžete použít háček form_alter. Pokud tak učiníte, nemůžete formulář upravovat obvyklým způsobem, protože CCK v této fázi formulář nezpracoval - budete chtít použít funkci #after_build.

Mám příklad druhého přístupu použitého k zobrazení nodereferencí uspořádaných podle nabídky, pokud vás to zajímá.

/**
 * Implements hook_form_alter().
 */
function banners_form_alter(&$form, &$form_state, $form_id) {

  // Modify nodereferences for banners so that pages are shown in primary links
  // order.
  if ($form['#id'] === 'node-form' && isset($form['#field_info']['field_pages'])) {

    if (!isset($form['#after_build'])) {
      $form['#after_build'] = array();
    }
    $form['#after_build'][] = 'banners_after_build';
  }
}

/**
 * After_build callback for modifying CCK field select options.
 */
function banners_after_build($form, &$form_state) {
  // Get the menu data
  $new_options = banners_generate_page_options();

  if (isset($form['#field_info']['field_pages'])) {
    $old_options = $form['field_pages']['nid']['nid']['#options'];
    $final_options = banners_process_options($new_options, $old_options);
    $form['field_pages']['nid']['nid']['#options'] = $final_options;
  }

  // Return new form
  return $form;
}

/**
 * Uses the old options to filter out unreferenced nids and add those that 
 * weren't detected in a menu structure to the other option group. 
 * @param $new_options
 *   The options list created by scanning the menus.
 * @param $old_options
 *   The options list originally passed to the form.
 *   
 * @return
 *   The final options list with option groups for each menu and for orphans.
 */
function banners_process_options($new_options, $old_options) {
  // Have to assume that $old_options could get quite large, whereas 
  // $new_options is based on menus, and shouldn't get too large.

  // Iterate through $new_options (the menu nids) and remove nids from
  // $old_options that exist in $new_options, and remove nids from $new_options
  // that don't exist in $old_options. After this $old_options has valid nids
  // that aren't under the menu hierarchy.
  foreach ($new_options as $menu_title => $options) {
    foreach ($options as $nid => $title) {
      if (isset($old_options[$nid])) {
        unset($old_options[$nid]);
      }
      else {
        unset($new_options[$menu_title][$nid]);
      }
    }
  }

  $final_options = array();

  // If the field is not marked required, there'll be an option for - None -
  // and it's keyed to the empty string.
  if (isset($old_options[''])) {
    $final_options[''] = $old_options[''];
    unset($old_options['']);
  }

  $final_options += $new_options;

  $final_options['Others'] = $old_options;

  return $final_options;
}

/**
 * Generates FAPI options for the allowed menus' node links.
 * 
 * @return
 *   A FAPI options array with all node links on the allowed menus (NB this has
 *   not been filtered in any other way).
 */
function banners_generate_page_options() {

  $menus = array('primary-links', 'menu-top-menu');
  $options = array();

  foreach ($menus as $menu_name) {
    $tree = menu_tree_all_data($menu_name);
    $menu = menu_load($menu_name);
    $options[$menu['title']] = _banners_process_tree($tree);
  }

  return $options;
}

/**
 * Recursive function to generate the options array, keyed by nid.
 */
function _banners_process_tree($tree, $depth = 0) {

  $options = array();

  foreach ($tree as $item) {
    $matches = array();
    if (preg_match('~^node/(\d+)$~', $item['link']['link_path'], $matches)) {
      // Link points to a node
      $nid = $matches[1];
      $options[$nid] = str_repeat('--', $depth) . ' ' . $item['link']['title'];
      if ($item['below']) {
        $options += _banners_process_tree($item['below'], $depth + 1);
      }
    }
  }

  return $options;
}
7
Andy

Když vytváříte pole uzlu, můžete vybrat 'Zobrazit', použité k výběru uzlů v poli 'Upřesnit - uzly, na které lze odkazovat (zobrazit)'. Tomuto zobrazení můžete také ve výchozím nastavení předat argument.

5
dobeerman

http://drupal.org/project/nodereference_Explorer může být trochu nadměrný, poskytuje výběrové dialogové okno pro odkazování na uzly a říká: „Plugin architektura pro podporu dalších CCK polí“

2
WestieUK