2011-11-30 65 views
0

我已經編程添加了一個「標記」元素到Drupal表單。當它在頁面上呈現時,該元素將出現在提交按鈕的包裝中。 說明:應該出現在'field_school_name_value'元素和'distance'元素之間。我已經設定了每個元素的權重,希望這會強制佈局是正確的,但似乎沒有幫助。我究竟做錯了什麼?如何在「submit」元素的包裝中呈現Drupal表單「標記」元素?

<?php 
function abq_misc_form_alter(&$form, &$form_state, $form_id) { 
    if ($form_id == 'views_exposed_form') { 
    $state_select = array(
     '#attributes' => array(
     'style' => 'width:10em;', 
    ), 
     '#default_value' => 'All', 
     '#multiple' => FALSE, 
     '#options' => array_merge(array('All' => 'State'), location_get_provinces()), 
     '#title' => NULL, 
     '#type' => 'select', 
     '#weight' => 0, 
    ); 
    $form['province'] = $state_select; 

    $school = &$form['field_school_name_value']; 
    $school['#attributes'] = array(
     'size' => 15, 
    ); 
    $school['#weight'] = 1; 

    // THIS GUY 
    $form['divider'] = array(
     '#type' => 'item', 
     '#markup' => '<div>&ndash;or&ndash;</div>', 
     '#weight' => 2, 
    ); 

    $form['distance']['#weight'] = 3; 

    $search_distance = &$form['distance']['search_distance']; 
    $search_distance['#attributes'] = array(
     'placeholder' => 'miles', 
     'size' => '5', 
    ); 
    $search_distance['#prefix'] = 'Within'; 
    $search_distance['#suffix'] = 'of'; 
    unset($search_distance['#title']); 
    $search_distance['#weight'] = 0; 

    $postal_code = &$form['distance']['postal_code']; 
    unset($postal_code['#title']); 
    $postal_code['#attributes'] = array(
     'placeholder' => 'Zip Code', 
     'size' => '5', 
    ); 
    $postal_code['#weight'] = 1; 

    hide($form['distance']['search_units']); 

    $form['submit']['#weight'] = 4; 
} 

}

回答

0

我不知道爲什麼會發生的事情,也沒有很好的理由,你的元素來包裝內呈現提交按鈕。

一個簡單的辦法,雖然是使用上的提交按鈕#prefix屬性,它會保證您的標記是在包裝之前立即呈現提交按鈕:

$form['submit']['#prefix'] = '<div>&ndash;or&ndash;</div>'; 

UPDATE

只是爲了解決您的編輯問題,我認爲如果您設置了distance元素的#prefix,則可以應用相同的解決方案:

$form['distance']['#prefix'] = '<div>&ndash;or&ndash;</div>'; 

另一個模塊可能會執行一些額外的格式化,這些模塊實現了hook_form_alter,後者恰好在您的後面運行,從而搞亂了您的良好工作。通過在distance元素上應用前綴,您可以確保它在緊挨着field_school_name_value元素之前出現。

我應該提一下,在提及$form(您正在使用$school = &$form['field_school_name_value'];)的數組成員時,我遇到了與此相關的問題。作爲一個額外的完整性檢查,我建議改變的代碼位這一點,看看是否有幫助(其他的建議,然後嘗試這個上面,因爲它可能只是解決它):

$form['field_school_name_value']['#attributes'] = array('size' => 15); 
$form['field_school_name_value']['#weight'] = 1; 

,而不是

$school = &$form['field_school_name_value']; 
$school['#attributes'] = array(
    'size' => 15, 
); 
$school['#weight'] = 1; 
+0

對不起,我的原始問題還不清楚。我希望它出現在'field_school_name_value'元素和'distance'元素之間。似乎如果我在這兩者的權重之間進行權衡,它應該可行......但事實並非如此。 – Xaq

+0

@Xaq:不用擔心,我已經更新了上面的答案應該有所幫助。 – Clive

+0

我實施了這兩個建議,但我仍然存在的問題。我需要將分隔線與其他表單元素放在同一水平線上,因爲它需要水平居中在其他元素的上下兩對之間({州和學校}和{距離和提交}。將分隔線作爲前綴將其放在元素之前,但仍然在包裝內,然後它的中心位置與它前綴的元素的寬度相同,這比整個表單的寬度要短。 – Xaq