Удаление [nid: n] в автозаполнении узла - PullRequest
13 голосов
/ 04 октября 2009

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

Page Title [nid:23]

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

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

Ответы [ 6 ]

17 голосов
/ 04 октября 2009

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

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

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

6 голосов
/ 05 октября 2009

То, что опубликовал 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.

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

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

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

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

0 голосов
/ 23 июня 2016

Вот полная версия 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);
}
0 голосов
/ 31 июля 2015

Всем, кто сталкивался с этой (довольно старой) темой посредством поиска в Google - для Drupal 7, пожалуйста, рассмотрите возможность использования модуля entityreference и типа поля "Entity Reference", если возможно.

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

0 голосов
/ 07 марта 2014

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

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

0 голосов
/ 29 мая 2010

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

function custommodule_menu_alter(&$items) {
  $items['nodereference/autocomplete']['page callback'] = 'fp_tweaks_nodereference_autocomplete';
}
...