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