it-swarm-es.com

En Node Referencias, ¿cómo mostrar un campo personalizado, en lugar del Título?

¿Es posible mostrar en una lista de selección, otro campo en lugar del Título al hacer referencia a un nodo?

6
Oscar Mederos

Como dice dobeerman, puedes usar una vista como fuente, pero CCK juega un poco con la vista detrás de escena (me acabo de enterar como resultado de esta pregunta;). Si mira en nodereference.module En la función _nodereference_potential_references_views() encontrará el siguiente código:

// 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);

Entonces esto significa que

  • si no incluye un campo de título, se incluirá para usted;
  • si no alinea todos los campos y define un separador, se hará por usted.

Entonces, si configura el campo de título para que se oculte y especifique un separador apropiado, debería poder crear casi cualquier efecto. Si no puede lograr lo que desea con una vista (por ejemplo, ordenando nodos por su posición en el menú), entonces desea utilizar un enfoque diferente.

Puede crear su propio widget CCK, o (más simple) puede usar un enlace form_alter. Si hace lo último, no puede editar el formulario de la manera normal porque CCK no ha procesado el formulario en esta etapa; querrá usar una función #after_build.

Tengo un ejemplo del segundo enfoque utilizado para mostrar no referencias ordenadas por el menú si está interesado.

/**
 * 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

Cuando crea un campo de no referencia, puede seleccionar 'Ver' usado para seleccionar los nodos en el conjunto de campos 'Avanzado - Nodos a los que se puede hacer referencia (Ver)'. También puede pasar argumentos a esta vista de forma predeterminada.

5
dobeerman

http://drupal.org/project/nodereference_Explorer puede ser un poco exagerado, proporciona un cuadro de diálogo de selección para la referencia de nodos y dice "Arquitectura de complementos para el soporte de otros campos CCK"

2
WestieUK