Удаление [nid:n] в автозаполнении nodereference

Использование поля автозаполнения для ссылки на узел cck всегда отображает идентификатор узла в виде загадочного расширения в квадратных скобках:

Page Title [nid:23]

Я понимаю, что это гарантирует, что выбор будет уникальным в случае, если узлы имеют одинаковый заголовок, но, очевидно, это неприятная вещь для пользователя.

Кому-нибудь удалось удалить эти скобки или добавить другой уникальный идентификатор?


person ack    schedule 04.10.2009    source источник


Ответы (6)


В конечном итоге вам нужно изменить вывод 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>';

Я считаю, что на данный момент идентификатор является чисто косметическим, что означает, что вы также можете изменить текст по своему усмотрению. Если это не чисто косметическое, ну, я не проверял, что произойдет в неправильных условиях.

Я всегда хотел определить, как это сделать. Спасибо, что мотивировали меня своим вопросом.

person Grayside    schedule 04.10.2009
comment
Это хорошо тем, что удаляет [nid: 123] из поля зрения после выбора узла, но [nid: 123] по-прежнему появляется при загрузке узла для его редактирования. Я хотел бы иметь возможность удалить отображение nid при редактировании узла. Хорошо, теперь я вижу это: stackoverflow.com/questions/2743924/ - person Darrell Duane; 09.10.2012

То, что опубликовал Грейсайд, будет работать ... до тех пор, пока у вас нет двух узлов с одинаковым названием. Другими словами, если вы хотите сделать то, что предлагает Грейсайд, вам нужно знать, что нид не совсем неважен. Функция 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 передается.

Второй вариант немного медленнее, но именно здесь могут возникать ошибки. Если вы проследите за выполнением, вы увидите, что if попытается найти узел, основываясь только на заголовке, и возьмет первый соответствующий узел. Результатом этого является то, что если у вас есть два узла с одинаковым заголовком, один из них всегда будет использоваться. Это может не быть проблемой для вас, но дело в том, что вы никогда не узнаете, если это произойдет. Все будет работать нормально, и пользователь будет думать, что он выбрал нужный узел. Возможно, так оно и есть, но с тем же успехом он мог выбрать не тот узел.

Короче говоря, вы можете избавиться от nid в обратном вызове автозаполнения, но у него есть 2 недостатка:

  1. производительность (немного)
  2. неуверенность в выборе правильного узла.

Так что вам нужно подумать об этом, прежде чем идти по этому пути. Тем более, что проблему выбора неправильных узлов вы, скорее всего, не сможете обнаружить, если это произойдет. Еще одна вещь, о которой следует помнить, это то, что появление nid также приносит некоторую ценную информацию пользователям, быстрый способ поиска узла, если они сомневаются, что это тот, который им нужен, если несколько узлов имеют похожие названия. .

person googletorp    schedule 04.10.2009
comment
Спасибо за уточнение деталей. Если вы можете предположить уникальные заголовки узлов, то это всего падение производительности при отправке, а не повреждение точки ссылки на узел. - person Grayside; 05.10.2009
comment
в конечном итоге вы можете использовать javascript, который помещает часть [nid: %id] в скрытое поле ввода, а затем реконструирует текстовое поле перед отправкой формы - person gpilotino; 18.03.2010

Я получил ответ Грейсайда на работу, но мне пришлось использовать изменение МЕНЮ вместо изменения ФОРМЫ, которое он опубликовал. Нет большого!

function custommodule_menu_alter(&$items) {
  $items['nodereference/autocomplete']['page callback'] = 'fp_tweaks_nodereference_autocomplete';
}
person Brad Klaver    schedule 28.05.2010
comment
ак! Опечатка. Спасибо, изменится в моем ответе. - person Grayside; 06.06.2010

Я нашел альтернативное решение: изменить тип виджета на список выбора, а затем использовать выбранный модуль для преобразовать список в поле автозаполнения.

Это обрабатывает узлы с одинаковым заголовком, и на самом деле я думаю, что пользовательский интерфейс лучше, чем тот, который предоставляется виджетом автозаполнения.

person Felix Eve    schedule 07.03.2014

Всем, кто наткнется на эту (довольно старую) тему через поиск в Google — для Drupal 7, пожалуйста, рассмотрите возможность использования модуля entityreference и типа поля «Ссылка на сущность», если это возможно.

Вы можете добиться гораздо большего в конфигурации с полем «Ссылка на объект». У него нет этой проблемы с nid в квадратных скобках.

person mcaleaa    schedule 31.07.2015

Вот полная версия 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);
}
person River Liver    schedule 23.06.2016