客户端请求管理员能够像其他用户一样提交表单。我创建了一个管理员表单,该表单具有按角色筛选的现有用户的动态填充下拉列表。提交表单时,提交前过滤器将从用户下拉列表中获取该值,并更改表单数据以反映表单是由所选用户创建的。
阅读重力表单文档可以在表单对象中找到以下属性:
useCurrentUserAsAuthor bool 对于具有Post字段的表单,这将确定是否应使用当前登录用户作为作者来创建Post。1使用当前用户,否则为0。
postAuthor integer 当useCurrentUserAsAuthor设置为0时,此属性包含将用作文章作者的用户Id。
基于此信息,我编写了此筛选函数:
function submit_as_user_proxy( $form )
{
$id = null;
$proxy_user_meta = null;
$user_role = \'\';
$field_existing_users = null;
$field_signed_up_as = null;
foreach ( $form[\'fields\'] as &$field )
{
if ( false !== strpos( $field->cssClass, \'existing_users\' ) )
{
$field_existing_users = $field;
}
if ( false !== strpos( $field->cssClass, \'signed_up_as\' ) )
{
$field_signed_up_as = $field;
}
}
$id = $_POST[ \'input_\' . $field_existing_users->id ];
$proxy_user_meta = get_userdata( $id );
$roles = $proxy_user_meta->roles;
if ( ! empty( $roles ) )
{
$user_role = $roles[0];
}
$_POST[ \'input_\' . $field_signed_up_as->id ] = $user_role;
$form[\'useCurrentUserAsAuthor\'] = 0;
$form[\'postAuthor\'] = $id;
return $form;
}
这不起作用,已成功更改$\\u POST数据,但在条目中查看时,表单对象的更改不会反映在提交中。
有人对此有什么见解吗?
SO网友:Taishi
我发现的一个解决方案是在提交后使用以下方法操纵条目:
function submit_as_user_proxy( $form )
{
$id = null;
$proxy_user_meta = null;
$user_role = \'\';
$field_existing_users = null;
$field_signed_up_as = null;
foreach ( $form[\'fields\'] as &$field )
{
if ( false !== strpos( $field->cssClass, \'existing_users\' ) )
{
$field_existing_users = &$field;
}
if ( false !== strpos( $field->cssClass, \'signed_up_as\' ) )
{
$field_signed_up_as = &$field;
}
}
$id = $_POST[ \'input_\' . $field_existing_users->id ];
$proxy_user_meta = get_userdata( $id );
$roles = $proxy_user_meta->roles;
if ( ! empty( $roles ) )
{
$user_role = $roles[0];
}
$_POST[ \'input_\' . $field_signed_up_as->id ] = $user_role;
$form[\'useCurrentUserAsAuthor\'] = 0;
$form[\'postAuthor\'] = $id;
add_action(
\'gform_after_submission_\' . $form[\'id\'],
function( $entry ) use( $id )
{
$entry_id = $entry[\'id\'];
GFAPI::update_entry_property( $entry_id, \'created_by\', $id );
return $entry;
}
);
return $form;
}