web-dev-qa-db-fra.com

Comment préremplir des champs sur un formulaire de création de nœud en fonction des champs du module Profile2?

Il existe un type de contenu ("Job Listing") qu'un compte professionnel peut utiliser pour répertorier les offres d'emploi, et un profil Profile2 pour chaque entreprise qui contient l'adresse de l'entreprise, le nom de l'organisation et des termes de taxonomie tels que le type d'industrie.

95% des entreprises qui proposeront une offre d'emploi utiliseront les mêmes informations; Je pourrais simplement utiliser les informations de profil, mais je dois tenir compte des 5% qui pourraient vouloir changer le formulaire de liste d'emplois. Par exemple, l'emploi peut se trouver dans un autre État ou pays et cela doit être pris en compte. Je pense que la meilleure façon de gérer cette situation est d'avoir les mêmes champs dans le profil et le formulaire de liste d'emplois, mais de permettre à l'entreprise de modifier les informations du formulaire de liste d'emplois.

Il serait judicieux de préremplir le formulaire de liste d'emplois avec les informations de profil d'entreprise par défaut. Comment puis-je faire cela au mieux? J'allais utiliser des règles mais je ne trouve pas une seule option pour une règle avant la création du formulaire de création de nœud d'origine.

Dois-je simplement utiliser hook_form_alter() pour accéder aux informations de profil sur la création du nœud d'origine et utiliser ces informations pour définir les valeurs par défaut?

7
Adam S

J'ai créé une fonction hook_form_FORM_ID_alter () dans un module d'assistance qui teste pour voir si le nœud a un NID et si oui, s'il n'est pas dans l'aperçu de l'opération. Ensuite, je remplis les valeurs par défaut du formulaire avec les informations de profil de l'entreprise afin qu'elles puissent le modifier plus tard.

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

J'avais la même exigence et j'ai utilisé le code ci-dessus pour commencer. Malheureusement, le code ci-dessus ne prend pas en compte les sélections de plusieurs pays et, par conséquent, la nature dynamique des champs des champs spécifiques aux pays (provinces, états, etc.). J'ai bricolé une nouvelle fonction pour préremplir le champ d'adresse mais avec la possibilité de basculer vers le bon pays.

J'ai reçu cet extrait de code sur la façon de le faire de mrfelton qui a écrit un patch pour une fonctionnalité de population d'adresse similaire pour drupal commerce. Merci pour cette inspiration.

Voici donc ma fonction que j'ai utilisée pour pré-remplir les données d'adresse de champ. Veuillez améliorer cela et redonner à la communauté.


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

J'ai fait un module plus générique (mais pas parfait) basé sur la réponse de été sans fin. Il suppose que les noms de champs de votre profil et du nœud sont identiques et prérempliront tous les champs d'un profil donné:

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