¿Es posible crear una segunda página de "editar cuenta" que solo permita a los usuarios editar algunos campos de perfil?

14

Así que aquí está mi situación: los usuarios de mi sitio deben completar una cantidad bastante grande de campos al registrarse. Sin embargo, después de que se registren, solo cuatro (de aproximadamente veinte) de estos campos deben cambiarse regularmente. Me gustaría crear una página de "edición" separada para permitir a los usuarios modificar solo estos cuatro campos para simplificar las cosas.

  • field_checkbox_a
  • field_checkbox_b
  • field_checkbox_c
  • field_checkbox_d

Todos estos campos están contenidos en un grupo de campos, por lo que idealmente la página debería mostrar este grupo de campos, las cuatro casillas de verificación dentro de él, y luego tener un botón de enviar y cancelar, eso es todo.

Quiero hacer esto como una página separada, no como una edición in situ como el módulo de Edición rápida .

Los usuarios aún necesitan poder acceder a la página de edición original de la cuenta para cambiar su zona horaria, dirección de correo electrónico, etc., pero realmente podría usar una pantalla separada para permitirles editar las opciones de cuenta más comunes.

Patrick Kenny
fuente

Respuestas:

8

Tuve la misma situación antes y la manejé con la poderosa función druapl completa hook_form_alter , tenemos 2 formularios para usuario, registro y edición de usuario

  • user_profile_form (en edición)
  • user_register_form (en registro)

Solo necesitamos ocultar sus campos especificados de forma editada. Entonces, en su módulo personalizado

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
        //}
    }

}

Después de que ese campo exista en el registro, como puede ver a continuación

ingrese la descripción de la imagen aquí

y no existe (ocultar) en forma de edición

ingrese la descripción de la imagen aquí

También puede configurarlos como de solo lectura en lugar de ocultarlos con$form['field']['#access'] = FALSE;

Y otra solución es usar el módulo de permisos de campo

El módulo de permisos de campo permite a los administradores del sitio establecer permisos de nivel de campo para editar, ver y crear campos en cualquier entidad. caracteristicas:

  • Habilite los permisos de campo en cualquier entidad, no solo en los nodos.
  • Permisos de campo basados ​​en roles que permiten una visualización diferente según el acceso que tenga el usuario.
  • Los permisos a nivel de autor permiten ver y editar campos en función de quién es el propietario de la entidad.
  • Los permisos para cada campo no están habilitados de forma predeterminada. En cambio, los administradores pueden habilitar estos permisos explícitamente para los campos donde se necesita esta característica.

Como características que este módulo proporciona para nosotros, el usuario anónimo (el usuario no registrado puede editar esos campos y el usuario registrado solo puede ver (solo lectura).

Yusef
fuente
6

En lugar de tener dos formularios, puede usar el predeterminado y agregar una casilla de verificación "Mostrar todas las configuraciones", como la siguiente.

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

Luego, puede alterar los campos de formulario que desea mostrar cuando se selecciona la casilla de verificación e incluir la siguiente propiedad para esos campos de formulario.

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

De esta forma, los usuarios podrían alternar entre un formulario que muestra toda la configuración y un formulario que muestra un conjunto mínimo de configuraciones, sin pasar de una página a otra.

Referencias

kiamlaluno
fuente
5

Puede usar el módulo Profile2 para eso.

  • Cree un tipo de perfil o use el perfil principal predeterminado.
  • Agregue esos campos a ese tipo de perfil y configúrelos para que se muestren en el formulario de registro.

Para que esos campos estén disponibles en el formulario de registro entre los otros campos de la cuenta de usuario . Pero para editar esos campos, el usuario debe ir a la página de edición de perfil en lugar de la página de edición de usuario .

Елин Й.
fuente
Quiero mostrar las cuatro casillas de verificación en la página de edición del usuario y su propia página personalizada; No quiero eliminarlos de la página principal de edición del usuario.
Patrick Kenny
1

Pruebe el módulo VBO , puede crear una página VBO, agregar la relación USUARIO a la vista, agregar los campos que están disponibles para que el usuario modifique, establecer el Permiso. Asegúrese de seleccionar el contenido "pertenece" solo al usuario ACTUAL (a través del filtro contextual)

gilzero
fuente
¿Cómo puedo permitir que el usuario edite estos campos? VBO me permite mostrar los valores, pero necesito que sean editables.
Patrick Kenny el
Agregue el campo vbo y luego marque la operación de 'modificar valores de entidad' (algo así, no puedo recordar cómo se llama exactamente)
gilzero
Gracias, se llama modificar valores de entidad . Desafortunadamente, esto no funciona para mi caso, pero puede ser una solución útil para otros.
Patrick Kenny el
1

Basado en la respuesta de zhilevan a esta pregunta y esta pregunta y esta discusión en drupal.org , aquí está el código real que funciona para mí:

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');
  }
}
Patrick Kenny
fuente
¿Puedo preguntar por qué Profile2 no era una opción, como sugerí en mi respuesta?
Елин Й.
0

Creo que deberías poder ordenar un poco las cosas con el módulo de grupo de campo , por ejemplo, poner campos bajo diferentes pestañas. Los comunes en una pestaña y el resto en otra pestaña.

enzipher
fuente
Gracias por esta idea, pero ya estoy usando el módulo Field Group. Es bueno, pero realmente solo quiero mostrar cuatro opciones al usuario, no todo.
Patrick Kenny
0

Prueba este código. y esconde otros campos que no quieres mostrar.

<?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));
?>
monymirza
fuente