是否可以制作第二个“编辑帐户”页面,仅允许用户编辑某些配置文件字段?


14

所以这就是我的情况:我网站上的用户在注册时必须填写大量字段。但是,在它们注册之后,仅需要定期更改这些字段中的四个(约二十个)。我想创建一个单独的“编辑”页面,以允许用户修改这四个字段以使事情保持简单。

  • field_checkbox_a
  • field_checkbox_b
  • field_checkbox_c
  • field_checkbox_d

这些字段都包含在一个字段组中,因此理想情况下,页面将显示此字段组,其中的四个复选框,然后有一个提交和取消按钮。

我想将其作为单独的页面而不是像“ 快速编辑”模块那样进行就地编辑。

用户仍然需要能够访问原始的编辑帐户页面来更改其时区,电子邮件地址等。但是,我确实可以使用单独的屏幕来允许他们编辑最常用的帐户选项。

Answers:


8

我之前也遇到过同样的情况,并使用强大的完整druapl功能hook_form_alter来处理它,我们有2个表单供用户使用,注册和用户编辑

  • user_profile_form(编辑中)
  • user_register_form(正在注册)

我们只需要以编辑方式隐藏您指定的字段,那么在您的自定义模块中

function yourmodule_form_alter(&$form, &$form_state, $form_id)
{
    global $user;

    if ($form_id == "user_profile_form") {
       // ym($form);
       // you also can perform this action for specified roles 
        //if (!(in_array('blogger', $user->roles) || in_array('administrator', $user->roles))) {
            hide($form['field_mytest']);
            // hide other field with this method
        //}
    }

}

该字段存在于注册之后,如下所示

在此处输入图片说明

并且不以编辑方式存在(隐藏)

在此处输入图片说明

您也可以将它们设置为只读,而不用隐藏它们$form['field']['#access'] = FALSE;

另一种解决方案是使用字段权限模块

字段权限模块允许站点管理员设置字段级别的权限,以在任何实体上编辑,查看和创建字段。特征:

  • 在任何实体(不仅是节点)上启用字段权限。
  • 基于角色的字段权限允许根据用户的访问权限来设计不同的查看方式。
  • 作者级权限允许根据实体所有者是谁查看和编辑字段。
  • 默认情况下,不启用每个字段的权限。而是,管理员可以为需要此功能的字段显式启用这些权限。

作为该模块为我们提供的功能,匿名用户(取消注册用户可以编辑那些字段,而注册用户只能查看(只读方式)。


6

除了使用两种形式,您可以使用默认形式,然后添加一个“显示所有设置”复选框,例如以下形式。

$form['show_all_settings'] = array(
  '#type' => 'checkbox',
  '#title' => t('Show all settings'),
);

然后,您可以更改要在选中复选框时显示的表单字段,并为这些表单字段包括以下属性。

'#states' => array(
  'invisible' => array(
   ':input[name="show_all_settings"]' => array('checked' => FALSE),
  ),
),

这样,用户将能够在显示所有设置的表单和显示最少设置的表单之间切换,而无需从页面传递到另一个页面。

参考文献


5

您可以为此使用Profile2模块。

  • 创建配置文件类型或使用默认的主配置文件。
  • 将这些字段添加到该配置文件类型,并将其设置为在注册表单上显示。

这样,这些字段将在用户帐户的其他字段中的注册表格中可用。但是要编辑这些字段,用户应转到配置文件编辑页面而不是用户编辑页面。


我想在用户编辑页面和他们自己的自定义页面上显示四个复选框;我不想从主用户编辑页面中删除它们。
帕特里克·肯尼

1

尝试使用VBO模块,您可以创建一个VBO页面,在视图中添加USER关系,添加那些可供用户修改的字段,设置权限。确保您选择的内容“仅属于” CURRENT用户(通过上下文过滤器)


如何允许用户编辑这些字段?VBO让我显示这些值,但我需要将它们进行编辑。
Patrick Kenny

添加vbo字段,然后勾选“修改实体值”的操作(类似这样,无法记住确切的名称)
gilzero 2012年

谢谢,它被称为修改实体值。不幸的是,这不适用于我的情况,但对于其他人可能是有用的解决方案。
帕特里克·肯尼

1

基于zhilevan对这个问题和这个问题的答案以及对drupal.org的讨论,这是对我有用的实际代码:

function MYMODULE_menu() {
  $items = array();
  $items['user/editpurposes'] = array(
    'title' => t('Change your purposes'),
    'page callback' => 'MYMODULE_purpose_edit_form',
    'access callback' => TRUE,
    'access arguments' => array('access content'),
    'description' => t('Purpose Edit Form'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

function MYMODULE_purpose_edit_form() {
  // Needed to load AJAX.
  module_load_include('inc', 'user', 'user.pages');
  global $user;
  $account = user_load($user->uid); // Load a user object
  $form = drupal_get_form('user_profile_form', $account, 'account', 'purposes');
  return $form;
}

function MYMODULE_form_user_profile_form_alter(&$form, &$form_state) {
  if(isset($form_state['build_info']['args'][2]) && $form_state['build_info']['args'][2] == 'purposes') {

    // Remove name, email, password, etc.
    $form['account']['#access'] = FALSE;
    // Remove language.
    $form['locale']['#access'] = FALSE;
    $form['timezone']['#access'] = FALSE;
    // Remove various custom fields.
    $form['field_acc_displayname']['#access'] = FALSE;
    $form['field_acc_code_agree']['#access'] = FALSE;

    // Needed to load AJAX.
    form_load_include($form_state, 'inc', 'user', 'user.pages');
  }
}

我可以问为什么我没有像我在回答中建议的那样使用Profile2吗?
ЕлинЙ.

0

我认为您应该可以使用“ 字段”组模块整理一下内容,例如将字段放在不同的选项卡下。常见选项卡位于一个选项卡下,其余选项卡位于另一选项卡下。


感谢您提出这个想法,但我已经在使用“字段组”模块。很好,但是我真的只想向用户展示四个选项,而不是全部。
Patrick Kenny 2012年

0

试试这个代码。并隐藏您不想显示的其他字段。

<?php
global $user;
$user=user_load($user->uid);
module_load_include('inc', 'user', 'user.pages');
$user_form = drupal_get_form('user_profile_form', $user);
print(drupal_render($user_form));
?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.