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?
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?
Antworten:
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.
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.
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.
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.
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.
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.
Panels können das Profilbearbeitungsformular vollständig übernehmen und mit einer Handvoll Patches (derzeit) können Sie Profile2-Informationen als Panels-Beziehung abrufen.