Drupal 删除节点引用自动完成中的[nid:n]

Drupal 删除节点引用自动完成中的[nid:n],drupal,drupal-6,cck,Drupal,Drupal 6,Cck,使用cck节点引用的“自动完成”字段始终将节点id显示为隐藏的括号扩展名: Page Title [nid:23] 我知道这确保了在节点具有相同标题的情况下选择是唯一的,但显然这是一件让用户难以接受的事情 是否有人成功地删除了这些括号或添加了不同的唯一标识符?最终,您需要更改nodereference.module中的nodereference\u autocomplete()的输出 要正确地执行此操作,您需要一个自定义模块干净地重写该函数 此函数定义为菜单回调,因此 /** * Imple

使用cck节点引用的“自动完成”字段始终将节点id显示为隐藏的括号扩展名:

Page Title [nid:23]
我知道这确保了在节点具有相同标题的情况下选择是唯一的,但显然这是一件让用户难以接受的事情


是否有人成功地删除了这些括号或添加了不同的唯一标识符?

最终,您需要更改nodereference.module中的
nodereference\u autocomplete()
的输出

要正确地执行此操作,您需要一个自定义模块干净地重写该函数

此函数定义为菜单回调,因此

/**
 * 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>';
$matches[$row['title']。“[nid:$id]”]=''$行['rendered'].';
正在删除nid引用

$matches[$row['title']] = '<div class="reference-autocomplete">'. $row['rendered'] . '</div>';
$matches[$row['title']]=''$行['rendered'].';
我认为标识符在这一点上纯粹是装饰性的,这意味着您也可以随意更改文本。如果它不是纯粹的化妆品,那么,我还没有测试过在错误的条件下会发生什么


我一直想知道怎么做。谢谢你用你的问题来激励我。

格雷赛德所发布的内容将起作用。。。只要没有两个标题相同的节点。换句话说,如果您想按照Grayside的建议去做,您需要意识到nid并非完全不重要。这个函数做两件事。它检查是否有匹配的节点,如果有,则将nid传递到on,将其设置为
$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

第二个选项稍微慢一点,但在这里可能会发生错误。如果您跟随执行,您将看到,If将尝试仅基于title查找节点,并将获取匹配的第一个节点。这样做的结果是,如果您有两个具有相同标题的节点,则将始终使用其中一个节点。这对你来说可能不是问题,但问题是,如果发生这种情况,你永远不会发现。一切正常,用户会认为他选择了想要的节点。可能是这样,但他也可能选择了错误的节点

因此,简而言之,可以在自动完成回调中去除nid,但它有两个缺点:

  • 性能(很少)
  • 选择正确节点时的不确定性

  • 所以在走这条路之前,你必须考虑一下。特别是,如果出现错误的节点选择问题,您很可能无法找到问题。另一件需要注意的事情是,nid的出现,也给用户带来了一些有价值的信息,这是一种快速查找节点的方法,如果用户怀疑它是否是他们想要的,如果有几个节点具有类似的标题。

    我得到了Grayside的答案,但我不得不使用菜单更改,而不是他发布的表单更改。没什么大不了的

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

    我发现另一种解决方案是将小部件类型更改为selectlist,然后使用将列表转换为autocomplete字段


    处理具有相同标题的节点,实际上我认为UI比AutoCu饰子小部件所提供的更好。

    < P>对于任何通过谷歌搜索来访问这个(相当老)主题的Drupal 7,如果可能的话,请考虑使用实体引用模块和“实体引用”字段类型。
    通过“实体引用”字段,您可以在配置中获得更多。方括号中的nid没有这个问题。

    这是Grayside答案的完整Drupal7版本(参考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);
    }
    
    /**
    *hook_menu_alter()的实现。
    */
    功能自定义菜单更改(&$items){
    $items['node\u reference/autocomplete/%/%/%]['page callback']='custom\u new\u node\u reference\u autocomplete';
    }
    /**
    *实现自动完成结果的菜单回调。
    */
    函数自定义\新\节点\引用\自动完成($entity\类型,$bundle,$field\名称,$string=''){
    $field=字段\信息\字段($field\名称);
    $instance=field\u info\u instance($entity\u type,$field\u name,$bundle);
    $options=array(
    'string'=>$string,
    'match'=>$instance['widget']['settings']['autocomplete\u match'],
    “限制”=>10,
    );
    $references=节点\参考\潜在\参考($field,$options);
    $matches=array();
    foreach($id=>$row的引用){
    //标记在自动完成结果中没有问题(渲染时可能发生
    //通过视图)但我们希望删除超链接。
    
    $suggestion=preg_replace('/([^感谢您澄清详细信息。如果您可以假定节点标题是唯一的,那么这只是提交时的性能问题,而不是节点引用损坏点。最终,您可以使用javascript将[nid:%id]在提交formAck!打字错误之前,先在一个隐藏的输入字段中添加一部分,然后重新构建文本字段。谢谢,我的答案将发生变化。这很好,因为在选择节点后,它会从视图中删除[nid:123],但[nid:123]加载节点进行编辑时仍会显示。我希望能够在编辑节点时删除显示的nid。好的,现在我看到以下内容: