Theming user_profile_form (das Benutzerbearbeitungsformular)

7

Ich suche nach einfachen Möglichkeiten, das Benutzerprofilformular zu thematisieren, mit denen ich ein zweispaltiges Layout für das Formular einrichten und bestimmte Elemente ausschließen kann.

Wie kann ich das erreichen?

Areynolds
quelle
Ich habe diese Frage aus zwei Gründen erstellt: Erstens, weil ich eine Weile gebraucht habe, um meine persönliche Methode zur Lösung dieses Problems herauszufinden, und anderen Kummer ersparen wollte. Zweitens, um zu sehen, ob jemand anderes eine bessere Möglichkeit hat, nicht nur das Benutzerprofilformular, sondern auch Formulare im Allgemeinen zu thematisieren. Ich werde Links zu guten Fragen zum Thema Thema veröffentlichen, sobald ich sie sehe. andere sind herzlich eingeladen, dasselbe zu tun.
Areynolds
Die Drupal-Dokumentation zu Theming-Knoten-Formularen ist ein guter Ausgangspunkt für allgemeine Anweisungen zum Formular-Theming: drupal.org/node/1092122
Areynolds

Antworten:

7

Abgesehen von der Verwendung des Display Suite-Moduls erfordern die meisten Methoden zum Thematisieren von Formularen das Schreiben von Code. In der folgenden Methode definiere ich Variablen aus dem Formular, die in einer Vorlagendatei ausgegeben werden können, damit sie zu der gewünschten HTML-Struktur passen. Ich habe meinen gesamten Code in template.php eingefügt, aber Sie können genauso einfach ein benutzerdefiniertes Modul erstellen, um dies zu tun.

  1. Fügen Sie eine Implementierung von hook_theme () hinzu

    function YOURTHEME_theme($existing, $type, $theme, $path){
      return array(
        'user_profile_form' => array(
          'render element' => 'form',
          'template' => 'user-profile-form',
          'path' => drupal_get_path('theme', 'YOURTHEME') . '/templates', 
          //add '/templates' only if you store template files in an additional folder
        ),
    
      );
    }

    Dies teilt dem Drupal-Themensystem mit, dass in YOURTHEME / templates eine Vorlagendatei darauf wartet.

  2. Als Nächstes definieren wir einige Variablen, die in einer hook_preprocess_HOOK-Funktion an diese Vorlage übergeben werden sollen. Wir können das strukturierte Array des Formulars in $ variables ['form'] finden und die Formularelemente den Variablen zuweisen, die wir in unserer Datei tpl.php herumwerfen möchten.

    function YOURTHEME_preprocess_user_profile_form(&$variables) {
      $form_inputs = array(
        'account' => $variables['form']['account'],
        'picture' => $variables['form']['picture'],
        'actions' => $variables['form']['actions'],
      );
      $variables['rendered'] = _YOURTHEME_form_variables_render_all($form_inputs);
    }
    
    function _YOURTHEME_form_variables_render_all($elements) {
        //Create array to return, with element name as key and element as value
        $elements_array = array();
        //For each element, render it and add it to the array
        foreach ($elements as $key => $element) {
            $elements_array[$key] = render($element);
        }
        //Return array
        return $elements_array;
    }

    In diesem Beispiel werden die allgemeinen Kontoinformationsfelder, das Feld zum Hochladen von Benutzerbildern (sofern Bilder aktiviert sind) und die Übermittlungsaktionen in eine Variable namens "gerendert" eingefügt.

  3. Nachdem wir diese Variablen definiert haben, können wir sie in einer Vorlagendatei ausgeben. Erstellen Sie eine Vorlagendatei mit dem Namen user-profile-form.tpl.php in 'YOURTHEME / templates'. Dies ist ein Demo-Beispiel:

    <div id="new-form">
      <?php echo $rendered['picture']; ?>
      <?php echo $rendered['account']; ?>
      <?php echo $rendered['actions']; ?>
      <input type="hidden" name="form_id" value="<?php print $form['#form_id']; ?>" />
      <input type="hidden" name="form_build_id" value="<?php print $form['#build_id']; ?>" />
      <input type="hidden" name="form_token" value="<?php print $form['form_token']['#default_value']; ?>" />
    </div>

Beachten Sie die ausgeblendeten Formularfelder am Ende. Dazu gehören wichtige Drupal-Token, mit denen Formulare vor Angriffen geschützt werden. Ihr Formular funktioniert ohne sie nicht.

