我有一个包含许多CCK字段的节点。我想隐藏匿名用户的字段。我发现http://www.lullabot.com/articles/modifying-forms-5-and-6大致有两种方法。首先,我使用下面的代码尝试了theme_theme()
function ssaa_theme1(&$existing, $type, $theme, $path) {
return array(
'volunteer_node_form' => array(
'arguments' => array('form' => null),
),
);
}
function ssaa_volunteer_node_form($form) {
$out = '';
if (user_is_anonymous()) {
unset($form['field_active']);
}
$out .= drupal_render($form);
return $out;
}
这个简单的代码在我预期的情况下运行良好,但也产生了奇怪的结果。保存/预览按钮出现在表单的顶部,我无法将它们移动到底部。起初我怀疑drupal_render()函数,但它没有对订单做任何事情。当ssaa_volunteer_node_form()函数为空时,它产生相同的结果。
所以我尝试了使用hook_form_alter()并成功的第二个选项。但我仍然想弄清楚为什么第一种方法不能正常工作。我认为做我想做的事情更轻松,更轻松。
有什么想法吗?
答案 0 :(得分:1)
如果您只想向用户拒绝这一个字段,那么form_alter就有意义了。否则,我还建议您使用内容权限。它将使您能够切换所有字段的此类设置,而无需文本编辑器。
CCK字段输入表单不能很好地接受hook_form_alter()
。它们可以在循环的后期插入到节点编辑表单中。
This example演示了如何禁用CCK表单元素,它可以根据您的需要进行调整。
由于您有非常具体的需求,您可能需要查看新的Field Permissions模块。它仍在开发中(我还没有尝试过),但它允许您选择单个字段到内容权限。这可以防止您的权限屏幕变得混乱,并防止所有新字段默认为无法访问。
答案 1 :(得分:0)
我认为您可以使用CCK捆绑的内容权限模块来设置字段级权限。启用该模块后,所有字段都将显示在“权限”区域中,您可以拒绝匿名用户的权限。我认为这将是一种更容易实现这一目标的方法。
答案 2 :(得分:0)
我最近在Drupal 6中遇到了同样的问题,你的问题是有效的。
当我使用Devel的dsm()函数显示$ form对象(来自 template.php )时,我发现按钮以某种方式显示重量为0.0111,浮。
template.php 中的 hook_theme()然后 hook_form()似乎表现不对。 使用hook_form我没有更改$ form对象,并返回drupal_render($ form),Save / Preview按钮位于顶部。
对于需要使用这些挂钩的任何人,您还必须创建一个 form_alter ,您可以在其中设置按钮的重量。这样可以抵消错误并再次将按钮调到底部。
$form['buttons']['#weight'] = 100;
注意:我无法在 hook_form()代码中设置权重,它必须位于 form_alter