[gelöst] Mit Modul in verschiedenen Inhaltstypen Ausgabe verändern
am 15.12.2009 - 12:48 Uhr in
Hallo Leute,
Ich habe vor, bei bestimmten Inhaltstypen die Ausgabe zu ändern (ich will ein kleines Formular mittels der Form API direkt unter dem Node ausgeben).
Ich könnte zwar den ganzen Code direkt in eine node-typ.tpl.php schreiben, aber das möchte ich eigentlich nicht machen, weil:
- das die node-typ.tpl.php ziemlich aufbläht, weil da schon einige andere Funktionen von mir drin stehen.
- ich diese Funktionalität in mehreren Inhaltstypen benötige. Das heißt, ich müsste mindestens 3 neue node-typ.tpl.php anlegen, welche alle den gleichen Code enthalten und dann bei Änderungen immer alle diese Dateien bearbeiten.
Deswegen dachte ich mir, es wäre wesentlich praktischer, wenn ich die Funktionalität in ein Modul packe.
Also muss mein Modul beim Aufrufen eines Nodes prüfen, ob es zu einem entsprechenden Typ gehört und dann das Formular basteln.
Allerdings wirft das noch ein paar Fragen für mich auf (die Entwicklung eigener Module steckt bei mir leider noch in den Kinderschuhen):
Wie bekomme ich es hin, dass der Node überprüft wird? Das Formular soll nur bei bestimmten Inhaltstypen ausgegeben werden, also muss ich ja bei jedem Nodeaufruf den Typ prüfen, oder? Aber wie kann ich immer dann, wenn ein Node aufgerufen wird, diesen überprüfen?
Das Problem ist weniger das Prüfen des Typs, das kann ich ja mittels der NID machen ($node->type).
Die Frage ist eher, wie ich diese Prüfung immer dann machen kann, wenn ein Node aufgerufen wird.
Ich bin mir leider nicht so ganz darüber im Klaren, wie ich es einrichten kann, dass meine Funktion immer dann aufgerufen wird, wenn ein Node angezeigt werden soll.
Die nächste Frage wäre: Wie bekomme ich das Formular dann in den Node?
Eigentlich soll das Modul ja nicht einfach HTML-Code ausspucken. Aer wie bekomme ich das ganze jetzt dort rein? Ich weiß zwar, dass es die theme()-Funktion gibt, habe aber leider nicht hundertprozentig verstanden, wie ich das benutzen kann/muss =( Muss ich dafür meine Funktionen in der node.tpl.php aufrufen bzw. geht das ohne weiteres?
Wie gesagt, ich stehe leider noch am Anfang und bin mir nicht ganz sicher, wie ich dieses Formular ordentlich ausgeben kann =(
Ich hoffe, ihr könnt mir helfen.
mfg Exterior
- Anmelden oder Registrieren um Kommentare zu schreiben

Das kannst Du doch auch im
am 15.12.2009 - 13:12 Uhr
Das kannst Du doch auch im node.tpl.php machen. Wenn Du nicht 3 gleiche node-typ.tpl.php Files anlegen willst (was Drupal ziemlich egal ist) oder Du den Code nicht 3 mal pflegen willst, wie wäre es mit Templates für Deine Node-Typen, die über include sich den Teil, der gleich ist, reinziehen. Den brauchst Du dann wieder nur einfach zu pflegen. Die andere Möglichkeit wäre ein switch statement im node.tpl.php, das auf den typ prüft und dann eine Function aufruft für den gleichen Code-Anteil. Diese Funktion würde man im template.php File des Themes unterbringen.
Das erscheint mir einfacher als ein eigenes Modul für die Prüfung des Typs.
Beste Grüße
Werner
Mmmh, die Idee ist auch
am 15.12.2009 - 13:39 Uhr
Mmmh, die Idee ist auch nicht schlecht, werde ich mir bis nachher mal überlegen =)
Mal noch eine andere Frage:
Wenn ich mir ein Formular mit der Form API baue, wie kann ich dann Elemente nebeneinander anzeigen?
Beispiel:
Ich habe ein Form-Element vom Typ "radios" und das Options-Array enthält 6 Elemente.
Diese 6 Elemente würden ja einfach untereinander angezeigt.
Wie kann ich es aber einrichten, dass diese 6 Elemente zum Beispiel in zwei Zeilen zu je 3 Elementen angezeigt werden?
Geht das?
mfg Exterior
CSS
am 15.12.2009 - 14:02 Uhr
Da wirst Du Dich in die Tiefen des CSS begeben müssen. Mit #prefix und #suffix kannst Du das Formelement ja mit zusätzlichen divs samt einer Klasse umrahmen. Mit display:inline bekommst Du die Element hintereinander (in eine Zeile). 3 oben und 3 darunter ist etwas schwieriger, dann mußt Du der Div-Box eine feste Breite geben, damit der Umbruch passiert.
Beste Grüße
Werner
So, ich habe jetzt mal zum
am 15.12.2009 - 21:18 Uhr
So, ich habe jetzt mal zum Testen mit diesem Code eine RadioGroup erstellt:
$options = array('Option 1', 'Option 2', 'Option 3');
//Radiobuttons erstellen
$form['test']['optionen'] = array(
'#type' => 'radios',
'#title' => t('Radio-Buttons'),
'#prefix' => '<div class="test-form" style="display:inline;">',
'#suffix' => '</div>',
'#options' => $options,
'#default_value' => variable_get('optionen', $wert),
'#description' => 'Hier siehst du Radio-Buttons',
);
Leider werden die Radio-Buttons immer noch untereinander angezeigt, anstatt nebeneinander.
Habe mich bisher leider noch nicht so viel mit CSS auseinandergesetzt =(
Muss ich die Klasse "test-form" vorher irgendwo näher definieren, damit das klappt? Wenn ja, wo und wie, hab davon leider noch nicht so viel Ahnung =(
Den style solltest Du wieder
am 15.12.2009 - 21:30 Uhr
Den style solltest Du wieder rausnehmen. Das packt man in das Stylesheet seines Themes (heißt meistens style.css). Nimm Dir den Firefox mit dem Plugin Firebug und probiere aus, welche Style Definitionen dafür verantwortlich sind. Du kannst auch im Firebug ausprobieren, was wie wirkt.
Beste Grüße
Werner
Den style solltest Du wieder
am 15.12.2009 - 21:34 Uhr
Den style solltest Du wieder rausnehmen. Das packt man in das Stylesheet seines Themes (heißt meistens style.css). Nimm Dir den Firefox mit dem Plugin Firebug und probiere aus, welche Style Definitionen dafür verantwortlich sind. Du kannst auch im Firebug ausprobieren, was wie wirkt.
Beste Grüße
Werner
Den style solltest Du wieder
am 15.12.2009 - 21:35 Uhr
Den style solltest Du wieder rausnehmen. Das packt man in das Stylesheet seines Themes (heißt meistens style.css). Nimm Dir den Firefox mit dem Plugin Firebug und probiere aus, welche Style Definitionen dafür verantwortlich sind. Du kannst auch im Firebug ausprobieren, was wie wirkt.
Ohne Einarbeitung in CSS wirst Du das Aussehen Deiner Webseite aber nicht richtig in den Griff bekommen.
Beste Grüße
Werner
Nimm Dir den Firefox mit dem
am 15.12.2009 - 22:19 Uhr
Nimm Dir den Firefox mit dem Plugin Firebug
Darüber habe ich schon oft nachgedacht, aber leider lehnt mein Notebook den Feuerfuchs ab, warum auch immer, den kann ich einfach nicht starten, hab ich mich schon lange mit auseinander gesetzt. Allerdings kann ich mal Opera Dragonfly verwenden, dass dürfte so ähnlich sein wie Firebug.
Geschafft =)
am 17.12.2009 - 15:05 Uhr
Hey, die neueste Firefox-Version funktioniert auf meinem Laptop =) Ich hab bisher immer mal wieder versucht, die aktuelle Version zu installieren (eben weil ich Firebug mal probieren wollte), aber bisher hat keine funktioniert, mit der aktuellen klappt es =)
Leider habe ich immer noch nicht besonders viel Ahnung von CSS =( Sowas lernt man eben auch nicht über nacht -,-'
Allerdings habe ich mein Problem trotzdem lösen können :)
Die Optionen für die Radio-Buttons (bzw. habe ich jetzt Checkboxen genommen) müssen dynamisch aus gegebenen Daten erzeugt werden. Also habe ich einzelne Checkboxen als Typ genommen und erzeuge mit einer Schleife die nötige Anzahl mit fortlaufender Nummerierung.
Und für jede Checkbox setze ich Prefix und Suffix mittels einer Funktion.
So sieht mein Code dafür aus:
<?php
function empfang_prefix($uid, $spalten){
if ($uid == '1'){
return '<table><tr><td>';}
else{
if($spalten == 1){
return '<tr><td>';}
else{
return '<td>';}
}
}
function empfang_suffix($spalten){
if ($spalten == 3){
return '</td></tr>';}
else{
return '</td>';}
}
.
[....]
.
$userindex = 1;
$spalte = 1;
.
while ($row = db_fetch_object($erg)){
$uid = $row->uid;
$myuser = user_load(array('uid' => $uid));
profile_load_profile($myuser);
$username = $myuser->profile_vorname . ' ' . $myuser->profile_nachname;
.
$form['email']['empfang']['user'.$userindex] = array(
'#type' => 'checkbox',
'#title' => $username,
'#prefix' => empfang_prefix($userindex, $spalte),
'#suffix' => empfang_suffix($spalte),
'#return_value' => $row->mail,
);
.
$userindex++;
.
if ($spalte == 3){
$spalte = 1;}
.
else{
$spalte++;}
}
.
$anzahl = $userindex-1;
.
$form['email']['empfang']['user'.$anzahl]['#suffix'] = '</td></tr></table>';
?>
(Die Punkte zwischen den Zeilen dienen nur als Abstandhalter, ich habe noch nicht herausgefunden, wie ich hier im Forum Leerzeilen in den Quelltext einfügen kann und ohne diese Zwischenräume wäre es zu unübersichtlich -,-' Vielleicht kann mir mal jemand verraten, wie das geht ;) )
Ich weiß jetzt nicht, ob die CSS-erfahrenen Leute unter euch mich für diese Lösung auslachen werden ;) Aber sie funktioniert recht gut, ich kann schnell mal die gewünschte Spaltenzahl ändern, die Ausgabe ist schön geordnet, so wie ich sie haben will und ich musste nicht versuchen, unbeholfen im CSS rum zu pfuschen, ohne die nötigen Kenntnisse zu besitzen. Wenn ich mich mal mit CSS beschäftigt habe, kann ich das immer noch ändern :P
Außerdem bin ich den Weg gegangen, dass ichdas ganze in eine eigene Datei gepackt und per Include eingefügt habe. Vielen Dank für den Tip, wla, hat super geklappt =)