it-swarm-id.com

Bagaimana cara pra-mengisi bidang pada formulir pembuatan simpul berdasarkan bidang dari modul Profile2?

Ada tipe konten ("Daftar Pekerjaan") yang dapat digunakan oleh akun bisnis untuk membuat daftar lowongan pekerjaan, dan profil Profile2 untuk setiap bisnis yang berisi alamat bisnis, nama organisasi, dan istilah taksonomi seperti jenis industri.

95% dari bisnis yang akan mencantumkan lowongan pekerjaan akan menggunakan informasi yang sama; Saya hanya bisa menggunakan informasi profil, tetapi saya harus memperhitungkan 5% yang mungkin ingin mengubah formulir daftar pekerjaan. Misalnya, pekerjaan itu mungkin berada di negara bagian atau negara lain dan itu perlu dipertanggungjawabkan. Saya pikir cara terbaik untuk menangani situasi ini adalah memiliki bidang yang sama di profil dan formulir daftar pekerjaan, tetapi biarkan bisnis mengubah informasi dalam formulir daftar pekerjaan.

Masuk akal untuk mengisi formulir pendaftaran pekerjaan dengan informasi profil bisnis sebagai standar. Bagaimana cara terbaik saya melakukan ini? Saya akan menggunakan Aturan tapi saya tidak dapat menemukan satu opsi untuk Aturan sebelum formulir pembuatan simpul asli dibuat.

Haruskah saya menggunakan hook_form_alter() untuk mengakses informasi profil pada pembuatan simpul asli dan menggunakan informasi itu untuk menetapkan nilai default?

7
Adam S

Saya membuat fungsi hook_form_FORM_ID_alter () dalam modul helper yang menguji untuk melihat apakah node memiliki NID dan jika demikian jika tidak dalam pratinjau operasi. Lalu saya mengisi nilai-nilai default formulir dengan informasi profil perusahaan sehingga mereka dapat mengubahnya nanti.

// We need to set the default of the Job Listing fields on a new Job Listing form */
function helper_form_job_listing_node_form_alter(&$form, &$form_state) {
  // test if node for has been assigned a NID. If not then populate fields with default data */
  if (empty($form['nid']['#value']) && (!isset($form['#node']->op))){
    $profile = profile2_load_by_user ($form['uid']['#value'], 'business_profile'); 
    // We currently do not know what the profile language is */
    // Organization name
    if (isset($profile->field_job_organization['und'][0]['value'])){
      $form['field_job_organization']['und'][0]['value']['#default_value'] =  $profile->field_job_organization['und'][0]['value'];
    }
    // Set the default address
    if (isset($profile->field_resume_address['und'][0]['thoroughfare'])) {
      $form['field_resume_address']['und'][0]['#address']['thoroughfare'] = $profile->field_resume_address['und'][0]['thoroughfare'];
    }
    if (isset($profile->field_resume_address['und'][0]['locality'])) {
      $form['field_resume_address']['und'][0]['#address']['locality'] = $profile->field_resume_address['und'][0]['locality']; 
    }
    if (isset($profile->field_resume_address['und'][0]['administrative_area'])) {
      $form['field_resume_address']['und'][0]['#address']['administrative_area'] = $profile->field_resume_address['und'][0]['administrative_area'];                  
    }
    if (isset($profile->field_resume_address['und'][0]['country'])) { 
      $form['field_resume_address']['und'][0]['#address']['country'] = $profile->field_resume_address['und'][0]['country'];  
    }
    if (isset($profile->field_resume_address['und'][0]['premise'])) {
      $form['field_resume_address']['und'][0]['#address']['premise'] = $profile->field_resume_address['und'][0]['premise']; 
    }
    if (isset($profile->field_resume_address['und'][0]['postal_code'])) {
      $form['field_resume_address']['und'][0]['#address']['postal_code'] = $profile->field_resume_address['und'][0]['postal_code']; 
    }  
  }                                                              
}
7
Adam S

