Удаление [nid: n] в автозаполнении nodereference
Использование поля автозаполнения для nodereference cck всегда отображает идентификатор node как расширение с закрытым расширением:
Page Title [nid:23]
Я понимаю, что это гарантирует, что выбор уникален, если узлы имеют одинаковый заголовок, но, очевидно, это неприятная вещь для пользователя.
Кто-нибудь имел успех в удалении этих скобок или добавлении другого уникального идентификатора?
Ответы
Ответ 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>';
Удаление ссылки Нид.
$matches[$row['title']] = '<div class="reference-autocomplete">'. $row['rendered'] . '</div>';
Я считаю, что идентификатор на данный момент является чисто косметическим, что означает, что вы также можете изменить текст, как вам нравится. Если это не чисто косметика, ну, я не проверял, что произойдет в неправильных условиях.
Я всегда хотел определить, как это сделать. Благодарим вас за то, что вы мотивировали меня своим вопросом.
Ответ 2
Что Grayside разместил, будет работать... пока у вас нет двух узлов с тем же названием. Другими словами, если вы хотите сделать то, что предложил Грейсид, вам нужно знать, что нид не совсем неважен. Функция nodereference_autocomplete_validate() выполняет две вещи. Он проверяет, соответствует ли node, и если да, то он передает nid, устанавливая его в массив $form_state
. Если он не может найти node, он установит ошибку. Если присутствует нид, он будет использоваться для получения node, который также выполняется быстрее, код здесь:
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, и проверяет, соответствует ли этот node заголовок, если так передается nid.
Второй вариант немного медленнее, но здесь могут произойти ошибки. Если вы выполните выполнение, вы увидите, что если попытается найти node только на основе заголовка и примет первый node, который соответствует. Результатом этого является то, что если у вас есть два узла с одним заголовком, один из них всегда будет использоваться. Для вас это не проблема, но дело в том, что вы никогда не узнаете, если это произойдет. Все будет работать нормально, и пользователь подумает, что он выбрал node, который хотел. Это может быть так, но он мог бы также выбрать неправильный node.
Короче говоря, вы можете избавиться от nid в обратном вызове автозаполнения, но у него есть два недостатка:
- производительность (мало)
- неопределенность при выборе правильного node.
Поэтому вам нужно подумать об этом, прежде чем идти по этому маршруту. Тем более, что вы, скорее всего, не сможете найти проблему выбора неправильных узлов, если это произойдет. Еще одна вещь, о которой нужно помнить, заключается в том, что при открытии низа также добавляется некоторая ценная информация для пользователей, быстрый способ поиска node, если они будут сомневаться в том, что это тот, который им нужен, если несколько узлов имеют похожие названия.
Ответ 3
Я получил ответ Грейсид на работу, но мне пришлось использовать МЕНЮ alter, вместо изменения FORM, которое он опубликовал. Нет большой!
function custommodule_menu_alter(&$items) {
$items['nodereference/autocomplete']['page callback'] = 'fp_tweaks_nodereference_autocomplete';
}
Ответ 4
Я нашел альтернативное решение, чтобы изменить тип вашего виджетов, чтобы выбрать список, а затем использовать выбранный модуль, чтобы преобразовать ваш список в поле автозаполнения.
Это обрабатывает узлы с тем же заголовком, и на самом деле я думаю, что пользовательский интерфейс лучше, чем тот, который предоставляется виджетами автозаполнения.
Ответ 5
Для тех, кто сталкивается с этой (довольно старой) темой путем поиска в Google - для Drupal 7, пожалуйста, подумайте, если возможно, использовать тип ссылки и тип поля "Entity Reference".
Вы можете получить гораздо больше в конфигурации с полем "Ссылка на объекты". У этой проблемы нет проблемы с nid в квадратных скобках.
Ответ 6
Вот полная версия Drupal 7 (ссылки 7.x-2.1) ответа Grayside. Это относится к вашему пользовательскому модулю:
/**
* 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);
}