it-swarm-ko.tech

Node 참조에서 제목 대신 사용자 정의 필드를 표시하는 방법은 무엇입니까?

노드를 참조 할 때 제목 대신 다른 필드 인 선택 목록에 표시 할 수 있습니까?

6
Oscar Mederos

Dobeerman이 말했듯이 뷰를 소스로 사용할 수 있지만 CCK는 뷰 뒤에서 뷰를 재생합니다 (방금이 질문의 결과로 알았습니다). _nodereference_potential_references_views() 함수에서 nodereference.module를 보면 다음 코드가 있습니다.

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

그래서 이것은

  • 제목 필드를 포함하지 않으면 제목 필드가 포함됩니다.
  • 모든 필드를 인라인으로 만들지 않고 구분 기호를 정의하면 자동으로 완료됩니다.

따라서 제목 필드를 숨기도록 구성하고 적절한 구분 기호를 지정하면 거의 모든 효과를 만들 수 있습니다. 보기로 원하는 것을 얻을 수 없다면 (예 : 메뉴 위치에 따라 노드를 정렬) 다른 접근 방식을 사용하려고합니다.

자신의 CCK 위젯을 만들거나 form_alter 후크를 사용할 수 있습니다. 후자를 수행하는 경우 CCK가이 단계에서 양식을 처리하지 않았기 때문에 일반적인 방식으로 양식을 편집 할 수 없습니다. #after_build 함수를 사용하려고합니다.

관심있는 경우 메뉴에서 순서대로 노드 참조를 표시하는 데 사용되는 두 번째 방법의 예가 있습니다.

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

노드 참조 필드를 작성할 때 '고급-참조 할 수있는 노드 (보기)'필드 세트에서 노드를 선택하는 데 사용되는 '보기'를 선택할 수 있습니다. 또한 기본적으로이 뷰에 인수를 전달할 수 있습니다.

5
dobeerman

http://drupal.org/project/nodereference_Explorer 약간 과잉 일 수 있습니다. 노드 참조를위한 선택 대화 상자를 제공하고 "다른 CCK 필드 지원을위한 플러그인 아키텍처"라고 말합니다.

2
WestieUK