为什么我不能将字段移动到 Drupal 表单中的字段集中 - 无法获取当前值

发布于 2024-10-15 00:52:17 字数 301 浏览 3 评论 0原文

我在 Drupal 7 中有一个节点表单,为了为用户简化它,我想使用垂直选项卡功能将其分成几个部分。

使用 hook_form_FORMID_alter() 我可以毫无困难地移动字段。保存节点时,它会正确写入值,并且它们会显示在节点视图中。

但是,当我重新编辑节点时,未设置已移动字段的任何值,因此我实际上丢失了数据。我尝试了各种选项,包括更改 form_state['fields'][field][langcode] 中的 array_parents 值。

(我想知道在预渲染期间移动字段是否会更好。)

有什么想法吗?

I have a node form in Drupal 7, in order to simplify it for the user I want to break it up into sections using the vertical tabs feature.

Using hook_form_FORMID_alter() I can move the fields without difficulty. When the node is saved, it writes the values correctly, and they appear in the node view.

But when I re-edit the node any value for a moved field is not set so I effectively lose the data. I've tried various options including changing the array_parents value in form_state['fields'][field][langcode].

(I wondered whether it would be better to move the fields during pre_render instead.)

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蓝天 2024-10-22 00:52:17

字段 API 字段默认放置在容器字段类型中。如果要将它们转换为垂直选项卡中的字段集,可以执行以下操作:

$form['field_tags']['#type'] = 'fieldset';
$form['field_tags']['#title'] = 'Tags';
$form['field_tags']['#group'] = 'additional_settings';

更好的解决方案是使用新的 字段组模块,以便您可以通过 UI 而不是在代码中进行这些修改。

Field API fields by default are placed into a container field type. If you want to convert them to a fieldset in the vertical tabs, you can do the following:

$form['field_tags']['#type'] = 'fieldset';
$form['field_tags']['#title'] = 'Tags';
$form['field_tags']['#group'] = 'additional_settings';

A better solution would be to use the new Field Group module so you can make these modifications through the UI, rather than in code.

岁月染过的梦 2024-10-22 00:52:17

有时,在表单创建过程的 #after_build 步骤中移动字段项目效果更好。

在 hook_form_alter 中,您可以像这样设置 after build 函数:

function mymodule_form_alter(&$form, &$form_state, $form_id)
{
    $form['#after_build'][] = 'mymodule_myform_after_build';
}

然后您可以像这样定义 after_build 函数:

function mymodule_myform_after_build($form)
{
   //do stuff to the form array
   return $form;
}

我认为您甚至可以在各个元素上定义 after_build 。

不管怎样,这是在所有模块完成其工作后更改表单的好方法。

Sometimes it works better to move field items around in the #after_build step of the form creation process.

in hook_form_alter, you set your after build function like so:

function mymodule_form_alter(&$form, &$form_state, $form_id)
{
    $form['#after_build'][] = 'mymodule_myform_after_build';
}

Then you define your after_build function like so:

function mymodule_myform_after_build($form)
{
   //do stuff to the form array
   return $form;
}

I think you can even define after_build on individual elements.

Anyway, it's a good way to alter the form after all the modules have done their thing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文