Wie fülle ich Felder in einem Knotenerstellungsformular basierend auf Feldern aus dem Profile2-Modul vorab aus?

7

Es gibt einen Inhaltstyp ("Jobliste"), mit dem ein Geschäftskonto Stellenangebote auflisten kann, und ein Profil2-Profil für jedes Unternehmen, das die Adresse, den Organisationsnamen und Taxonomiebegriffe des Unternehmens wie den Branchentyp enthält.

95% der Unternehmen, die eine Stellenanzeige auflisten, verwenden dieselben Informationen. Ich könnte nur die Profilinformationen verwenden, muss aber die 5% berücksichtigen, die möglicherweise das Formular für die Stellenanzeige ändern möchten. Zum Beispiel könnte sich der Job in einem anderen Staat oder Land befinden und dies muss berücksichtigt werden. Ich denke, der beste Weg, um mit dieser Situation umzugehen, besteht darin, die gleichen Felder sowohl im Profil als auch im Formular für die Stellenanzeige zu haben, aber dem Unternehmen zu erlauben, die Informationen im Formular für die Stellenanzeige zu ändern.

Es ist sinnvoll, das Formular für die Stellenanzeige standardmäßig mit Informationen zum Unternehmensprofil auszufüllen. Wie mache ich das am besten? Ich wollte Regeln verwenden, kann jedoch keine einzige Option für eine Regel finden, bevor das ursprüngliche Formular zur Knotenerstellung erstellt wurde.

Sollte ich nur verwenden, hook_form_alter()um auf die Profilinformationen bei der Erstellung des ursprünglichen Knotens zuzugreifen und diese Informationen zum Festlegen der Standardwerte zu verwenden?

Adam S.
quelle
Ich brauche genau die gleiche Funktionalität. Ist es nicht seltsam, dass es dafür kein Modul gibt? Etwas generisches, mit dem Sie nur Platzhalter innerhalb des Standardwerts eingeben und diese dann mithilfe des Token-Moduls ersetzen können, wenn ein neuer Knoten hinzugefügt wird.
Martin

Antworten:

7

Ich habe eine hook_form_FORM_ID_alter () -Funktion in einem Hilfsmodul erstellt, die prüft, ob der Knoten eine NID hat und wenn ja, ob sie nicht in der Operationsvorschau enthalten ist. Dann fülle ich die Standardwerte des Formulars mit den Profilinformationen des Unternehmens, damit diese später geändert werden können.

// 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']; 
    }  
  }                                                              
}
Adam S.
quelle
Ich frage mich, wie Sie die $ profile-Variablen finden. print_r ($ profile)?
Adamtan
Installieren Sie einfach Netbeans und fügen Sie dem Code Haltepunkte hinzu. Bietet Ihnen die Möglichkeit, Code zu durchlaufen und alle Variablen live anzuzeigen. Du wirst über Nacht ein Superstar.
Adam S
4

Ich hatte die gleiche Anforderung und benutzte den obigen Code, um loszulegen. Leider berücksichtigt der obige Code nicht die Auswahl mehrerer Länder und damit die dynamische Feldnatur länderspezifischer Felder (Provinzen, Bundesstaaten usw.). Ich habe eine neue Funktion zusammengestellt, um das Adressfeld vorab auszufüllen, aber mit der Möglichkeit, in das richtige Land zu wechseln.

Ich habe diesen Codeausschnitt von mrfelton erhalten, der einen Patch für ähnliche Funktionen zur Adresspopulation für den Drupal-Handel geschrieben hat. Danke für diese Inspiration.

Hier ist meine Funktion, mit der ich Feldadressdaten vorab ausgefüllt habe. Bitte verbessern Sie dies und geben Sie es der Community zurück.


    //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];
            }
        }
    }
}

christowm
quelle
Noch ein Kommentar dazu. Ich hatte meine Felder mit dem Benutzerkonto und nicht mit einem Profil verknüpft, aber das sollte leicht zu ändern sein, wenn Sie den Code für profile2 wiederverwenden möchten.
Christowm
1

Ich habe ein allgemeineres (aber nicht perfektes) Modul erstellt, basierend auf der Antwort aus dem endlosen Sommer . Es wird davon ausgegangen, dass die Feldnamen aus Ihrem Profil und dem Knoten identisch sind, und alle Felder aus einem bestimmten Profil werden vorab ausgefüllt:

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'];
        }
    }
}
Martin
quelle