input formfelder [geloest]
Eingetragen von quiptime (4972)
am 09.09.2005 - 17:28 Uhr in
am 09.09.2005 - 17:28 Uhr in
Hallo spezies,
versuche gerade vergeblich herauszufinden, wie die input tags aufgebaut werden.
Momentan finde ich keinen roten faden. Kennt sich da jemand aus?
PS.
Ausgangspunkt meiner bemuehung ist das modul feedback. Dort werden die gleichen CSS-klassen wie im rest von drupal verwendet. Ich will dem modul feedback eigene klassen fuer die form-tags geben - um sie separat zu stylen. In feedback.module kann ich beim besten willen nicht den praktizierten weg erkennen, wie dann das jeweilige form-tag entsteht.
- Anmelden oder Registrieren um Kommentare zu schreiben
Hier der betreffende Code
am 09.09.2005 - 17:57 Uhr
Hier der betreffende Code aus dem Modul (ab Zeile 189):
function feedback_display_form () {
global $user;
$edit = $_POST["edit"];
$edit['form_field_name'] = "";
$edit['form_field_email'] = "";
if ($user->name) {
$edit['form_field_name'] = $user->name ;
}
if ($user->mail) {
$edit['form_field_email'] = $user->mail ;
}
if (variable_get("feedback_pageheader", "")) {
$title .= variable_get("feedback_pageheader", "");
}
$instructions = variable_get("feedback_instructions", "");
if ($instructions) {
$message .= $instructions;
}
else {
$message .= t("Enter your message below:");
}
if ( variable_get("feedback_field_name", "") )
$form .= form_textfield (t("Your Full Name"), "form_field_name",
$edit['form_field_name'], 60, 64);
if ( variable_get("feedback_field_email", "") )
$form .= form_textfield (t("Your E-Mail Address"), "form_field_email",
$edit['form_field_email'], 60, 64);
if ( variable_get("feedback_field_postal", "") )
$form .= form_textarea (t("Your Postal Address"), "form_field_postal",
$edit['form_field_postal'], 50, 4);
if ( variable_get("feedback_field_phone", "") )
$form .= form_textfield (t("Your Phone Number"), "form_field_phone",
$edit['form_field_phone'], 60, 64);
if ( variable_get("feedback_field_subject", "") )
$form .= form_textfield (t("Subject"), "form_field_subject",
$edit['form_field_subject'], 60, 64);
if ( variable_get("feedback_field_body", "") )
$form .= form_textarea (t("Message"), "form_field_body",
$edit['form_field_body'], 60, 15);
$form .= form_hidden ("form_field_referer", $_SERVER[HTTP_REFERER]);
$form .= form_submit (t("Send Message"), "op", $edit['op'] );
$output .= $message . form($form, "post");
if ($title) {
$output = theme("box", $title, $output);
}
return $output;
}
Es wird aber bereits für jedes Input-Tag eine eigene Klasse vergeben, du müßtest also eigentlich dort nicht mehr eingreifen müssen.
Wenn doch wäre es eleganter, das über das Theme-System zu machen. Drupal ist mehr ein flexibles CMS-Framework für PHP-Entwickler als ein Out-of-the-Box-CMS und ist dementsprechend auf solche Eingriffe vorbereitet. Evtl. setzt du dich zuerst mit dem PHPTemplate-Engine und den Drupal-Docs auseinander: http://drupal.org/node/509, http://drupaldocs.org/, http://drupaldocs.org/api/head/function/theme_form_element
Ich hoffe, das hilft dir weiter!
Grüße
Björn
*grübel*
am 09.09.2005 - 17:58 Uhr
das feedback modul benutzt standard drupal functions für die Erstellung des Formulars
du brauchst ja wahrscheinlich nur einen div-Wrapper mir eindeutiger ID/class
so wie ich das sehe, wird eine "box" erzeugt, wenn die feedback Seite gerufen wird
angenommen du benutzt phptemplate, dann wird die box.tpl.php als Layout benutzt,
wenn du für dein Theme noch keine hast wird die aus dem engine Verzeichnis genommen
...jedenfalls könntest du in der box.tpl.php auf den "title" abfragen (das ist
der Name deiner Feedback page) und entsprechend eine class/ID setzen
Beispiel mit standard box.tpl.php und ohne Benutzung der Übersetzungsfunktionen
<div <?php if ($title == 'Feedback') : ?>id="feedback"<?php endif; ?> class="box">
<h2><?php print $title ?></h2>
<div class="content"><?php print $content ?></div>
</div>
...das ist nur schnell getippt, evtl. gibts kleinere Syntaxfehler ;-)
MfG Micha
- work in progress mit Langmi.de
@drupalcenter
am 09.09.2005 - 18:48 Uhr
der von dir zitierte code ist genau der, den ich schon am wickel habe. Aber eins stimmt nicht - das in der function feedback_display_form fuer die einzelnen inputfelder eigene klassen gesetzt werden. Der HTML-quellcode zeigt fuer alle inputs die CSS-klasse form-text. Lediglich bei den id's werden einzelne gesetzt.
Momentan arbeite ich mit einer kopie von bluemarine - verwendet xtemplate und nicht phptemplate.
Ist xtemplate eigenstaendig oder eine version von phptemplate?
Um also ein glas milch einzugiessen muss ich jetzt eine kuh kaufen. Will sagen, um separate css-formatierungen im code eines modules zu erzeugen muss ich mir xtemplate und phptemplate reinziehen.
Re: @drupalcenter
am 09.09.2005 - 19:18 Uhr
Sorry - du hast recht - habe ich übersehen!
Momentan arbeite ich mit einer kopie von bluemarine - verwendet xtemplate und nicht phptemplate.
Ist xtemplate eigenstaendig oder eine version von phptemplate?
Xtemplate ist eigenständig und wird (soweit ich weiß) in einer der nächsten Drupal Versionen von phpTemplate abgelöst (im Core).
phpTemplate ist um einiges flexibler. Bluemarine gibt es auch als phpTemplate-Version: http://drupal.org/project/bluemarine
Um also ein glas milch einzugiessen muss ich jetzt eine kuh kaufen. Will sagen, um separate css-formatierungen im code eines modules zu erzeugen muss ich mir xtemplate und phptemplate reinziehen.
Wenn du es so sehen willst - ja! Es ist sauberer und wartbarer, wenn du solche Sachen per Theme angehst, als direkt in ein Modul zu schreiben! Und: Wenn du dich ernsthaft mit Drupal befassen willst, kommst du früher oder später sowieso an den Punkt, an dem du dich damit auseinander setzen mußt...
Grüße
Björn
Einarbeiten
am 10.09.2005 - 00:42 Uhr
Danke dir fuer die tipss. Na dann werde ich mich mal reinarbeiten,
Du hast recht. Sobald man aenderungen an modulen oder corefiles vornimmt wars das mit den updates.
Problem geloest
am 10.09.2005 - 23:48 Uhr
Habe das problem geloest. Meine feedbackformulare koennen nun separate classen zur separaten formatierung bekommen.
Meine loesung ist nur eine einfache veraenderung. Man koennte im modul feedback noch einige kleine erweiterungen vornehmen wie z. bsp. fieldset legend.
"Link zum thread mit der loesung":http://www.drupalcenter.de/node/259 <- Bitte dazu den post "naegel mit koepfen" lesen.
ACHTUNG: habe den post kurz rausgenommen. Die loesung war noch nicht perfekt.
phptemplate - Formular Ansicht verändern
am 12.09.2005 - 06:39 Uhr
quiptime hat nicht ganz unrecht
bisher ist es nicht vorgesehen die labels mit Klassen/IDs versehen zu können
verantwortlich ist diese Theme Funktion
http://drupaldocs.org/api/4.6/function/theme_form_element
und ein Tipp gibts in
http://drupal.org/node/15203#comment-19153
wie dort schon steht, ist es möglich (fast) alle Theme Funktionen mittels eigener Funktionen zu überschreiben zum Nachlesen overriding theme functions
(für unser Beispiell passt aber besser not including drupal.css )
ob da schon was in der kommenden 4.7 gemacht wurde ist mir grad nicht bekannt
kleines proof of concept für eine template.php eines phptemplate themes
<?php
function phptemplate_form_element($title, $value, $description = NULL, $id = NULL, $required = FALSE, $error = FALSE) {
$output = "<div class=\"form-item\">\n";
$required = $required ? '<span class="form-required">*</span>' : '';
if ($title) {
if ($id) {
$output .= " <label for=\"$id\" id=\"$id\">$title:</label>$required<br />\n";
}
else {
$output .= " <label>$title:</label>$required<br />\n";
}
}
$output .= " $value\n";
if ($description) {
$output .= " <div class=\"description\">$description</div>\n";
}
$output .= "</div>\n";
return $output;
}
?>
es dürfte 100% aber nur bei dem Modul Feedback funktionieren, laut Quellcode schickt das immer eine ID mit
MfG Micha
- work in progress mit Langmi.de