2009-10-04 9 views
13

utilizando el campo de autocompletar para un nodereference CCK siempre muestra el ID de nodo como un críptico extensión entre corchetes:Extracción [nid: n] en función de autocompletar nodereference

Page Title [nid:23] 

entiendo que esto asegura que las selecciones son únicos en nodos de casos tienen el mismo título, pero obviamente esto es algo desagradable para exponer al usuario.

¿Alguien ha tenido éxito al eliminar estos corchetes o al agregar un identificador único diferente?

Respuesta

17

En última instancia, debe cambiar la salida de nodereference_autocomplete() en nodereference.module.

Para hacer esto correctamente, desea un módulo personalizado para anular limpiamente la función.

Esta función se define como una devolución de llamada del menú, por lo tanto,

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

A continuación, copie la función nodereference_autocomplete en su módulo personalizado, cambiando su nombre para que coincida con su devolución de llamada. A continuación, cambie esta línea:

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

Quitando la referencia nid.

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

creo que el identificador es puramente cosmética en este punto, lo que significa que podría también cambiar el texto como usted quiera. Si no es puramente cosmético, bueno, no he probado para ver qué sucederá en las condiciones incorrectas.

Siempre quise identificar cómo hacer esto. Gracias por motivarme con tu pregunta.

+0

Esto es bueno, ya que elimina la [nid: 123] de la vista después de seleccionar un nodo, pero el [nid: 123] todavía aparece al cargar el nodo para editarlo . Me gustaría poder eliminar el nid para que no se muestre cuando edite el nodo. Ok, ahora veo esto: http://stackoverflow.com/questions/2743924/how-remove-node-id-nidn-in-nodereference-fields –

6

Lo que Grayside ha publicado funcionará ... siempre y cuando no tenga dos nodos con el mismo título. En otras palabras, si desea hacer lo que Grayside ha propuesto, debe tener en cuenta que el nid no es del todo irrelevante. La función nodereference_autocomplete_validate() hace dos cosas. Verifica si hay un nodo que coincida, y si es así, pasa el nid on, configurándolo en la matriz $form_state. Si no puede encontrar un nodo, establecerá un error. Si el NID está presente, se utiliza para obtener el nodo, que también es más rápido, el código está aquí:

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

Esto se comprueba para ver si hay un nid y comprueba si ese nodo coincide con el título, si es así, se pasa el nid.

La segunda opción es un poco más lenta, pero es aquí donde pueden ocurrir errores. Si sigue la ejecución, verá que intentará encontrar un nodo basándose solo en el título y tomará el primer nodo que coincida. El resultado de esto es que si tiene dos nodos con el mismo título, uno de ellos siempre será utilizado. Puede que esto no sea un problema para ti, pero el hecho es que nunca sabrás si esto sucede. Todo funcionará bien y el usuario pensará que seleccionó el nodo que quería. Este podría ser el caso, pero bien podría haber elegido el nodo equivocado.

Así que en resumen, se puede deshacerse del NID en la devolución de llamada de autocompletar, pero tiene 2 inconvenientes:

  1. rendimiento (poco)
  2. incertidumbre en la selección del nodo correcto.

Así que tienes que pensar en ello, antes de seguir esta ruta. Especialmente, ya que lo más probable es que no pueda encontrar el problema de la selección de los nodos incorrectos, en caso de que ocurra. Otra cosa a tener en cuenta, es que el nid que se muestra, también trae información valiosa a los usuarios, una forma rápida de buscar el nodo, si tienen dudas si es el que desean, si varios nodos tienen títulos similares .

+0

Gracias por aclarar los detalles. Si puede asumir títulos de nodos únicos, entonces es * solo * un golpe de rendimiento en el envío, no un punto de corrupción nodereferencia. – Grayside

+0

finalmente puede usar un javascript que coloca la parte [nid:% id] en un campo de entrada oculto y luego reconstruye el campo de texto antes de enviar el formulario – gpilotino

0

Recibí la respuesta de Grayside para trabajar, pero tuve que usar el botón Modificar, en lugar del FORMULARIO alterado que publicó. No biggy!

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

¡Ack! Error de tipografía. Gracias, cambiará en mi respuesta. – Grayside

0

he encontrado una solución alternativa es cambiar su tipo de widget para seleccionar la lista y luego usar el chosen module para convertir su lista a un campo de autocompletar.

Esto maneja los nodos con el mismo título, y en realidad creo que la interfaz de usuario es mejor que la proporcionada por el widget de autocompletar.

0

Para cualquier persona que se encuentre con este tema (bastante antiguo) por medio de una búsqueda en Google, para Drupal 7 considere usar el módulo de entidad de referencia y el tipo de campo "Referencia de entidad" si es posible.

Puede lograr mucho más en la configuración con un campo "Referencia de entidad". No tiene este problema con el nid entre corchetes.

0

Aquí está la versión completa de Drupal 7 (Referencias 7.x-2.1) de la respuesta de Grayside. Esto va en su módulo personalizado:

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