2012-11-13 9 views
6

Ich habe einige Feld Sammlungen, die an einen Knotentyp angeschlossen sind, und ich bin dabei, ein benutzerdefiniertes Formular mit Drupal Form API zu schreiben.Benötigen Sie ein Beispiel zum Anhängen einer Feldsammlung an ein Drupal-Formular - Drupal 7

Wie gehe ich zum Laden dieser Feldsammlungsfelder in das Formular? Sollte ich hook_form, hook_field oder etwas anderes verwenden?

Kann mir jemand ein einfaches Beispiel für das Schreiben eines Formularelements geben, das eine Feldsammlung mit unbegrenzter Kardinalität ist?

Antwort

0

Ich konnte den folgenden Code verwenden, um Feldsammlungsformular zu laden. Ich habe zusätzliche Kommentare hinzugefügt und benutzerdefinierte Logik entfernt, die nach Feldwerten aus der Variable $ form_state ['values'] sucht. einreichen

function mymodule_custom_form($form, $form_state, $args){ 
    $form = array(); 
    $type = $args['type']; 
    $id = $args['id']; 
    module_load_include('inc', 'field_collection', 'field_collection.pages'); 
    if(!empty($entity->field_comments[LANGUAGE_NONE][0]['value'])){ 
    $field_collection_item = field_collection_item_load($entity->field_comments[$entity->language][0]['value'], TRUE); 
    $output = drupal_get_form('field_collection_item_form', $field_collection_item); 
    }else{ 
    $output = field_collection_item_add('field_comments', 'node', $entity->nid); 
    } 
    dpm($output); 
    // If you want to use field collection form submit handlers as is, just return the below 
    // In case you want to use your own custom submit handlers then do modify the $output array as seems fit. 
    $form['field_collection_element'] = $output; 
    // You may also attach the $output array to your custom form array. Make sure you handle submit handlers properly 

    return $form; 
} 

Eine Probe Handler @see in einreichen Handler Sie das Beispiel in bestimmten verwenden können here

function mymodule_custom_form_submit($form, $form_state){ 
    ... 
    if(empty($item_id)){ 
    $field_collection_item = entity_create('field_collection_item', array('field_name' => $field_name)); 
    $field_collection_item->setHostEntity('node', $node); 
    } 
    else { 
    $items = entity_load('field_collection_item', array($item_id)); 
    $field_collection_item = $items[$item_id]; 
    } 
    if(is_object($field_collection_item)){ 
    // for references. 
    $field_collection_item->field1[$node->language][0]['target_id'] = $field1_val; 
    // normal values 
    $field_collection_item->field2[$node->language][0]['value'] = $field2_val; 
    $field_collection_item->field3[$node->language][0]['value'] = $field3_val; 
    if(empty($item_id)){ 
     $field_collection_item->save(FALSE); 
    } 
    else{ 
     $field_collection_item->save(TRUE); 
    } 
    } 
    ... 
} 
0

Wenn Sie schauen, um einen Knoten mit Inhalt unter Verwendung einer Form zu füllen, könnte man immer aussetzen das Knotenformular für den Benutzer und hook_form_alter zum Ausblenden von Elementen auf Benutzerzugriffsbasis.

Oder, wenn Sie nach einem vorstellbaren Formular suchen, können Sie entityform verwenden und Regeln verwenden, um anderen Inhalt zu füllen.

0

Es gibt auch ein anderes Konzept von gruppierten Feldern in Drupal Formen genannt

Fieldset

Dies ermöglicht eine Gruppe von Formularelementen zu formatieren. Beispiel auf der Formular-API-Seite ist für Kontakt-Modul mit dem Code unten.

function contact_form_user_profile_form_alter(&$form, &$form_state) { 
    if ($form['#user_category'] == 'account') { 
    $account = $form['#user']; 
    $form['contact'] = array(
     '#type' => 'fieldset', 
     '#title' => t('Contact settings'), 
     '#weight' => 5, 
     '#collapsible' => TRUE, 
    ); 
    $form['contact']['contact'] = array(
     '#type' => 'checkbox', 
     '#title' => t('Personal contact form'), 
     '#default_value' => !empty($account->data['contact']) ? $account->data['contact'] : FALSE, 
     '#description' => t('Allow other users to contact you via a <a href="@url">personal contact form</a> which keeps your e-mail address hidden. Note that some privileged users such as site administrators are still able to contact you even if you choose to disable this feature.', array('@url' => url("user/$account->uid/contact"))), 
    ); 
    } 
} 

Wenn also Ihre Absicht ist es eine Möglichkeit, es zu tun, um gerade Gruppe verschiedene Arten von Feldern togather dann ist dies auch.

Verwandte Themen