È possibile creare una seconda pagina "modifica account" che consenta agli utenti di modificare solo alcuni campi del profilo?


14

Quindi ecco la mia situazione: gli utenti sul mio sito devono compilare un numero piuttosto grande di campi al momento della registrazione. Tuttavia, dopo la registrazione, solo quattro (su una ventina) di questi campi devono essere cambiati regolarmente. Vorrei creare una pagina "modifica" separata per consentire agli utenti di modificare solo questi quattro campi per semplificare le cose.

  • field_checkbox_a
  • field_checkbox_b
  • field_checkbox_c
  • field_checkbox_d

Questi campi sono tutti contenuti in un gruppo di campi, quindi idealmente la pagina mostrerebbe questo gruppo di campi, le quattro caselle di controllo al suo interno, e quindi avrebbe un pulsante di invio e annullamento, tutto qui.

Voglio fare questo come una pagina separata, non una modifica sul posto come il modulo Modifica rapida .

Gli utenti devono comunque essere in grado di accedere alla pagina di modifica dell'account originale per modificare il fuso orario, l'indirizzo e-mail, ecc. Ma potrei davvero utilizzare una schermata separata per consentire loro di modificare le opzioni dell'account più comuni.

Risposte:


8

Ho avuto la stessa situazione prima e la gestisco con la potenza completa della funzione druapl hook_form_alter , abbiamo 2 moduli per utente, registrazione e modifica utente

  • user_profile_form (in modifica)
  • user_register_form (in registrazione)

Dobbiamo solo nascondere i campi specificati in modalità di modifica, quindi nel modulo personalizzato

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

}

Dopo che quel campo esiste nella registrazione, come puoi vedere sotto

inserisci qui la descrizione dell'immagine

e non esiste (nascondi) in modo modifica

inserisci qui la descrizione dell'immagine

Inoltre puoi impostarli come letti solo nascondendoli con$form['field']['#access'] = FALSE;

E un'altra soluzione sta usando il modulo di autorizzazione sul campo

Il modulo Autorizzazioni campo consente agli amministratori del sito di impostare autorizzazioni a livello di campo per modificare, visualizzare e creare campi su qualsiasi entità. Caratteristiche:

  • Abilita le autorizzazioni di campo su qualsiasi entità, non solo sui nodi.
  • Autorizzazioni di campo basate sul ruolo che consentono diversi schemi di visualizzazione in base all'accesso dell'utente.
  • Le autorizzazioni a livello di autore consentono la visualizzazione e la modifica dei campi in base a chi è il proprietario dell'entità.
  • Le autorizzazioni per ciascun campo non sono abilitate per impostazione predefinita. Al contrario, gli amministratori possono abilitare esplicitamente queste autorizzazioni per i campi in cui è necessaria questa funzione.

Come caratteristiche che questo modulo fornisce per noi utenti anonimi (gli utenti non registrati possono modificare i campi e registrare solo gli utenti vedono (sola lettura).


6

Invece di avere due moduli, è possibile utilizzare quello predefinito e aggiungere una casella di controllo "Mostra tutte le impostazioni", come quella seguente.

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

Quindi, è possibile modificare i campi modulo che si desidera mostrare quando la casella di controllo è selezionata e includere la seguente proprietà per quei campi modulo.

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

In questo modo, gli utenti sarebbero in grado di alternare tra un modulo che mostra tutte le impostazioni e un modulo che mostra un set minimo di impostazioni, senza passare da una pagina all'altra.

Riferimenti


5

È possibile utilizzare il modulo Profile2 per questo.

  • Crea un tipo di profilo o usa il profilo principale predefinito.
  • Aggiungi quei campi a quel tipo di profilo e impostali per essere mostrati sul modulo di registrazione.

In modo che quei campi saranno disponibili sul modulo di registrazione tra gli altri campi dall'account utente . Ma per modificare quei campi, l'utente dovrebbe andare alla pagina di modifica del profilo anziché alla pagina di modifica dell'utente .


Voglio mostrare le quattro caselle di controllo nella pagina di modifica dell'utente e nella propria pagina personalizzata; Non desidero rimuoverli dalla pagina di modifica dell'utente principale.
Patrick Kenny,

1

Prova il modulo VBO , puoi creare una pagina VBO, aggiungere una relazione USER in vista, aggiungere quei campi disponibili per l'utente alla mod, impostare l'autorizzazione. Assicurati di selezionare il contenuto "appartiene" solo all'utente CORRENTE (tramite Filtro contestuale)


Come posso consentire all'utente di modificare questi campi? VBO mi consente di visualizzare i valori, ma ho bisogno che siano modificabili.
Patrick Kenny,

Aggiungi campo vbo quindi spunta l'operazione di "modifica valori entità" (qualcosa del genere, non ricordo come si chiama esattamente)
gilzero,

Grazie, si chiama modifica valori entità . Sfortunatamente, questo non funziona nel mio caso, ma potrebbe essere una soluzione utile per gli altri.
Patrick Kenny,

1

Sulla base della risposta di Zhilevan a questa domanda, questa domanda e questa discussione su drupal.org , ecco il codice attuale che funziona per me:

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');
  }
}

posso chiedere perché Profile2 non era un'opzione, come ho suggerito nella mia risposta?
Елин Й.

0

Penso che dovresti essere in grado di riordinare un po 'le cose con il modulo del gruppo Field , ad esempio mettere i campi in diverse schede. Quelli comuni in una scheda e il resto in un'altra scheda.


Grazie per questa idea, ma sto già utilizzando il modulo Field Group. È buono ma voglio solo mostrare quattro opzioni all'utente, non tutto.
Patrick Kenny,

0

prova questo codice. e nascondi altri campi che non vuoi mostrare.

<?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));
?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.