it-swarm-vi.com

Làm cách nào để điền trước các trường trên biểu mẫu tạo nút dựa trên các trường từ mô-đun Profile2?

Có một loại nội dung ("Danh sách công việc") mà tài khoản doanh nghiệp có thể sử dụng để liệt kê các cơ hội việc làm và hồ sơ Profile2 cho mỗi doanh nghiệp có chứa địa chỉ, tên tổ chức và thuật ngữ phân loại của doanh nghiệp như loại ngành.

95% doanh nghiệp sẽ liệt kê một bài đăng công việc sẽ sử dụng cùng một thông tin; Tôi chỉ có thể sử dụng thông tin hồ sơ, nhưng tôi cần chiếm 5% có thể muốn thay đổi mẫu danh sách công việc. Ví dụ, công việc có thể ở một tiểu bang hoặc quốc gia khác và điều đó cần được tính đến. Tôi nghĩ cách tốt nhất để xử lý tình huống này là có cùng các lĩnh vực trong cả hồ sơ và mẫu danh sách công việc nhưng cho phép doanh nghiệp thay đổi thông tin trong mẫu danh sách công việc.

Sẽ là hợp lý khi điền trước biểu mẫu danh sách công việc với thông tin hồ sơ doanh nghiệp làm mặc định. Làm thế nào để tôi làm tốt nhất điều này? Tôi sẽ sử dụng Quy tắc nhưng tôi không thể tìm thấy một tùy chọn duy nhất cho Quy tắc trước khi biểu mẫu tạo nút gốc được tạo.

Tôi có nên sử dụng hook_form_alter() để truy cập thông tin hồ sơ khi tạo nút gốc và sử dụng thông tin đó để đặt các giá trị mặc định?

7
Adam S

Tôi đã tạo một hàm hook_form_FORM_ID_alter () trong mô-đun trợ giúp để kiểm tra xem nút có NID hay không và nếu có thì nó không có trong bản xem trước hoạt động. Sau đó, tôi điền các giá trị mặc định của biểu mẫu với thông tin hồ sơ công ty để họ có thể thay đổi nó sau này.

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

Tôi có cùng yêu cầu và sử dụng mã ở trên để bắt đầu. Thật không may, mã ở trên không tính đến nhiều lựa chọn quốc gia và do đó tính chất trường động của các trường cụ thể của quốc gia (tỉnh, bang, v.v.) được tính đến. Tôi đã kết hợp một chức năng mới để điền trước trường địa chỉ nhưng với khả năng chuyển sang đúng quốc gia.

Tôi đã nhận được đoạn mã đó về cách thực hiện điều này từ mrfelton người đã viết bản vá cho chức năng dân số địa chỉ tương tự cho drupal thương mại. Cảm ơn cho cảm hứng đó.

Vì vậy, đây là chức năng của tôi mà tôi đã sử dụng để điền trước dữ liệu địa chỉ trường. Hãy cải thiện điều này và cung cấp cho cộng đồng.


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

Tôi đã tạo một mô-đun chung hơn (nhưng không hoàn hảo) dựa trên câu trả lời từ mùa hè bất tận. Nó giả định rằng tên trường từ hồ sơ của bạn và nút giống nhau và sẽ điền trước tất cả các trường từ một cấu hình đã cho:

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