ack*_*ack 13 drupal cck drupal-6
使用cck nodereference的自动完成字段始终将节点ID显示为隐藏的括号扩展名:
Page Title [nid:23]
Run Code Online (Sandbox Code Playgroud)
我知道这可以确保选择在节点具有相同标题的情况下是唯一的,但显然这对于向用户公开是件令人讨厌的事情.
有没有人在删除这些括号或添加不同的唯一标识符方面有任何成功?
Gra*_*ide 17
最终,您需要更改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';
}
Run Code Online (Sandbox Code Playgroud)
然后,将nodereference_autocomplete函数复制到自定义模块中,更改其名称以匹配您的回调.然后改变这一行:
$matches[$row['title'] ." [nid:$id]"] = '<div class="reference-autocomplete">'. $row['rendered'] . '</div>';
Run Code Online (Sandbox Code Playgroud)
删除nid引用.
$matches[$row['title']] = '<div class="reference-autocomplete">'. $row['rendered'] . '</div>';
Run Code Online (Sandbox Code Playgroud)
我相信标识符在这一点上纯粹是装饰性的,这意味着您也可以随意更改文本.如果它不是纯粹的化妆品,那么,我还没有测试过在错误的条件下会发生什么.
我一直想确定如何做到这一点.感谢您激励我提问.
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']))));
}
}
Run Code Online (Sandbox Code Playgroud)
这只是检查是否有nid并检查该节点是否与标题匹配,如果是,则传递nid.
第二个选项有点慢,但在这里可能会发生错误.如果您按照执行进行操作,您将看到if if将尝试仅基于标题查找节点,并将获取匹配的第一个节点.结果是,如果您有两个具有相同标题的节点,则将始终使用其中一个节点.这对你来说可能不是问题,但事实是,你永远不会发现这是否会发生.一切都会正常工作,用户会认为他选择了他想要的节点.情况可能如此,但他也可能选择了错误的节点.
简而言之,你可以在自动完成回调中摆脱nid,但它有两个缺点:
所以在走这条路之前你必须考虑一下.特别是,因为你很可能无法找到选择错误节点的问题,所以它应该发生.需要注意的另一件事是,nid出现,也为用户带来了一些有价值的信息,一种查找节点的快捷方式,如果它们是他们想要的那个,如果有几个节点有相似的标题,他们是否有疑问.