it-swarm-tr.com

Bir düğüm oluşturma formundaki alanları Profil2 modülündeki alanlara dayalı olarak önceden doldurmak nasıl?

Bir işletme hesabının iş açılışlarını listelemek için kullanabileceği bir içerik türü ("İş İlanı") ve işletmenin adresi, kuruluş adı ve endüstri türü gibi sınıflandırma terimlerini içeren her işletme için bir Profil2 profili vardır.

Bir iş ilanını listeleyecek işletmelerin% 95'i aynı bilgileri kullanacaktır; Yalnızca profil bilgilerini kullanabilirim, ancak iş listesi formunu değiştirmek isteyebilecek% 5'i hesaba katmam gerekiyor. Örneğin, iş başka bir eyalette veya ülkede olabilir ve bunun hesaba katılması gerekir. Bu durumla başa çıkmanın en iyi yolunun hem profil hem de iş listesi formunda aynı alanlara sahip olmak olduğunu, ancak işletmenin iş listesi formundaki bilgileri değiştirmesine izin vermek olduğunu düşünüyorum.

İş listesi formunu varsayılan olarak iş profili bilgileriyle önceden doldurmak mantıklı olacaktır. Bunu en iyi nasıl yapabilirim? Kurallar kullanacaktım, ancak orijinal düğüm oluşturma formu oluşturulmadan önce bir Kural için tek bir seçenek bulamıyorum.

Orijinal düğüm oluşturma ile ilgili profil bilgilerine erişmek için hook_form_alter() kullanmalı ve varsayılan değerleri ayarlamak için bu bilgileri kullanmalı mıyım?

7
Adam S

Düğümün bir NID olup olmadığını ve işlem önizlemesinde değilse, test eden bir yardımcı modülde hook_form_FORM_ID_alter () işlevi oluşturdum. Sonra formun varsayılan değerlerini daha sonra değiştirebilmeleri için şirket profili bilgileriyle doldururum.

// 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

Aynı gereksinime sahiptim ve başlamak için yukarıdaki kodu kullandım. Ne yazık ki yukarıdaki kod birden fazla ülke seçimini ve dolayısıyla ülkeye özgü alanların (iller, eyaletler, vb.) Dinamik alan niteliğini dikkate almamaktadır. Adres alanını önceden doldurmak için yeni bir işlevi bir araya getirdim ancak doğru ülkeye geçebildim.

Bunu nasıl yapacağınızla ilgili kod snippet'ini mrfelton kim bir yama drupal ticaret için benzer adres nüfusu işlevselliği için yazdı. bu ilham için.

Alan adresi verilerini önceden doldurmak için kullandığım işlevim. Lütfen bu konuda iyileştirin ve topluma geri verin.


    //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

sonsuz yaz cevabına dayalı daha genel (ama mükemmel değil) bir modül yaptım. Profilinizdeki ve düğümünüzdeki alan adlarının aynı olduğunu ve belirli bir profildeki tüm alanları önceden dolduracağını varsayar:

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