Чи можливо створити другу сторінку "редагувати обліковий запис", яка дозволяє користувачам редагувати лише деякі поля профілю?


14

Тож ось моя ситуація: користувачі на моєму сайті повинні заповнити досить велику кількість полів при реєстрації. Однак після їх реєстрації лише чотири (з приблизно двадцяти) цих полів потрібно регулярно змінювати. Я хотів би створити окрему сторінку "редагування", щоб дозволити користувачам змінювати лише ці чотири поля, щоб зробити їх просто.

  • field_checkbox_a
  • field_checkbox_b
  • field_checkbox_c
  • field_checkbox_d

Усі ці поля містяться в групі полів, тому в ідеалі на сторінці відображатиметься ця група полів, чотири прапорці всередині неї, а потім є кнопка надсилання та скасування, ось і все.

Я хочу це зробити як окрему сторінку, а не на місці редагування, як модуль швидкого редагування .

Користувачам все-таки потрібно мати доступ до оригінальної сторінки облікового запису для редагування, щоб змінити часовий пояс, адресу електронної пошти тощо. Але я міг реально використовувати окремий екран, щоб дозволити їм редагувати найпоширеніші параметри облікового запису.

Відповіді:


8

У мене була така ж ситуація і раніше, і вирішувати її з повною функцією druapl power kukform_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 у вид, додати ті поля, які доступні користувачеві для модифікації, встановити дозвіл. Переконайтесь, що ви вибрали вміст, який "належить" тільки поточному користувачеві (через контекстний фільтр)


Як можна дозволити користувачеві редагувати ці поля? VBO дозволяє мені відображати значення, але я потребую їх редагування.
Патрік Кенні

Додайте поле vbo, а потім позначте операцію "змінити значення сутності" (щось подібне, не можу згадати, як саме це називається)
gilzero

Дякую, це називається змінити значення сутності . На жаль, це не працює для мого випадку, але це може бути корисним рішенням для інших.
Патрік Кенні

1

Виходячи з відповіді Жилевана на це запитання, на це питання та на обговорення на 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

Я думаю, ви повинні мати змогу трохи відрегулювати речі за допомогою модуля Field Field , наприклад, розмістити поля під різними вкладками. Поширені під однією вкладкою, а інші під іншою.


Дякую за цю ідею, але я вже використовую модуль Field Group. Це добре, але мені дуже хочеться показати чотири варіанти користувачеві, не все.
Патрік Кенні

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));
?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.