Alanları başka bir alana göre otomatik doldurma


10

Tavsiyeye ihtiyacım olan çok karmaşık bir durumum var. Kullanıcı , bir telefon alanı , bir metin alanı ve başka bir metin alanı başvuran bir varlık başvuru alanı olan my_contentbir alan toplama alanı bağlı olan bir içerik türü var .field_mycollectionfield_my_userreferencefield_my_phonefield_my_textfield_my_anothertext

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

Kullanıcı varlık da alanlara sahip olan field_my_phone, field_my_textve field_my_yetanothertexthangi ikincisi farklı bir makine adı vardır.

Ne yapmak istiyorum, eğer my_contentdüzenleme / ekleme formunda field_my_userreferencebir kullanıcı seçiliyse, diğer alanların seçilen kullanıcının verilerinden otomatik olarak doldurulması gerekir. Otomatik olarak doldurulmuş alanlar hala düzenlenebilir olmalıdır.

Bu hedefe nasıl ulaşabilirim? Mümkünse, bazı kodlamalarla kullanmak istiyorum hook_form_FORM_ID_alter().


Formda mı yoksa tasarrufta mı olması gerekiyor?
Mołot

Formda yaşayın. Zaten kaydettikten sonra verilerin boş bırakılırsa kullanıcı varlığından alınacağını uyguladım. Ama aslında formda ihtiyacım olan şey :(
Елин Й.

Tamam, cevabımı verdi.
Mołot

Yanıtlar:


11

Canlı olmasını istiyorsanız ve tüm alanlar zaten formdaysa hook_form_FORM_ID_alter(), bir forma aşağıdakileri eklemek için en güvenli yol kullanmak olacaktır:

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

Sonra copy_field_value.jsdavranış oluşturmak:

(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);

Kaynak alana parametrehook_form_FORM_ID_alter() eklemek için de kullanabilirsiniz , ancak formunuzun her alan kopyasında bir sunucuyu çağırmasını sağlar. Gerçekten veritabanını sorgulamak gerekiyorsa, gitmek için yoldur. Burada yeniden tanımlamak oldukça geniş olurdu. Kullanıcı tarafından görülen gerçek değerleri güncellemek için diziyi değiştirmeniz gerekir . Bildirimleri önlemek için onu sararak form oluşturma işlevinde yapın .#ajax$form_state["input"]isset

Form öğeniz öyleyse $form["something"]["something"]["element"]değeri girilir $form_state["input"]["something"]["something"]["element"]- ve bunu iyi bir şekilde ayarlayabilirsiniz hook_form_alter, her ikisini de $formve $form_statereferans olarak almayı unutmayın .

Not : .on()yöntem jQuery 1.7'de eklendi, bu nedenle bu cevabı doğrudan kullanmak için jQuery Güncellemesine ihtiyacınız olacak veya kodumu kullanmak .change()veya .blur()yöntem için çevireceksiniz .


Talimatlar için çok teşekkürler! Drupal'ın JS API'sinde çok iyi değilim. Alan değerlerini kullanıcı varlığından nasıl aldığımı açıklar mısınız? Örneğin, bir kullanıcı seçilirse, sonraki alanları bu kullanıcının bilgileriyle nasıl doldurabilirim?
Елин Й.

1
@ ЕлинЙ. burada hüner php arka plan umurumda değil. <input>Favori tarayıcınız için Firebug veya benzer bir araç kullanarak etiketlerin kimlik parametrelerini tanımlamanız yeterlidir. Veya başka bir jQuery seçici kullanın. Sadece tarayıcıda olacak, böylece ekranda sahip olduklarınız var. Öte yandan aslında veritabanı sorgulamak gerekiyorsa (bu cevapsız görünüyor), #ajaxgitmek için yol. Ama oldukça geniş olurdu. $form_state["values"]Kullanıcı tarafından görülen gerçek değerleri güncellemek için diziyi değiştirmeniz gerekir . Bildirimleri issetönlemek için onu sararak form oluşturma işlevinde yapın .
Mołot

Tekrar teşekkürler @ Mołot, yarın ya da belki bu akşam uygulamaya çalışacağım. Görünüşe göre, daha fazla değilse, gerçekten işe yaraması için birkaç saate ihtiyacım olacak.
Елин Й.

@ ЕлинЙ. iyi şanslar, daha fazla soru ile geri dönmek için çekinmeyin ve bağlıysa yorumlarda buraya bağlayın. Cevap biraz güncellendi, btw.
Mołot

1
Tamam, biraz deneyeceğim ve deneyimlerimi yazacağım.
Елин Й.

4

Hesaplanan alan modülünü kullanarak yapabilirsiniz

Hesaplanan Alan, içerik türlerinize özel bir "hesaplanan alanlar" eklemenizi sağlayan çok güçlü bir CCK alan modülüdür. Bu hesaplanan alanlar, PHP kodu ile tanımladığınız değerlerle doldurulur. Diğer alanlar, mevcut kullanıcı, veritabanı tabloları da dahil olmak üzere Drupal'ın kullanabileceği her şeyi çizebilirsiniz. (Henüz gücü hissediyor musunuz? :)) Ayrıca, hesaplanan alan değerlerinizi diğer içerik alanlarıyla birlikte veritabanında depolamayı veya düğüm görünümleri sırasında anında "hesaplanmasını" seçebilirsiniz. (Views kullanımının veritabanı depolanmış değerler gerektirdiğini unutmamalısınız.) Bu alan kelimenin tam anlamıyla CCK alanlarının İsviçre Çakısıdır. PHP tabanlı değerlerinizi pişirmeye başlayın!


Hızlı cevabınız için teşekkür ederim. Kulağa çok umut verici geliyor. Bununla birlikte, bunun için bir modül kurmak istemiyorum, ancak sadece bir kod yazıyorum, çünkü sadece bu formda böyle bir işlevselliğe ihtiyacım var ve gerçek sistem zaten çok büyük ve çeşitli işlevler için birçok modül yüklü.
Елин Й.

İkinci olarak, bu modülü kullanarak düğümü oluşturan veya düzenleyen kullanıcının otomatik olarak doldurulmuş alanları manuel olarak geçersiz kılması ve kaydetmesi mümkün müdür? Böylece, kullanıcı varlığı ve my_content içinde farklı değerler kaydedilir.
Елин Й.

Bu, kurulum şekline bağlı olacaktır
4life

Teşekkürler @ 4life, Mołot'un talimatlarını kullanarak kodlama ile başaramazsam da bunu deneyeceğim.
Елин Й.

2

@ Mołot'un büyük yardımları sayesinde bunu nasıl başardığımı göndermek istiyorum.

  1. Uygulanan hook_form_FORM_ID_alter () .
  2. Alan koleksiyonunun etrafına bir sarma div eklendi.
  3. Alan koleksiyonum çok değerli bir alan olduğundan, üzerinde yinelenen #ajaxve alan için özelliği ayarlayın field_my_userreference.
  4. Alan toplama öğesini geri döndüren bir geri çağırma işlevi oluşturuldu.
  5. Alan koleksiyonu için $ form_state ayarlanmışsa hook_form_FORM_ID_alter () uygulamasında kontrol edilir. Evetse, değerleri kullanıcı varlığından alın ve form giriş alanlarını bu değerlerle doldurun.

Kodum şöyle görünüyor:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.