Taxonomie-Term-Widget "Mehr hinzufügen"

8

Ich versuche, ein Feld-Widget zu erstellen, das dem normalen Referenz-Widget mit einem wesentlichen Unterschied ähnelt. Der Benutzer muss in der Lage sein, mehrere neue Taxonomiebegriffe gleichzeitig hinzuzufügen. Dies kann dies besser demonstrieren:

Geben Sie hier die Bildbeschreibung ein

Ich habe einen Punkt erreicht, an dem die Funktionalität der Taxonomie / Optionen / Listenmodule ähnelt (dh die Kontrollkästchen / Radios werden angezeigt, gespeichert usw.).

Hier ist ein wichtiger Teil des Codes, den ich verwende 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,
  );

Was mich hierher bringt, ist, dass $ element nicht Ihr übliches Formulararray ist, daher bin ich mir nicht sicher, wie ich das Textfeld und die Schaltfläche hinzufügen soll - zumal ihre Werte nicht zum Speichern gedacht sind. Wie kann ich diese Felder am besten zu meinem Widget hinzufügen?

Wenn ich das benötigte Javascript hinzufüge, denke ich zu Recht, ich sollte #ajax verwenden, das eine Funktion aufruft, die die #Optionen für die Kontrollkästchen neu erstellt?

Danke im Voraus!

BEARBEITEN - Meine anfängliche Frage war ziemlich vage. Hier sind einige Details zu dem, was ich versucht habe:

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

Dies ist eine Zusammenführung verschiedener Beispiele, die ich gesehen habe, und scheint mich näher zu bringen. Das Problem ist, wenn ich das Entitätsformular abschicke, erhalte ich den folgenden Fehler:

Hinweis: Undefinierter Index: tid in taxonomy_field_is_empty () (Zeile 1402 von modules \ taxonomy \ taxonomy.module).

Ich habe mir diese Funktion genauer angesehen und sie erwartet $itemdie Struktur $item = array('tid', 2). Bei Verwendung des obigen Codes scheint ein Delta von irgendwoher zu kommen und die Struktur von $itemendet $item = array(0, array('tid', 2). Ich kann nicht herausfinden, woher '0' kommt?

Noch eine Bearbeitung

Ich konnte den obigen Fehler mit dem folgenden Code beheben, indem ich $ element wie folgt änderte:

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

und Hinzufügen der Funktion:

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

Wenn ich die Entität speichere, erhalte ich eine Nachricht, dass sie gespeichert wurde. Wenn ich die Tabelle auf das Feld überprüfe, wird es nicht gespeichert. Was mache ich falsch?

splatio
quelle

Antworten:

2

Ich bin sicher, Sie könnten dies tun hook_field_widget_form()(ich vermute, dort, wo sich Ihr aktueller Code befindet), indem Sie einfach ein untergeordnetes Element zu Ihrem vorhandenen Element hinzufügen, z

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

Wenn das nicht funktioniert, weiß ich, dass es definitiv funktionieren wird, wenn Sie es verwenden hook_field_widget_form_alter().

Das Folgende ist beispielsweise eine kleine Funktion, mit der das altFeld für einen Bildfeldtyp mithilfe des Medienauswahl-Widgets aktiviert wird (aus irgendeinem Grund ist es standardmäßig nicht aktiviert):

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

Was die Ajax-Funktionalität angeht, denke ich, dass Sie definitiv in die richtige Richtung gehen. Ich denke, das Feldbeispielmodul in Beispielen enthält einen Beispielcode, der hilfreich sein könnte.

Clive
quelle
Vielen Dank für die Antwort, ich habe sie hochgestimmt, da sie mir einige gute Informationen zum Fortfahren gegeben hat, sie aber noch nicht ganz beantwortet hat! Schauen Sie sich meine Bearbeitung an, die dank Ihrer Antwort weitere Informationen darüber enthält, was ich versucht habe.
Splatio
@splat Konnten Sie ein funktionierendes Widget implementieren? Würdest du bereit sein, es zu teilen?
Joe Beuckman
Tut mir leid, Joe, ich konnte das nicht klären und habe einen komplex anderen Ansatz gewählt! Wenn Sie es herausfinden, posten Sie es hier, da ich interessiert wäre, wie für die Zukunft. Ich würde es auch gerne als Antwort akzeptieren.
Splatio
@splatio Können Sie einige Informationen zu Ihrem alternativen Ansatz geben?
vfclists
1

Die hierarchische Modulauswahl kommt zumindest dem sehr nahe, was Sie erreichen möchten. Das Widget sieht etwas anders aus, erledigt aber im Grunde den gleichen Job und wäre ein guter Ausgangspunkt für die Anpassung. Schauen Sie sich die Taxonomie-Demo an. Orte, die ich besucht habe .

Eine weitere Option könnte das Autocomplete Deluxe- Modul sein.

an Daniel
quelle
0

Ich habe gerade Taxonomy Other- Modul gefunden, das Ihren Anforderungen entspricht.

Dies ist ein einfaches Modul zum Hinzufügen eines optionalen '- Andere -' zu Taxonomie-Auswahllisten. Benutzer mit den richtigen Berechtigungen können neue Begriffe erstellen.

Überprüfen Sie für den Drupal 7-Port: Port Taxonomy Other to D7 ( direkter Link ).

DE51GN
quelle