Ist es möglich, eine zweite Seite zum Bearbeiten des Kontos zu erstellen, auf der nur Benutzer einige Profilfelder bearbeiten können?


15

Hier ist meine Situation: Benutzer auf meiner Website müssen bei der Registrierung eine große Anzahl von Feldern ausfüllen. Nach der Registrierung müssen jedoch nur vier (von etwa zwanzig) dieser Felder regelmäßig gewechselt werden. Ich möchte eine separate "Bearbeitungs" -Seite erstellen, damit Benutzer nur diese vier Felder ändern können, um die Dinge einfach zu halten.

  • field_checkbox_a
  • field_checkbox_b
  • field_checkbox_c
  • field_checkbox_d

Diese Felder sind alle in einer Feldgruppe enthalten. Im Idealfall zeigt die Seite diese Feldgruppe und die vier Kontrollkästchen darin an und verfügt dann über eine Schaltfläche zum Senden und Abbrechen.

Ich möchte dies als separate Seite tun und nicht direkt bearbeiten wie das Quick Edit- Modul.

Benutzer müssen weiterhin in der Lage sein, auf die ursprüngliche Seite zum Bearbeiten des Kontos zuzugreifen, um ihre Zeitzone, E-Mail-Adresse usw. zu ändern. Ich könnte jedoch einen separaten Bildschirm verwenden, auf dem sie die gängigsten Kontooptionen bearbeiten können.

Antworten:


9

Ich hatte die gleiche Situation vor und handhabte es mit Power Full Druapl Funktion hook_form_alter , wir haben 2 Formulare für Benutzer, Registrierung und Benutzer bearbeiten

  • user_profile_form (in Bearbeitung)
  • user_register_form (bei der Registrierung)

Wir müssen nur Ihre angegebenen Felder in Bearbeitungsart verstecken, also in Ihrem benutzerdefinierten Modul

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

}

Nachdem dieses Feld in der Registrierung vorhanden ist, wie Sie unten sehen können

Bildbeschreibung hier eingeben

und nicht in bearbeitender Weise existieren (verstecken)

Bildbeschreibung hier eingeben

Sie können sie auch als schreibgeschützt festlegen, anstatt sie mit auszublenden$form['field']['#access'] = FALSE;

Und eine andere Lösung wird unter Verwendung von Feld Erlaubnis Modul

Mit dem Modul "Feldberechtigungen" können Site-Administratoren Berechtigungen auf Feldebene zum Bearbeiten, Anzeigen und Erstellen von Feldern für eine beliebige Entität festlegen. Eigenschaften:

  • Aktivieren Sie die Feldberechtigungen für alle Entitäten, nicht nur für Knoten.
  • Rollenbasierte Feldberechtigungen, die je nach Zugriff des Benutzers unterschiedliche Anzeigemuster ermöglichen.
  • Berechtigungen auf Autorenebene ermöglichen das Anzeigen und Bearbeiten von Feldern basierend auf dem Eigentümer der Entität.
  • Berechtigungen für jedes Feld sind standardmäßig nicht aktiviert. Stattdessen können Administratoren diese Berechtigungen explizit für die Felder aktivieren, in denen diese Funktion erforderlich ist.

Als Funktionen, die dieses Modul für uns bietet, können anonyme Benutzer (abgemeldete Benutzer können diese Felder bearbeiten und registrierte Benutzer nur sehen (schreibgeschützt).


7

Anstatt über zwei Formulare zu verfügen, können Sie das Standardformular verwenden und ein Kontrollkästchen "Alle Einstellungen anzeigen" hinzufügen, z. B. das folgende.

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

Anschließend können Sie die Formularfelder ändern, die angezeigt werden sollen, wenn das Kontrollkästchen aktiviert ist, und die folgende Eigenschaft für diese Formularfelder einschließen.

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

Auf diese Weise können die Benutzer zwischen einem Formular mit allen Einstellungen und einem Formular mit nur wenigen Einstellungen wechseln, ohne von einer Seite zu einer anderen wechseln zu müssen.

Verweise


6

Dafür können Sie das Profile2- Modul verwenden.

  • Erstellen Sie einen Profiltyp oder verwenden Sie das Standardhauptprofil.
  • Fügen Sie diese Felder zu diesem Profiltyp hinzu und legen Sie fest, dass sie auf dem Registrierungsformular angezeigt werden.

Damit diese Felder auf dem Registrierungsformular unter den anderen Feldern des Benutzerkontos verfügbar sind . Um diese Felder zu bearbeiten, muss der Benutzer jedoch die Profilbearbeitungsseite anstelle der Benutzerbearbeitungsseite aufrufen.


Ich möchte die vier Kontrollkästchen auf der Benutzerbearbeitungsseite und auf ihrer eigenen benutzerdefinierten Seite anzeigen. Ich möchte sie nicht von der Hauptbearbeitungsseite des Benutzers entfernen.
Patrick Kenny

2

Versuchen Sie es mit dem VBO- Modul. Sie können eine VBO-Seite erstellen, eine USER-Beziehung in der Ansicht hinzufügen, die Felder hinzufügen, die dem Benutzer zum Ändern zur Verfügung stehen, und die Berechtigung festlegen. Stellen Sie sicher, dass Sie Inhalte auswählen, die nur CURRENT-Benutzern gehören (über den Kontextfilter).


Wie kann ich dem Benutzer erlauben, diese Felder zu bearbeiten? Mit VBO kann ich die Werte anzeigen, sie müssen jedoch bearbeitbar sein.
Patrick Kenny

Füge ein vbo-Feld hinzu und kreuze dann die Operation 'Entitätswerte ändern' an (so etwas, kann mich nicht erinnern, wie es genau heißt)
Gilzero

Danke, es heißt Entitätswerte ändern . Leider funktioniert dies in meinem Fall nicht, aber es kann eine nützliche Lösung für andere sein.
Patrick Kenny

2

Basierend auf der Antwort von zhilevan auf diese Frage und diese Diskussion auf drupal.org ist hier der aktuelle Code, der für mich funktioniert:

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

kann ich fragen, warum Profile2 keine Option war, wie ich in meiner Antwort vorgeschlagen habe?
Елин Й.

0

Ich denke, Sie sollten in der Lage sein, mit dem Feldgruppenmodul ein wenig aufzuräumen , z. B. Felder unter verschiedenen Registerkarten zu platzieren. Gemeinsame unter einer Registerkarte und der Rest unter einer anderen Registerkarte.


Vielen Dank für diese Idee, aber ich verwende bereits das Feldgruppenmodul. Es ist gut, aber ich möchte dem Benutzer eigentlich nur vier Optionen zeigen, nicht alles.
Patrick Kenny

0

Versuchen Sie diesen Code. und andere Felder ausblenden, die Sie nicht anzeigen möchten.

<?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));
?>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.