Saya memiliki persyaratan yang sama dan menggunakan kode di atas untuk memulai. Sayangnya kode di atas tidak mengambil beberapa pilihan negara dan oleh karena itu sifat bidang dinamis dari bidang khusus negara (provinsi, negara bagian, dll.) Ke dalam akun. Saya menggabungkan fungsi baru untuk mengisi ulang bidang alamat tetapi dengan kemampuan untuk beralih ke negara yang tepat.

Saya mendapat potongan kode tentang cara melakukan ini dari mrfelton yang menulis patch untuk fungsionalitas populasi alamat serupa untuk drupal perdagangan. Terima kasih untuk inspirasi itu.

Jadi di sini adalah fungsi saya yang saya gunakan untuk mengisi data alamat lapangan. Harap tingkatkan ini dan berikan kembali kepada komunitas.


    //method to prepopulate the address field including switching to the right country context
function field_prepopulate_field_widget_form_alter(&$element, &$form_state, $context) {
    // Forms where the pre-population is supposed to occur
    $validforms = array(
            "job_listing_node_form",
            "job_editing_node_form",
            "some_other_node_form"
    ); 

    // Check that I am on the right form
    if(in_array($form_state['build_info']['form_id'], $validforms)) {
        // Check that I am changing the right field
        if($context['field']['field_name'] == 'field_address') {
            global $user;
            $user_fields = user_load($user->uid);
            if (isset($user_fields->field_address) && !empty($user_fields->field_address)) {
                // use field_get_items function to avoid the entire language nonsense (tongue-in-cheek) in the array
                $address_data = field_get_items('user', $user_fields, 'field_address');
                //This may look redundant but is important - fill the address fields out once so that the right country is set
                foreach($address_data[0] as $key => $value) {
                    $context['items'][$context['delta']][$key] = $value;
                }
                // regenerate the widget so that the right country specific fields are rendered
                $format = addressfield_field_widget_form($context['form'], $form_state, $context['field'], $context['instance'], $context['langcode'], $context['items'], $context['delta'], array());

                // Switch out the form elements with our newly generated ones.
                foreach ($element as $key => $value) {
                    if (isset($format[$key])) {
                        $element[$key] = $format[$key];
                    }
                }

                // Set the detault values.
                $element['#address'] = $address_data[0];
            }
        }
    }
}

4
christowm

Saya membuat modul yang lebih umum (tetapi tidak sempurna) berdasarkan jawaban dari musim panas tanpa akhir. Itu mengasumsikan bahwa nama bidang dari profil Anda dan node adalah sama dan akan mengisi semua bidang dari profil yang diberikan:

function helper_form_job_listing_node_form_alter(&$form, &$form_state) 
{
    if (!empty($form['nid']['#value']) || isset($form['#node']->op))
    {
        return;
    }
    $profile = profile2_load_by_user ($form['uid']['#value'], 'business_profile'); 
    if (isset($profile)) {
        helper_prepopulate($profile, $form);
    }                                                              
}

function helper_prepopulate(&$source, &$destination) 
{
    foreach($source as $fieldName => $sourceValue)
    {
        if(substr($fieldName, 0, strlen('field_')) !== 'field_' ||
            !isset($destination[$fieldName]['und'][0]) ||
            !isset($sourceValue['und'][0])) 
        { 
            continue; 
        }
        if(isset($destination[$fieldName]['und'][0]['#addressfield']) &&
            $destination[$fieldName]['und'][0]['#addressfield'])
        {
            foreach($sourceValue['und'][0] as $addressFieldName => $addressvalue)
            {
                $destination[$fieldName]['und'][0]['#address'][$addressFieldName] = $addressvalue;
            }
        }
        else if(isset($destination[$fieldName]['und'][0]['#type']) &&
            $destination[$fieldName]['und'][0]['#type'] == 'date_combo')
        {
            $destination[$fieldName]['und'][0]['#default_value']['value'] = $sourceValue['und'][0]['value'];    
        }
        else
        {
            $destination[$fieldName]['und'][0]['value']['#default_value'] = $sourceValue['und'][0]['value'];
        }
    }
}
1
Martin