'Agregar más' widget de término de taxonomía


8

Estoy tratando de crear un widget de campo que sea similar al widget de referencia de término normal con una diferencia clave. El usuario debe poder agregar varios términos nuevos de taxonomía al mismo tiempo, esto puede demostrarlo mejor:

ingrese la descripción de la imagen aquí

Llegué a un punto en el que la funcionalidad es similar a la que proporcionan los módulos de taxonomía / opciones / lista (es decir, se muestran las casillas de verificación / radios, guardar, etc.)

Aquí hay un fragmento importante del código que estoy usando hook_field_widget_form():

 $element += array(
    '#type' => $multiple ? 'checkboxes' : 'radios',
    '#default_value' => $multiple ? $default_value : reset($default_value),
    '#options' => $options,
    '#value_key' => $value_key,
    '#element_validate' => array('options_field_widget_validate'),
    '#properties' => $properties,
  );

Lo que me arroja aquí es que $ element no es su matriz de formulario habitual, por lo que no estoy seguro de cómo agregar el campo de texto y el botón, especialmente porque sus valores no están destinados a ser guardados. ¿Cuál es la mejor manera de agregar estos campos a mi widget?

En cuanto a agregar el Javascript necesario, ¿estoy en lo cierto al pensar que debería usar #ajax que llama a una función que reconstruye las #opciones para las casillas de verificación?

¡Gracias por adelantado!

EDITAR: mi pregunta inicial fue bastante vaga, aquí hay algunos detalles más sobre lo que he intentado:

  $element += array(
    '#type' => 'fieldset',
    '#delta' => $delta,
  );

  $element['value'] = array(
    '#type' => $multiple ? 'checkboxes' : 'radios',
    '#default_value' => $multiple ? $default_value : reset($default_value),
    '#options' => $options,
    '#value_key' => $value_key,
    '#element_validate' => array('options_field_widget_validate'),
    '#properties' => $properties,
  );

  $element['text'] = array(
    '#type' => 'textfield',
    '#title' => t('Add another'),
    '#weight' => 5,
  );

Esta es una amalgama de varios ejemplos que he visto y parece acercarme. El problema es que cuando envío el formulario de entidad obtengo el siguiente error:

Aviso: Índice indefinido: tid en taxonomy_field_is_empty () (línea 1402 de modules \ taxonomy \ taxonomy.module).

He echado un vistazo más de cerca a esta función y se espera $itemtener la estructura $item = array('tid', 2). Cuando se usa el código anterior, parece haber un delta que viene de algún lado y la estructura de $itemtermina siendo $item = array(0, array('tid', 2). No puedo averiguar de dónde viene '0'.

OTRA EDICIÓN

He podido corregir el error anterior con el siguiente código alterando $ element así:

$element += array(
    '#type' => 'fieldset',
    '#process' => array('taxonomy_free_entry_ignore_parent'),
);

y agregando la función:

function taxonomy_free_entry_ignore_parent(&$form, &$form_state, $complete) {
  array_pop($form['#parents']);
  return $form;
}

Cuando guardo la entidad, recibo un mensaje que me dice que se ha guardado. Cuando reviso la tabla para el campo, no se está guardando. ¿Qué estoy haciendo mal?

Respuestas:


2

Estoy seguro de que podría hacer esto hook_field_widget_form()(que supongo que es donde está su código actual) simplemente agregando un elemento secundario a su elemento existente, por ejemplo

$element['text'] = array(
  '#type' => 'textfield',
  '#title' => 'Title',
  // etc...
);

Si eso no funciona, sé que definitivamente funcionará si lo usas hook_field_widget_form_alter().

Por ejemplo, la siguiente es una pequeña función que habilita el altcampo para un tipo de campo Imagen usando el widget Selector de medios (por alguna razón no está habilitado de manera predeterminada):

function media_image_attributes_field_widget_form_alter(&$element, &$form_state, &$context) {
  if ($context['field']['type'] == 'image') {
    $element['alt'] = array(
      '#type' => 'textfield',
      '#title' => 'Image Description',
      '#weight' => 10000,
      '#default_value' => count($element['#default_value']) ? $element['#default_value']['alt'] : ''
    );
  }
}

En cuanto a la funcionalidad de ajax, creo que definitivamente vas por la línea correcta. Creo que el módulo Field Example en Ejemplos tiene algún código de muestra que podría ayudar.


Gracias por la respuesta, lo he votado porque me ha dado buena información para continuar, ¡pero aún no la he respondido! Mira mi edición que ofrece más información sobre lo que he probado gracias a tu respuesta.
splatio

@splat, ¿ha podido implementar un widget de trabajo? ¿Estarías dispuesto a compartirlo?
Joe Beuckman

Lo siento, Joe, ¡no pude resolver esto y terminé usando un enfoque complejo diferente! Si lo resuelve, publíquelo aquí, ya que me interesaría cómo en el futuro. También felizmente lo acepto como respuesta.
splatio

@plato ¿Puedes dar alguna información sobre tu enfoque alternativo?
vfclists


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.