我有一个模块,我定义了内容类型。我们假设我只有title
和body
个字段。
当节点表单呈现时,它具有标准title (textfield)
和body (textarea)
。
我想将这两个字段包装成fieldset
。
这就是我实现这个目标的方式,但我觉得这不是最好的方式。
/**
* Implements hook_form().
*/
function hook_form($node, $form_state) {
return node_content_form($node, $form_state);
}
/**
* Implements hook_form_FORM_ID_alter().
*/
function hook_form_node_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'content_type_name_node_form') {
$form['info'] = array(
'#type' => 'fieldset',
'#title' => t('Describe your content')
);
$form['info']['title'] = $form['title'];
unset($form['title']);
$form['info']['body'] = $form['body'];
unset($form['body']);
}
}
有关如何改善它的任何建议吗?
更新
我想到的另一种变体。它几乎相同,只是略有改进。
/**
* Implements hook_form_FORM_ID_alter().
*/
function hook_form_node_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'content_type_name_node_form') {
$groups = array(
'info' => array(
'title' => t('Describe your content'),
'fields' => array('title', 'body')
)
);
foreach ($groups as $key => $group) {
$form[$key] = array(
'#type' => 'fieldset',
'#title' => $group['title']
);
foreach ($group['fields'] as $field) {
$form[$key][$field] = $form[$field];
unset($form[$field]);
}
}
}
}
答案 0 :(得分:4)
我不得不同意大卫·费尔斯的观点 - 我不知道你们是如何做到这一点的。
但只是为您提供一种非编程方式来设置字段集中的标题和正文字段:您可以查看Field Group module。
顾名思义,Fieldgroup将组合字段组合在一起。所有 可现场实体将有可能添加要换行的组 他们的田地在一起Fieldgroup附带默认的HTML包装器 像垂直标签,水平标签,手风琴,字段集或div 包装
说实话,如果您想要做的就是为您的标题和正文创建一个字段集,那么它可能有点过分,但如果您对字段分组和主题有其他类似的要求,那么让UI执行它可能会很有用。你。
答案 1 :(得分:3)
你正在做的就像弗拉德一样。这就是API的使用方式,而且实际上没有其他方法可以通过代码来实现。
你也可以使用面板改变布局,虽然我自己也没有这样做,也无法解释这个过程,也不能肯定地说它会完全按照你在这里做的那样去做。使用自定义模块可能是最直接的途径。