使用自动填充字段为CCK nodereference始终显示节点ID作为一个神秘的括号扩展:
Page Title [nid:23]
据我所知,这可以确保选择在节点的情况下具有独特的标题相同,但显然这是暴露给用户一个讨厌的事情。
有没有人曾在删除这些括号,或添加不同的唯一标识符的任何成功?
使用自动填充字段为CCK nodereference始终显示节点ID作为一个神秘的括号扩展:
Page Title [nid:23]
据我所知,这可以确保选择在节点的情况下具有独特的标题相同,但显然这是暴露给用户一个讨厌的事情。
有没有人曾在删除这些括号,或添加不同的唯一标识符的任何成功?
最后,你需要改变的输出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>';
我相信标识符是在这一点上,这意味着你也可以改变,只要你喜欢的文字纯粹的外观。 如果不是纯粹的外观,不错,我还没有测试,看看在错误的条件下会发生什么。
我总想找出如何做到这一点。 感谢您与您的问题,激励我。
什么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个缺点:
所以,你必须想一想,才去这条路线。 特别是,因为你很可能将无法找到错误的节点的选择的问题,它应该发生。 另外一点需要注意的,就是NID显示出来,也带给用户一些有价值的信息,一个快速的方法来查找节点,他们应该会有疑问,如果这是他们想要的,如果几个节点也有类似的标题。
我Grayside的答案工作,但我不得不用MENU改变,而不是形式改变他张贴。 没有biggy!
function custommodule_menu_alter(&$items) {
$items['nodereference/autocomplete']['page callback'] = 'fp_tweaks_nodereference_autocomplete';
}
我找到了一个替代解决办法是改变你的widget类型选择列表,然后使用选择的模块到你的列表转换为自动完成场。
这种处理节点具有相同的标题,实际上我认为用户界面是不是由自动完成构件提供了一个更好的。
任何人碰到这个(相当古老)的话题来通过谷歌搜索的方式 - 为Drupal 7,请考虑使用的EntityReference模块和“实体引用”字段类型如果可能的话。
您可以在acheive配置了很多与“实体引用”字段。 它没有这个问题,方括号中的NID。
这里是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);
}