2012-11-13 21 views
6

Mam pewne kolekcje pól, które są dołączone do typu węzła i jestem w trakcie pisania niestandardowego formularza, używając interfejsu API formularza Drupal.Potrzebujesz przykładu dołączenia kolekcji pól do formularza drupal - drupal 7

Jak załadować pola kolekcji pól do formularza? Czy powinienem używać hook_form, hook_field lub czegoś innego?

Czy ktoś może mi podać prosty przykład napisania elementu formularza, który jest zbiorem pól o nieograniczonej liczności?

Odpowiedz

0

Udało mi się użyć następującego kodu do załadowania formularza zbierania pola. Dodałem dodatkowe komentarze i usunięto niestandardową logikę, która wyszukuje wartości pól ze zmiennej $ form_state ['values'].

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

Próbkę złożyć obsługi @see w przedkładać obsługi można posłużyć się przykładem podanym w 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

Jeśli szukasz zapełnić węzeł z zawartością za pomocą formularza, zawsze można wystawiać formularz węzła dla użytkownika i hook_form_alter, aby ukryć elementy na podstawie dostępu użytkownika.

Lub jeśli szukasz formularza do wypełnienia, możesz użyć entityform, a następnie użyć reguł do wypełnienia innej treści.

0

Jest też inna koncepcja zgrupowane pól w formularzach Drupal nazywa

Fieldset

Pozwala sformatować grupę elementów formularza. Przykład na stronie formularzy api dotyczy modułu kontaktowego z poniższym kodem.

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"))), 
    ); 
    } 
} 

Tak więc jeśli twoim zamiarem jest po prostu pogrupować różne rodzaje pól, to jest to również sposób na zrobienie tego.