在Drupal7中创建水平窗体选项卡

时间:2020-03-05 15:25:31  来源:igfitidea点击:

在Drupal7窗体中创建垂直选项卡是一项简单的任务,但是为了满足设计需要,我们有时不得不使用不同的样式。
例如,可能需要水平选项卡。
对于购物车签出这样的页面来说,这一点更有意义。
其中需要在Drupal内核之外寻找解决方案,因为在core中水平标签并不容易获得。

但是contrib模块发挥作用来释放Drupal核心的限制。
在这篇博文中,我将揭示一种使用fieldgroupcontrib模块创建水平选项卡的Drupal方法。

注意,还有一个contrib模块具有类似的名称,它现在已经过时了。

这个模块以一种安静的方式提供了一种新的表单API类型,基本上是与字段(也称为CCK)一起使用的。
但是没有任何文档或者API引用来展示它的用法,以便在定制表单中利用它们。

经过一些代码演练&一些跟踪和错误的努力,我能够理解它的用法,它与core中的垂直选项卡非常相似。

下面的代码片段来自测验模块,

if (function_exists('userpoints_userpointsapi') && variable_get('quiz_has_userpoints', 1)) {
  $form['userpoints'] = array(
    '#type' => 'fieldset',
    '#title' => t('Userpoints'),
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
    '#group' => 'additional_settings',
  );
  $form['userpoints']['has_userpoints'] = array(
    '#type' => 'checkbox',
    '#default_value' => (isset($node->has_userpoints) ? $node->has_userpoints : 1),
    '#title' => t('Enable UserPoints Module Integration'),
    '#description' => t('If checked, marks scored in this @quiz will be credited to userpoints. For each correct answer 1 point will be added to user\'s point.', array('@quiz' => QUIZ_NAME)),
  );
  $form['userpoints']['userpoints_tid'] = array(
    '#type' => 'select',
    '#options' => _quiz_userpoints_type(),
    '#title' => t('Userpoints Category'),
    '#states' => array(
      'visible' => array(
        ':input[name=has_userpoints]' => array('checked' => TRUE),
      ),
    ),
    '#default_value' => isset($node->userpoints_tid) ? $node->userpoints_tid : 0,
    '#description' => t('Select the category to which user points to be added. To add new category see <a href="!url">admin/structure/taxonomy/userpoints</a>', array('!url' => url('admin/structure/taxonomy/userpoints'))),
  );
}

对于任何Drupal开发人员来说,这段代码都应该是不言自明的,但简单地说,如果启用了Userpoints模块,我们基本上是在测试节点表单中定义一个新的字段集。

键值"#group"=>"添加设置"将此字段集转换为垂直选项卡项。

这是它在节点窗体中的外观,

现在要将drupal7中的(CCK)字段转换为水平制表符样式,我们需要安装上述字段组模块,并在所需的内容类型中创建包装器字段类型。
例如,请参见下面的快照,

管理文章内容类型的字段页

字段组模块有足够的指针来处理字段。

更多的管理域页面快照可以在项目页面的"另外屏幕截图和视频"部分找到。

本模块的有趣之处在于将水平选项卡添加到自定义表单中,这可以通过使用字段组中定义的新表单api类型"Horizontal_tabs"来实现(但没有正确记录)。

请参见下面的代码以显示其用法,

<?php
$form = array();
$form['my_field'] = array(
  '#type' => 'horizontal_tabs',
  '#tree' => TRUE,
  '#prefix' => '<div id="unique-wrapper">',
  '#suffix' => '</div>',
);
$items = array(
  array(
    'nid' => 1,
    'name' => 'Item 1'
  ),
  array(
    'nid' => 2,
    'name' => 'Item 2'
  ),
  array(
    'nid' => 3,
    'name' => 'Item 3'
  ),
  array(
    'nid' => 4,
    'name' => 'Item 4'
  ),
);
$counter = 1;
foreach ($items as $item) {
  $nid = $item['nid'];
  $form['my_field']['stuff'][$nid] = array(
    '#type' => 'fieldset',
    '#title' => t('Item @no', array('@no' => $counter)),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
  );
  $form['my_field']['stuff'][$nid]['form']['item_id'] = array(
    '#type' => 'value',
    '#value' => $item['nid'],
  );
  $form['my_field']['stuff'][$nid]['form']['item_name'] = array(
    '#type' => 'value',
    '#value' => $item['name'],
  );
  $form['my_field']['stuff'][$nid]['form']['remove'] = array(
      '#type' => 'checkbox',
      '#title' => t('Remove this item'),
      '#weight' => -51,
  );
  //more field definition
  $form['my_field']['stuff'][$nid]['form']['#tree'] = TRUE;
  $form['my_field']['stuff'][$nid]['form']['#parents'] = array('my_field', 'stuff', $nid, 'form');
  $counter++;
}

上面的代码片段试图提供一个实际的示例来利用方便的表单api类型。
代码应该是不言自明的,并且可以通过在任何formbuilder/formalter函数中复制粘贴来进行扩展。