2009-10-04 1 views
13

Использование поля автозаполнения для ССК nodereference всегда отображает идентификатор узла как зашифрованное в квадратные скобки расширения:Удаление [нидь: п] в nodereference автозаполнения

Page Title [nid:23] 

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

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

ответ

17

В конечном счете, вам необходимо изменить вывод 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>'; 

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

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

+0

Это хорошо, что она удаляет [NID: 123] из поля зрения после того, как выбран узел, но [нидь: 123] по-прежнему появляется при загрузке узла для редактирования , Я хочу, чтобы удалить ник из отображения, когда я редактирую узел. Хорошо, теперь я вижу это: http://stackoverflow.com/questions/2743924/how-remove-node-id-nidn-in-nodereference-fields –

6

Что отправил Grayside, будет работать ... пока у вас нет двух узлов с тем же названием. Другими словами, если вы хотите сделать то, что предложил Грейсид, вам нужно знать, что нид не совсем неважен. Функция nodereference_autocomplete_validate() выполняет две функции. Он проверяет, соответствует ли узел, и если да, то он пропускает nid, устанавливая его в массив $form_state. Если он не может найти узел, он установит ошибку. Если нидь присутствует, то он будет использоваться, чтобы получить узел, который также является быстрее, код здесь:

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'])))); 
     } 
    } 

Это просто проверяет, есть ли нидь и проверяет, что узел соответствует с title, если так, то nid передается.

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

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

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

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

+0

Благодарим вас за разъяснение деталей. Если вы можете взять на себя уникальные названия узлов, то это * только * удар производительности для submit, а не точка повреждения нодеремента. – Grayside

+0

в конечном итоге вы можете использовать javascript, который поместил часть [nid:% id] в скрытое поле ввода, затем восстановит текстовое поле перед отправкой формы – gpilotino

0

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

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

Ack! Опечатка. Спасибо, изменится в моем ответе. – Grayside

0

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

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

0

Для всех, кто сталкивается с этой (довольно старой) темой путем поиска в Google - для Drupal 7, пожалуйста, подумайте об использовании модуля сущности и типа поля «Сущность», если это возможно.

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

0

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