2011-11-30 72 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