Премахване на [nid:n] в автодовършване на препратка към възел

Използването на полето за автоматично попълване за cck nodereference винаги показва идентификатора на възела като загадъчно разширение в скоби:

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

Това, което е публикувал Grayside, ще работи... стига да нямате два възела с едно и също заглавие. С други думи, ако искате да направите както предлага 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 се предава.

Вторият вариант е малко по-бавен, но тук могат да възникнат грешки. Ако проследите изпълнението, ще видите, че 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

Накарах отговора на Grayside да работи, но трябваше да използвам промяната на MENU, вместо промяната на FORM, която той публикува. Не голям!

function custommodule_menu_alter(&$items) {
  $items['nodereference/autocomplete']['page callback'] = 'fp_tweaks_nodereference_autocomplete';
}
person Brad Klaver    schedule 28.05.2010
comment
Ack! Печатна грешка. Благодаря ви, ще се промени отговорът ми. - person Grayside; 06.06.2010

Намерих алтернативно решение е да промените типа на джаджата си, за да изберете списък и след това да използвате избрания модул за конвертирайте вашия списък в поле за автоматично попълване.

Това обработва възли със същото заглавие и всъщност мисля, че потребителският интерфейс е по-добър от този, предоставен от приспособлението за автоматично довършване.

person Felix Eve    schedule 07.03.2014

За всеки, който попада на тази (доста стара) тема чрез търсене в Google - за Drupal 7, моля, помислете дали да не използвате модул за справка на обект и тип поле "Референция на обект", ако е възможно.

Можете да постигнете много повече в конфигурацията с полето „Референция на обекта“. Няма този проблем с 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="/bg([^<]*)">([^<]*)<\/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