Widget Termine tassonomia "Aggiungi altro"


8

Sto cercando di creare un widget di campo simile al normale widget di riferimento con una differenza chiave. L'utente deve essere in grado di aggiungere più nuovi termini di tassonomia contemporaneamente, questo può dimostrarlo meglio:

inserisci qui la descrizione dell'immagine

Sono arrivato a un punto in cui la funzionalità è simile a quella fornita dai moduli di tassonomia / opzioni / elenco (ovvero sono mostrate le caselle di controllo / le radio, il salvataggio ecc.)

Ecco un pezzo importante del codice che sto usando in 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,
  );

Quello che mi sta gettando qui è che $ element non è la solita matrice di moduli, quindi non sono sicuro di come aggiungere il campo di testo e il pulsante e - soprattutto perché i loro valori non sono pensati per essere salvati. Qual è il modo migliore per aggiungere questi campi al mio widget?

Per quanto riguarda l'aggiunta del Javascript necessario, ho ragione nel pensare che dovrei usare #ajax che chiama una funzione che ricostruisce le #opzioni per le caselle di controllo?

Grazie in anticipo!

EDIT - La mia domanda iniziale era piuttosto vaga, ecco alcuni dettagli in più su quello che ho provato:

  $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,
  );

Questa è una fusione di vari esempi che ho visto e sembra avvicinarmi di più. Il problema è quando invio il modulo entità ottengo il seguente errore:

Avviso: indice indefinito: tid in taxonomy_field_is_empty () (riga 1402 di moduli \ taxonomy \ taxonomy.module).

Ho dato un'occhiata più da vicino a questa funzione e si aspetta $itemdi avere la struttura $item = array('tid', 2). Quando si utilizza il codice sopra sembra che ci sia un delta proveniente da qualche parte e la struttura di $itemessere $item = array(0, array('tid', 2). Non riesco a capire da dove provenga '0'?

UN ALTRO EDIT

Sono stato in grado di correggere l'errore sopra con il seguente codice modificando $ element in questo modo:

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

e aggiungendo la funzione:

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

Quando salvo l'entità ricevo un messaggio che mi dice che è stato salvato. Quando controllo la tabella per il campo, non viene salvato. Che cosa sto facendo di sbagliato?

Risposte:


2

Sono sicuro che potresti farlo hook_field_widget_form()(che suppongo sia dove si trova il tuo codice attuale) semplicemente aggiungendo un elemento figlio al tuo elemento esistente, ad es.

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

Se non funziona, so che funzionerà sicuramente se lo usi hook_field_widget_form_alter().

Ad esempio, la seguente è una piccola funzione che abilita il altcampo per un tipo di campo Immagine utilizzando il widget Selettore multimediale (per qualche motivo non è abilitato per impostazione predefinita):

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

Per quanto riguarda la funzionalità Ajax, penso che tu stia sicuramente seguendo le linee giuste. Penso che il modulo Field Example negli Esempi abbia del codice di esempio che potrebbe essere d'aiuto.


Grazie per la risposta, l'ho votato in quanto mi ha dato alcune buone informazioni per continuare ma non ha ancora risposto! Dai un'occhiata alla mia modifica che fornisce ulteriori informazioni su ciò che ho provato grazie alla tua risposta.
splatio

@splat sei stato in grado di implementare un widget funzionante? Saresti disposto a condividerlo?
Joe Beuckman,

Mi dispiace Joe, non sono riuscito a risolverlo e ho finito con un approccio complesso e diverso! Se lo risolvi pubblicalo qui perché sarei interessato come per il futuro. Lo accetterei anche felicemente come risposta.
splatio,

@splatio Puoi darci qualche informazione sul tuo approccio alternativo?
vfclists


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.