2009-10-04 8 views
13

Stosując pola AutoComplete dla nodereference CCK zawsze wyświetlany identyfikator węzła jako kryptycznego nawiasami rozszerzenia:Usuwanie [NID n] w nodereference autouzupeĹ,nianiu

Page Title [nid:23] 

I zrozumieć, że to sprawia, że ​​wybór jest unikalny w przypadku węzłów mają ten sam tytuł, ale oczywiście jest to nieprzyjemna rzecz do ujawnienia użytkownikowi.

Czy ktoś miał jakiś sukces w usuwaniu tych nawiasów lub dodawaniu innego unikalnego identyfikatora?

Odpowiedz

17

Ostatecznie, musisz zmienić wyjście nodereference_autocomplete() w nodereference.module.

Aby zrobić to prawidłowo, chcesz, aby moduł niestandardowy w sposób oczywisty zastępował funkcję.

Funkcja ta jest określana jako zwrotnego menu, a tym samym

/** 
* Implementation of hook_menu_alter(). 
*/ 
function custom_module_menu_alter(&$items) { 
    $items['nodereference/autocomplete']['page callback'] = 'custom_module_new_nodereference_autocomplete'; 
} 

Następnie skopiuj funkcję nodereference_autocomplete do modułu niestandardowego, zmieniając jego nazwę, aby dopasować swój zwrotnego. Następnie zmień tę jedną linię:

$matches[$row['title'] ." [nid:$id]"] = '<div class="reference-autocomplete">'. $row['rendered'] . '</div>'; 

Upuszczenie numeru referencyjnego.

$matches[$row['title']] = '<div class="reference-autocomplete">'. $row['rendered'] . '</div>'; 

Uważam, że identyfikator jest w tym momencie czysto kosmetyczny, co oznacza, że ​​można również zmienić tekst, jak tylko chcesz. Jeśli to nie jest czysto kosmetyczne, cóż, nie testowałem, aby zobaczyć, co się stanie w złych warunkach.

Zawsze chciałem wskazać, jak to zrobić. Dziękuję za motywowanie mnie swoim pytaniem.

+0

To miłe, że usuwa on [NID: 123] z widokiem po wybraniu węzła, ale [nid: 123] nadal pojawia się podczas ładowania węzła do edycji . Chciałbym móc usunąć nid z wyświetlania podczas edycji węzła. Ok, teraz widzę to: http://stackoverflow.com/questions/2743924/how-remove-node-id-nidn-in-nodereference-fields –

6

Opublikowany przez Grayside będzie działał ... o ile nie masz dwóch węzłów o tym samym tytule. Innymi słowy, jeśli chcesz zrobić tak, jak proponował Grayside, musisz mieć świadomość, że nid nie jest całkowicie nieważny. Funkcja nodereference_autocomplete_validate() robi dwie rzeczy. Sprawdza, czy istnieje węzeł, który pasuje, a jeśli tak, przechodzi przez nid, ustawiając go na tablicę $form_state. Jeśli nie może znaleźć węzła, ustawi błąd. Jeśli nid jest obecny, będzie on używany do dostać węzeł, który również jest szybsze, kod jest tutaj:

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

To właśnie sprawdza, czy istnieje nid i sprawdza czy ten węzeł meczów z title, jeśli tak, to nid jest przekazywany dalej.

Druga opcja jest nieco wolniejsza, ale tutaj błędy mogą się zdarzyć. Jeśli będziesz śledzić wykonanie, zobaczysz, że jeśli spróbujesz znaleźć węzeł na podstawie samego tytułu i weźmie pierwszy zgodny węzeł. Wynikiem tego jest to, że jeśli masz dwa węzły o tym samym tytule, jeden z nich będzie zawsze używany. To może nie być problem dla ciebie, ale chodzi o to, że nigdy się nie dowiesz, czy tak się stanie. Wszystko będzie działało dobrze, a użytkownik pomyśli, że wybrał węzeł, który chciał. Może tak być, ale równie dobrze mógłby wybrać niewłaściwy węzeł.

Tak w skrócie, to może pozbyć NID w zwrotnego autouzupełniania, ale ma 2 wady:

  1. wydajność (mało)
  2. niepewności w wyborze odpowiedniego węzła.

Musisz się nad tym zastanowić, zanim pójdziesz tą drogą. Zwłaszcza, że ​​najprawdopodobniej nie będziecie w stanie znaleźć problemu wyboru niewłaściwych węzłów, jeśli tak się stanie. Inną rzeczą, o której należy pamiętać, jest to, że nid pojawia się, przynosi również pewne cenne informacje do użytkowników, szybki sposób na sprawdzenie węzła, jeśli mają wątpliwości, czy to jest to, czego chcą, jeśli kilka węzłów ma podobne tytuły .

+0

Dziękuję za wyjaśnienie szczegółów. Jeśli możesz zakładać unikalne tytuły węzłów, to jest to * tylko * trafienie wydajnościowe w przypadku przesłania, a nie punkt zniszczenia nodereferencji. – Grayside

+0

ostatecznie możesz użyć javascriptu, który umieści część [nid:% id] w ukrytym polu wejściowym, a następnie zrekonstruuj pole tekstowe przed przesłaniem formularza – gpilotino

0

Mam odpowiedź Grayside'a do pracy, ale musiałem użyć opcji MENU alter, zamiast FORMULARZ zmiany, którą opublikował. Żadnego biggy!

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

Ack! Typo. Dziękuję, zmieni się w mojej odpowiedzi. – Grayside

0

Znalazłem alternatywnym rozwiązaniem jest zmienić rodzaj widget do listy wyboru, a następnie użyć chosen module do konwersji listy do pola autouzupełniania.

Obsługuje węzły o tym samym tytule, a właściwie uważam, że interfejs jest lepszy niż ten, który jest dostarczany przez widget autouzupełniania.

0

Każdemu, kto przechodzi przez ten (raczej stary) temat w drodze wyszukiwania google - w przypadku Drupala 7 należy rozważyć użycie modułu entityreference i typu pola "Entity Reference", jeśli to możliwe.

Możesz osiągnąć znacznie więcej w konfiguracji dzięki polu "Entity Reference". Nie ma tego problemu z nid w nawiasach kwadratowych.

0

Oto pełna wersja Drupala 7 (Referencje 7.x-2.1) odpowiedzi Greyside'a. To idzie w module niestandardowe:

/** 
* 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); 
}