it-swarm.com.de

Das automatische Ausfüllen von Feldern basierend auf einem anderen Feld

Ich habe eine sehr komplexe Situation, in der ich Rat brauche. Ich habe einen Inhaltstyp my_content, Dem ein Feldsammlungsfeld zugeordnet ist field_mycollection, Dem ein Entitätsreferenzfeld entspricht, das auf den Benutzer field_my_userreference Verweist, ein Telefonfeld field_my_phone, Ein Textfeld field_my_text Und ein weiteres Textfeld field_my_anothertext.

My Content
|_ field_mycollection
   |_ field_my_userreference
   |_ field_my_phone
   |_ field_my_text
   |_ field_my_anothertext

Die Benutzerentität hat auch Felder field_my_phone, field_my_text Und field_my_yetanothertext, Die letztere einen anderen Computernamen haben.

Was ich tun möchte, wenn in my_content Formular bearbeiten/hinzufügen, in field_my_userreference Ein Benutzer ausgewählt ist, sollten die anderen Felder automatisch aus den Daten des ausgewählten Benutzers ausgefüllt werden. Die automatisch ausgefüllten Felder sollten weiterhin bearbeitet werden können.

Wie könnte ich dieses Ziel erreichen? Ich würde es gerne, wenn möglich, mit etwas Codierung unter Verwendung von hook_form_FORM_ID_alter() tun.

10
Елин Й.

Wenn Sie möchten, dass dies live geschieht und sich alle Felder bereits im Formular befinden, können Sie am sichersten hook_form_FORM_ID_alter() verwenden, um einem Formular Folgendes hinzuzufügen:

$form['#attached']['js'] = array(
  drupal_get_path('module', 'module_name') . '/js/copy_field_value.js',
);

Dann in copy_field_value.js Verhalten erstellen:

(function($) {
  Drupal.behaviors.moduleNameCopyFieldValue = {
    attach: function (context, settings) {

      // Repeat this for all fields as needed
      $('#source', context).on('blur', function () { 
        // above you can use change instead of blur if element is not changed by another js
        if (!$('#destination').val() || 0 === $('#destination').val().length) {
          $('#destination').val($(this).val());
          // wrap line above in "if no value" like I did, or other condition you like
        }
      });
      // end of "repeat this"
    }
  };
})(jQuery);

Sie können auch hook_form_FORM_ID_alter() verwenden, um #ajax Parameter zum Quellfeld hinzuzufügen, aber es würde Ihr Formular veranlassen, bei jeder Feldkopie einen Server aufzurufen. Wenn Sie die Datenbank tatsächlich abfragen müssen, ist dies der richtige Weg. Es wäre ziemlich weit gefasst, es hier neu zu beschreiben. Sie müssen das Array $form_state["input"] Ändern, um die vom Benutzer angezeigten realen Werte zu aktualisieren. Führen Sie dies in der Formularerstellungsfunktion aus und umschließen Sie es mit isset, um Benachrichtigungen zu vermeiden.

Wenn Ihr Formularelement $form["something"]["something"]["element"] Ist, wird sein Wert in $form_state["input"]["something"]["something"]["element"] Angegeben - und Sie können es in hook_form_alter Einstellen. Denken Sie daran, beide $form Zu nehmen. und $form_state als Referenz.

Hinweis : .on() Methode wurde in jQuery 1.7 hinzugefügt, daher benötigen Sie jQuery Update , um diese Antwort direkt zu verwenden, oder übersetze meinen Code, um die Methode .change() oder .blur() zu verwenden.

11
Mołot

Sie können dies mit dem berechnetes Feldmodul tun

Computed Field ist ein sehr leistungsfähiges CCK-Feldmodul, mit dem Sie Ihren Inhaltstypen benutzerdefinierte "berechnete Felder" hinzufügen können. Diese berechneten Felder werden mit Werten gefüllt, die Sie über PHP Code) definieren. Sie können auf alles zurückgreifen, was Drupal zur Verfügung steht, einschließlich anderer Felder, des aktuellen Benutzers, Datenbanktabellen, wie Sie es nennen Power schon? :)) Sie können auch wählen, ob Sie Ihre berechneten Feldwerte in der Datenbank mit anderen Inhaltsfeldern speichern oder sie während der Knotenansichten im laufenden Betrieb "berechnen" lassen möchten. (Obwohl Sie beachten sollten, dass für die Verwendung von Ansichten in der Datenbank gespeicherte Werte erforderlich sind.) Dieses Feld ist buchstäblich das Schweizer Taschenmesser für CCK-Felder. Beginnen Sie also mit dem Kochen Ihrer PHP-basierten Werte!

4
4life

Ich möchte veröffentlichen, wie ich es dank der großen Hilfe von @ Mołot erreicht habe.

  1. Implementiert das hook_form_FORM_ID_alter () .
  2. Es wurde ein Wrapping-Div um die Feldsammlung hinzugefügt.
  3. Da die my-Feldsammlung ein mehrwertiges Feld ist, iterieren Sie darüber und setzen Sie das #ajax Eigenschaft für das Feld field_my_userreference.
  4. Es wurde eine Rückruffunktion erstellt, die das Feldsammlungselement einfach zurückgibt.
  5. Überprüft in der Implementierung von hook_form_FORM_ID_alter (), ob $ form_state für die Feldsammlung festgelegt ist. Wenn ja, rufen Sie die Werte von der Benutzerentität ab und füllen Sie die Formulareingabefelder mit diesen Werten.

Mein Code sieht aus wie:

function MYMODULE_form_my_content_node_form_alter(&$form, &$form_state, $form_id) {
  $form['field_mycollection']['#prefix'] = '<div id="mycollection-wrapper">';
  $form['field_mycollection']['#suffix'] = '</div>';
  foreach ($form['field_mycollection']['und'] as $key => $fc_mycollection) {
    if (is_numeric($key)) {
      $form['field_mycollection']['und'][$key]['field_my_userreference']['und']['#ajax'] = array(
        'callback' => 'MYMODULE_mycollection_callback',
        'wrapper' => 'mycollection-wrapper',
      );
      if (isset($form_state['values']['field_mycollection']['und'][$key]['field_my_userreference']['und'][0]['target_id'])) {
        $user_wrapper = entity_metadata_wrapper('user', $form_state['values']['field_mycollection']['und'][$key]['field_my_userreference']['und'][0]['target_id']);
        $form_state['input']['field_mycollection']['und'][$key]['field_my_text']['und'][0]['value'] = $user_wrapper->field_my_text->value() ? $user_wrapper->field_my_text->value() : '';
        $form_state['input']['field_mycollection']['und'][$key]['field_my_anothertext']['und'][0]['value'] = $user_wrapper->field_my_text->value() ? $user_wrapper->field_my_yetanothertext->value() : '';
      }
    }
  }
}

function MYMODULE_mycollection_callback($form, &$form_state) {
  return $form['field_mycollection'];
}
2
Елин Й.

Dies mag etwas spät sein, aber dieses Modul https://www.drupal.org/project/entityreference_autofill scheint das zu tun, was Sie beschreiben. Ich habe es benutzt und es kann dir auch helfen.

0
Moses Sseggembe