Wenn Sie Ihre Benutzerbearbeitungsseite besuchen, sollten jetzt nur einige allgemeine Kontoinformationsfelder und die Bildfelder angezeigt werden. Erstellen Sie verschiedene Variablen in der Vorverarbeitungsfunktion, um Formularelemente zu trennen, und platzieren Sie sie an einer beliebigen Stelle in der Datei user-profile-form.tpl.php. Fügen Sie dabei das gewünschte Markup hinzu.

Areynolds
quelle
Gibt es einen Grund, warum Sie Display Suite-Formulare vermeiden?
Capi Etheriel
Es ist so lange her, dass ich mich ehrlich gesagt nicht erinnere. Ich denke, dass die Möglichkeit, Formulare in einer Vorlagendatei auszugeben (während die Forms-API weiterhin leistungsstarke, sichere Formulare im Backend-Code generiert), ein großer Gewinn für Flexibilität und Codetrennung ist. viel näher an dem MVC-Modell sollte Drupal anstreben.
Areynolds
Komm schon, Drupal ist weder MVC noch sollte es sein. Überprüfen Sie garfieldtech.com/blog/mvc-vs-pac (obwohl dieser Beitrag ziemlich alt ist, hilft es immer noch, Dinge zu klären).
Capi Etheriel
1
Es stimmt, zu sagen, dass es ein MVC-Paradigma "anstreben sollte", ist definitiv nur eine Meinung (und ich mag den Artikel übrigens). Ich denke, mein Punkt ist nicht, dass Drupal strengen MVC-Richtlinien folgen sollte, sondern dass Vorlagendateien den Themen häufig wenig Drupal-Erfahrung mehr Flexibilität bieten als das Erlernen einer anderen Abstraktionsschicht (DS) oder einer Drupal-API. Ich denke, dass dieser Standpunkt an Glaubwürdigkeit gewinnt; Ich freue mich auf eine viel einfachere Präsentationsebene in D8 mit der Twig-Initiative. Code wie dieser ist im Grunde nur ein dummer Hack, um dorthin zu gelangen.
Areynolds
1

Display-Suiten können nur für die Anzeige verwendet werden, nicht für die Bearbeitung. Es war großartig, wenn es mit beidem umgehen konnte.

rpataca
quelle
Mit Display Suite 7.x können Benutzerbearbeitungsformulare bearbeitet werden. In begrenztem Umfang.
Druvision
0

Einige Korrekturen für den Code von areynolds :

Unterstrich in 'Renderelement beheben

function YOURTHEME_theme($existing, $type, $theme, $path){
  return array(
    'user_profile_form' => array(
      'render element' => 'form',
      'template' => 'user-profile-form',
      'path' => drupal_get_path('theme', 'YOURTHEME') . '/templates', 
      //add '/templates' only if you store template files in an additional folder
    ),

  );
}

Korrektur der Vorverarbeitungsfunktion durch Überschreiben von Daten (Konto-> Bild) und Hinzufügen von Aktionselementen (Formularschaltfläche).

function YOURTHEME_preprocess_user_profile_form(&$variables) {
  $required_elements[]=$variables['form']['account'];
  $required_elements[]=$variables['form']['picture'];
  $required_elements[]=$variables['form']['actions'];
  $variables['rendered'] = drupal_render($required_elements);
}

Aber all diese Manipulationen geben nur das Aussehen der Form. Das Formular funktioniert jedoch nicht ordnungsgemäß, da andere Elemente wie Validieren, Übermitteln von Handlern usw. erforderlich sind. Daher denke ich, dass der beste Weg, nicht benötigte Elemente im Array $ variables ['form'] auszublenden, alle erforderlichen Formularmetadaten belässt.

ACD
quelle
Vielen Dank an @ACD, dass Sie mich hierher zurückgebracht haben, um meinen alten Noob-Code zu überprüfen. Ich habe die von Ihnen vorgeschlagenen Korrekturen vorgenommen und einige weitere Verbesserungen hinzugefügt (nämlich sicherzustellen, dass die Formular-Token tatsächlich enthalten sind). Ich bin mir nicht ganz sicher, wie oder ob dieser Code jemals funktioniert hat. Möglicherweise wurde ein Formular angezeigt, es hätte jedoch nicht gesendet werden können.
Areynolds
0

Panels können das Profilbearbeitungsformular vollständig übernehmen und mit einer Handvoll Patches (derzeit) können Sie Profile2-Informationen als Panels-Beziehung abrufen.

Ergophobie
quelle