Czy można utworzyć drugą stronę „edycji konta”, która pozwala użytkownikom edytować tylko niektóre pola profilu?

14

Oto moja sytuacja: użytkownicy mojej witryny muszą wypełnić dość dużą liczbę pól podczas rejestracji. Jednak po zarejestrowaniu tylko cztery (z około dwudziestu) tych pól wymagają regularnej zmiany. Chciałbym utworzyć osobną stronę „edycji”, aby umożliwić użytkownikom modyfikowanie tylko tych czterech pól w celu uproszczenia.

  • field_checkbox_a
  • field_checkbox_b
  • field_checkbox_c
  • field_checkbox_d

Wszystkie te pola są zawarte w grupie pól, więc najlepiej strona wyświetlałaby tę grupę pól, cztery pola wyboru w środku, a następnie miała przycisk przesyłania i anulowania, to wszystko.

Chcę to zrobić jako osobną stronę, a nie edycję w miejscu, jak moduł szybkiej edycji .

Użytkownicy nadal muszą mieć dostęp do oryginalnej strony konta edycji, aby zmienić strefę czasową, adres e-mail itp., Ale naprawdę mogę użyć osobnego ekranu, aby umożliwić im edycję najczęściej używanych opcji konta.

Patrick Kenny
źródło

Odpowiedzi:

8

Miałem już tę samą sytuację i poradziłem sobie z nią z pełną mocą funkcji druapl hook_form_alter , mamy 2 formularze dla użytkownika, rejestracji i edycji użytkownika

  • user_profile_form (w edycji)
  • user_register_form (podczas rejestracji)

Musimy tylko ukryć określone pola w sposób edytowalny Tak w niestandardowym module

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

}

Po tym pole istnieje w rejestracji, jak widać poniżej

wprowadź opis zdjęcia tutaj

i nie istnieją (ukryją się) w sposób edycyjny

wprowadź opis zdjęcia tutaj

Możesz także ustawić je jako tylko do odczytu, zamiast ukrywać je$form['field']['#access'] = FALSE;

Innym rozwiązaniem jest użycie modułu uprawnień terenowych

Moduł Uprawnienia do pól umożliwia administratorom witryn ustawianie uprawnień na poziomie pola do edytowania, przeglądania i tworzenia pól na dowolnym obiekcie. Cechy:

  • Włącz uprawnienia do pól dla dowolnej jednostki, nie tylko węzłów.
  • Uprawnienia do pól oparte na rolach, pozwalające na różne wzorce wyświetlania w zależności od tego, jaki dostęp ma użytkownik.
  • Uprawnienia na poziomie autora umożliwiają przeglądanie i edycję pól w zależności od tego, kto jest właścicielem encji.
  • Uprawnienia dla każdego pola nie są domyślnie włączone. Zamiast tego administratorzy mogą jawnie włączyć te uprawnienia dla pól, w których ta funkcja jest potrzebna.

Jako funkcje, które ten moduł zapewnia nam anonimowy użytkownik (użytkownik niezarejestrowany może edytować te pola i rejestrować tylko użytkownik (tylko do odczytu).

Yusef
źródło
6

Zamiast dwóch formularzy możesz użyć domyślnego i dodać pole wyboru „Pokaż wszystkie ustawienia”, takie jak poniższy.

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

Następnie możesz zmienić pola formularza, które chcesz wyświetlać, gdy pole wyboru jest zaznaczone, i uwzględnić następującą właściwość dla tych pól formularza.

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

W ten sposób użytkownicy będą mogli przełączać się między formularzem pokazującym wszystkie ustawienia, a formularzem pokazującym minimalny zestaw ustawień, bez przechodzenia ze strony na inną.

Bibliografia

kiamlaluno
źródło
5

Możesz do tego użyć modułu Profile2 .

  • Utwórz typ profilu lub użyj domyślnego profilu głównego.
  • Dodaj te pola do tego typu profilu i ustaw, aby były wyświetlane w formularzu rejestracyjnym.

Aby pola te były dostępne w formularzu rejestracyjnym wśród innych pól z konta użytkownika . Ale aby edytować te pola, użytkownik powinien przejść do strony edycji profilu zamiast strony edycji użytkownika .

Елин Й.
źródło
Chcę pokazać cztery pola wyboru na stronie edycji użytkownika i na własnej stronie niestandardowej; Nie chcę ich usuwać z głównej strony edycji użytkownika.
Patrick Kenny,
1

Wypróbuj moduł VBO , możesz utworzyć stronę VBO, dodać widoczną relację USER, dodać pola, które użytkownik może modyfikować, ustawić uprawnienia. Upewnij się, że wybierasz zawartość „należy” tylko do AKTUALNEGO użytkownika (poprzez Filtr kontekstowy)

gilzero
źródło
Jak mogę pozwolić użytkownikowi na edycję tych pól? VBO pozwala mi wyświetlać wartości, ale potrzebuję ich do edycji.
Patrick Kenny
Dodaj pole vbo, a następnie zaznacz operację „modyfikuj wartości encji” (coś takiego, nie pamiętam, jak to się dokładnie nazywa)
gilzero,
Dzięki, nazywa się to modyfikowaniem wartości encji . Niestety nie działa to w moim przypadku, ale może być przydatnym rozwiązaniem dla innych.
Patrick Kenny,
1

W oparciu o odpowiedź Zhilevana na to pytanie i to pytanie oraz dyskusję na drupal.org , oto prawdziwy kod, który działa dla mnie:

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
źródło
czy mogę zapytać, dlaczego Profile2 nie było opcją, jak zasugerowałem w mojej odpowiedzi?
Елин Й.
0

Myślę, że powinieneś być w stanie trochę uporządkować za pomocą modułu Grupa pól , np. Umieścić pola pod różnymi zakładkami. Zwykłe pod jedną kartą, a pozostałe pod inną kartą.

szyfrować
źródło
Dzięki za ten pomysł, ale już korzystam z modułu Field Group. To dobrze, ale tak naprawdę chcę tylko pokazać użytkownikowi cztery opcje, a nie wszystko.
Patrick Kenny,
0

wypróbuj ten kod. i ukryj inne pola, których nie chcesz pokazywać.

<?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
źródło