it-swarm.asia

كيف يمكن تعبئة الحقول مسبقًا في نموذج إنشاء العقدة استنادًا إلى الحقول من الوحدة النمطية Profile2؟

هناك نوع محتوى ("قائمة الوظائف") يمكن أن يستخدمه حساب الأعمال لسرد الوظائف الشاغرة ، وملف تعريف Profile2 لكل نشاط تجاري يحتوي على عنوان الشركة واسم المؤسسة وشروط التصنيف مثل نوع الصناعة.

95٪ من الشركات التي ستدرج إعلان وظيفة ستستخدم نفس المعلومات ؛ يمكنني فقط استخدام معلومات الملف الشخصي ، لكني بحاجة إلى حساب 5٪ التي قد ترغب في تغيير نموذج قائمة الوظائف. على سبيل المثال ، قد تكون الوظيفة في دولة أو دولة أخرى ويجب أن يتم حسابها. أعتقد أن أفضل طريقة للتعامل مع هذا الموقف هي أن يكون لديك نفس الحقول في كل من الملف الشخصي ونموذج قائمة الوظائف ولكن السماح للشركة بتغيير المعلومات في نموذج قائمة الوظائف.

سيكون من المنطقي ملء نموذج قائمة الوظائف مسبقًا بمعلومات الملف الشخصي للنشاط التجاري باعتبارها الإعداد الافتراضي. كيف أفعل ذلك بشكل أفضل؟ كنت سأستخدم القواعد ولكن لا يمكنني العثور على خيار واحد لقاعدة قبل إنشاء نموذج إنشاء العقدة الأصلي.

هل يجب علي فقط استخدام hook_form_alter() للوصول إلى معلومات الملف الشخصي عند إنشاء العقدة الأصلية واستخدام تلك المعلومات لتعيين القيم الافتراضية؟

7
Adam S

لقد أنشأت دالة hook_form_FORM_ID_alter () في وحدة مساعدة تساعد على اختبار ما إذا كانت العقدة تحتوي على NID وإذا كان الأمر كذلك إذا لم تكن في معاينة العملية. ثم أقوم بتعبئة القيم الافتراضية للنموذج بمعلومات الملف الشخصي للشركات حتى يتمكنوا من تغييره لاحقًا.

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

كان لدي نفس المتطلبات واستخدمت الرمز أعلاه للبدء. لسوء الحظ ، لا يأخذ الرمز أعلاه اختيارات متعددة للبلد ، وبالتالي طبيعة الحقل الديناميكي للحقول الخاصة بكل بلد (مقاطعات ، ولايات ، وما إلى ذلك) في الاعتبار. جمعت وظيفة جديدة معًا لملء حقل العنوان مسبقًا ولكن مع القدرة على التبديل إلى البلد الصحيح.

لقد حصلت على مقتطف الشفرة هذا حول كيفية القيام بذلك من mrfelton الذي كتب patch لوظيفة مجموعة عناوين مماثلة للتجارة drupal التجارة. شكرًا لهذا الإلهام.

هذه هي وظيفتي التي استخدمتها لملء بيانات عنوان الحقل مسبقًا. يرجى تحسين هذا وإعادة الجميل للمجتمع.


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

لقد صنعت وحدة أكثر شمولية (ولكن ليست مثالية) استنادًا إلى الإجابة من صيف لا نهاية له. يفترض أن أسماء الحقول من ملف التعريف الخاص بك والعقدة هي نفسها وستقوم مسبقًا بتعبئة جميع الحقول من ملف تعريف معين:

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