如何防止 Drupal 表单“标记”元素在“提交”元素的包装器内呈现?

问题描述 投票:0回答:2

我已以编程方式向 Drupal 表单添加了“标记”元素。当它在页面上呈现时,该元素将出现在提交按钮的包装器中。 澄清:它应该出现在“field_school_name_value”元素和“distance”元素之间。我设置了每个元素的权重,希望这会强制布局正确,但这似乎没有帮助。我做错了什么?

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

}

php drupal form-api
2个回答
0
投票

我不确定为什么会发生这种情况,没有充分的理由将您的元素呈现在提交按钮的包装器内。

不过,一个简单的解决方法是在提交按钮上使用

#prefix
属性,这将保证您的标记立即在提交按钮的包装器之前呈现:

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

更新

为了解决您的编辑问题,我认为如果您设置

#prefix
元素的
distance
,则可以应用相同的解决方案:

$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
投票

虽然这是一个快7年的老问题了,但我只是运行这个问题。 这是解决方案:https://www.drupal.org/project/views/issues/2070533

首先,您应该在 form_alter 挂钩中声明您的标记,但必须在定义数组中声明“#printed”键。然后您应该在模块或主题中实现 template_preprocess_views_exposed_form() 函数。这里你可以通过drupal_render渲染所需的表单元素并将其添加到$variables中。最后,您可以打印主题中的变量(作为自定义变量或在小部件中)。 但最简单的版本:将views-exposed-form.tpl.php克隆到主题的模板目录中,按照建议命名(例如views-exposed-form--news.tpl.php)并在其中打印换行符你想要。

© www.soinside.com 2019 - 2024. All rights reserved.