卸下[NID:N]在nodereference自动完成(Removing [nid:n] in no

2019-08-17 06:22发布

使用自动填充字段为CCK nodereference始终显示节点ID作为一个神秘的括号扩展:

Page Title [nid:23]

据我所知,这可以确保选择在节点的情况下具有独特的标题相同,但显然这是暴露给用户一个讨厌的事情。

有没有人曾在删除这些括号,或添加不同的唯一标识符的任何成功?

Answer 1:

最后,你需要改变的输出nodereference_autocomplete()在nodereference.module。

为了正确地做到这一点,你想有一个自定义模块干净地重写功能。

该函数被定义为菜单回调,从而,

/**
 * Implementation of hook_menu_alter().
 */
function custom_module_menu_alter(&$items) {
  $items['nodereference/autocomplete']['page callback'] = 'custom_module_new_nodereference_autocomplete';
}

然后,复制nodereference_autocomplete功能到您的自定义模块,改变它的名字来匹配您的回调。 然后改变这一个行:

$matches[$row['title'] ." [nid:$id]"] = '<div class="reference-autocomplete">'. $row['rendered'] . '</div>';

滴药NID参考。

$matches[$row['title']] = '<div class="reference-autocomplete">'. $row['rendered'] . '</div>';

我相信标识符是在这一点上,这意味着你也可以改变,只要你喜欢的文字纯粹的外观。 如果不是纯粹的外观,不错,我还没有测试,看看在错误的条件下会发生什么。

我总想找出如何做到这一点。 感谢您与您的问题,激励我。



Answer 2:

什么Grayside发布了将工作......只要你没有使用相同的标题两个节点。 换句话说,如果你想为Grayside建议做的,你需要知道的是,NID也不是完全无关紧要。 该nodereference_autocomplete_validate()函数做两件事情。 它检查是否有一个匹配的节点,如果是这样,它通过在NID,将其设置为$form_state阵列。 如果它不能找到一个节点,它会设置错误。 如果NID存在,它将被用于获取节点,这也比较快,代码是在这里:

preg_match('/^(?:\s*|(.*) )?\[\s*nid\s*:\s*(\d+)\s*\]$/', $value, $matches);
    if (!empty($matches)) {
        // Explicit [nid:n].
        list(, $title, $nid) = $matches;
        if (!empty($title) && ($n = node_load($nid)) && $title != $n->title) {
            form_error($element[$field_key], t('%name: title mismatch. Please check your selection.', array('%name' => t($field['widget']['label']))));
        }
    }

这只是检查,看看是否有NID并检查该节点,如果这样的NID传递与标题匹配。

第二个选项是有点慢,但它是这里的错误可能发生。 如果按照执行,你会看到,如果将设法找到只基于标题节点,并将采取相匹配的第一个节点。 这样做的结果是,如果你有相同的标题两个节点,其中一人将始终使用。 这可能不是你的问题,但问题是,你永远不会发现如果发生这种情况。 一切都将只是正常工作,并且用户会认为他选择他想要的节点。 这可能是这样,但他还不如选择了错误的节点。

因此,在短期,你可以摆脱在自动完成回调的NID的,但它有2个缺点:

  1. 性能(小)
  2. 不确定性在选择正确的节点。

所以,你必须想一想,才去这条路线。 特别是,因为你很可能将无法找到错误的节点的选择的问题,它应该发生。 另外一点需要注意的,就是NID显示出来,也带给用户一些有价值的信息,一个快速的方法来查找节点,他们应该会有疑问,如果这是他们想要的,如果几个节点也有类似的标题。



Answer 3:

我Grayside的答案工作,但我不得不用MENU改变,而不是形式改变他张贴。 没有biggy!

function custommodule_menu_alter(&$items) {
  $items['nodereference/autocomplete']['page callback'] = 'fp_tweaks_nodereference_autocomplete';
}


Answer 4:

我找到了一个替代解决办法是改变你的widget类型选择列表,然后使用选择的模块到你的列表转换为自动完成场。

这种处理节点具有相同的标题,实际上我认为用户界面是不是由自动完成构件提供了一个更好的。



Answer 5:

任何人碰到这个(相当古老)的话题来通过谷歌搜索的方式 - 为Drupal 7,请考虑使用的EntityReference模块和“实体引用”字段类型如果可能的话。

您可以在acheive配置了很多与“实体引用”字段。 它没有这个问题,方括号中的NID。



Answer 6:

这里是Grayside的答案的完整的Drupal 7版本(参考7.x版-2.1)。 这正好您的自定义模块:

/**
 * Implementation of hook_menu_alter().
 */
function custom_menu_alter(&$items) {
  $items['node_reference/autocomplete/%/%/%']['page callback'] = 'custom_new_node_reference_autocomplete';
}

/**
 * Implementation of Menu callback for the autocomplete results.
 */
function custom_new_node_reference_autocomplete($entity_type, $bundle, $field_name, $string = '') {
  $field = field_info_field($field_name);
  $instance = field_info_instance($entity_type, $field_name, $bundle);

  $options = array(
    'string' => $string,
    'match' => $instance['widget']['settings']['autocomplete_match'],
    'limit' => 10,
  );
  $references = node_reference_potential_references($field, $options);

  $matches = array();
  foreach ($references as $id => $row) {
    // Markup is fine in autocompletion results (might happen when rendered
    // through Views) but we want to remove hyperlinks.
    $suggestion = preg_replace('/<a href="([^<]*)">([^<]*)<\/a>/', '$2', $row['rendered']);
    // Add a class wrapper for a few required CSS overrides.
    $matches[$row['title']] = '<div class="reference-autocomplete">' . $suggestion . '</div>'; // this is the line that was modified to remove the "[nid:XX]" disambiguator
  }

  drupal_json_output($matches);
}


文章来源: Removing [nid:n] in nodereference autocomplete