2012-10-12 21 views
5

Było to metoda z CCK w Drupal 6 dołączyć pole CCK w naszej niestandardowej formy, jak:Dodaj pole CCK do formularza niestandardowego w Drupal 7

$field = content_fields('field_name'); // field_name is cck field 
(text_field,text_Area,image_field anything.) 
$form['#field_info'][$name] = $field; 
$form += content_field_form($form, $form_state, $field); 

jaki sposób można osiągnąć tę samą funkcjonalność w Drupal 7 ? Miałem formularz i chcę użyć pola, które utworzyłem dla typu zawartości. Przeszedłem przez wszystkie pliki field.module, ale nie mogłem nic znaleźć. Istnieją w nim funkcje, takie jak _attach_field, field_info_Field i field_info_instance, ale nie można ich renderować jako pola formularza.

+1

Jest to możliwe, ale dość niechlujne. Możesz znaleźć przykład kodu [tutaj] (http://drupal.stackexchange.com/questions/25140/is-displaying-a-working-field-widget-form-on-its-own-possible) – Clive

Odpowiedz

2

Podoba mi się twoje rozwiązanie dodawania całego formularza i rozbrajania. Atakuję go pod innym kątem - utwórz tymczasowy formularz wyrzucania i kopiuj tylko w polu (polach), które chcesz zachować. Oto, co opublikowałem pod adresem: http://api.drupal.org/api/drupal/modules%21field%21field.attach.inc/function/field_attach_form/7#comment-45908:

Aby dodać pojedyncze pole z dowolnego pakietu jednostek (w tym przypadku pola tekstowego z autodopełnieniem) na inny formularz, utwórz formularz jako tymczasową formę i formstate i skopiuj na miejsce ta definicja pola. W moim przypadku, ja pracuję na formularzu zamawiania Commerce zmieniać:

function example_form_commerce_checkout_form_checkout_alter(&$form, &$form_state, $form_id) { 
    $tmpform = array(); 
    $tmpform_state = array(); 
    $tmpnode = new stdClass(); 
    $tmpnode->type = 'card'; 
    // Create the temporary form/state by reference 
    field_attach_form('node', $tmpnode, $tmpform, $tmpform_state); 
    // Create a new fieldset on the Commerce checkout form 
    $form['cart_contents']['org_ref_wrap'] = array(
    '#type' => 'fieldset', 
    '#title' => t('Support Organization'), 
); 
    // Place a copy of the new form field within the new fieldset 
    $form['cart_contents']['org_ref_wrap'][] = $tmpform['field_card_organization']; 
    // Copy over the $form_state field element as well to avoid Undefined index notices 
    $form_state['field']['field_card_organization'] = $tmpform_state['field']['field_card_organization']; 

    .. 

Zaletą albo rozwiązanie prawdopodobnie zależy od stopnia złożoności „źródło” forma (zbyt skomplikowane oznacza wiele unsets z form- insert method) i czy formularz źródłowy kiedykolwiek otrzyma nowe pola w czasie (nowe pola pojawią się w formularzu "miejsca docelowego" w metodzie "insert-insert").

Dzięki za podzielenie się swoim rozwiązaniem!

+0

Dzięki temu naprawdę pomocny!! – miteshmap

+0

@texasbronius Czy możesz pomóc mi dołączyć pole użytkownika do mojego niestandardowego formularza? Oto plik [form.inc] (https://www.dropbox.com/s/o1gf5j51n7jbo81/statuses.form.inc?dl=0) – Umair

2

Wreszcie dostałem odpowiedź. Oto sztuczka, aby to zrobić.

$node = new stdClass(); 
$node->type = 'video'; //content type 
field_attach_form('node', $node, $form, $form_state); 
unset($form['body']); //unset other fields like this. 

spowoduje wyświetlenie wszystkich niestandardowych pól dodawanych z api pola. więc musisz anulować wszelkie dodatkowe pola, których nie chcesz wyświetlać w formularzu. reszta będzie taka, jak jest IT.