Можно ли создать вторую страницу «Изменить учетную запись», которая позволяет пользователям редактировать только некоторые поля профиля?

14

Итак, вот моя ситуация: пользователи на моем сайте должны заполнить довольно большое количество полей при регистрации. Однако после регистрации только четыре (из двадцати) этих полей необходимо регулярно менять. Я хотел бы создать отдельную страницу редактирования, чтобы позволить пользователям изменять только эти четыре поля, чтобы все было просто.

  • field_checkbox_a
  • field_checkbox_b
  • field_checkbox_c
  • field_checkbox_d

Все эти поля содержатся в группе полей, поэтому в идеале на странице должна отображаться эта группа полей, четыре флажка внутри нее, а затем кнопка «Отправить» и «Отмена», вот и все.

Я хочу сделать это как отдельную страницу, а не редактировать на месте, как модуль Quick Edit .

Пользователям по-прежнему необходимо иметь доступ к исходной странице редактирования учетной записи, чтобы изменить их часовой пояс, адрес электронной почты и т. Д., Но я действительно мог бы использовать отдельный экран, чтобы позволить им редактировать наиболее распространенные параметры учетной записи.

Патрик Кенни
источник

Ответы:

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 в поле зрения, добавить те поля, которые доступны пользователю для мода, установить Permission. Убедитесь, что вы выбрали контент, принадлежащий только ТЕКУЩЕМУ пользователю (через контекстный фильтр)

gilzero
источник
Как я могу позволить пользователю редактировать эти поля? 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

Я думаю, что вы должны быть в состоянии немного навести порядок с модулем группы полей , например, поместить поля под разными вкладками. Общие под одной вкладкой, а остальные под другой вкладкой.

enzipher
источник
Спасибо за эту идею, но я уже использую модуль 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));
?>
monymirza
источник