Positionierung von Feldern bzw. Modulen
![](http://www.drupalcenter.de/files/noavatar_mini.gif)
am 22.12.2008 - 04:11 Uhr in
Einen wunderschönen guten Morgen,
ich habe ein weiteres Positionierungsproblem und würde euch bitten mir zu helfen.
Ich möchte gerne div. CCK Felder oder Module wie zb das Fivestar Modul an einer anderen Stelle haben.
Elemente wie zb Kommentarlinks konnte ich einfach durch verschieben des Codes
<?php if ($links): ?>
<div class="links">
<?php print $links; ?>
</div>
<?php endif; ?>
ändern.
Jedoch wo wird der Code eingefügt der durch ein Modul erzeugt wird. Wie z.B. bei dem Fivestar Modul? Dieses wird ja im Contentbereich ausgegeben, ich möchte es jedoch ausserhalb des Contenbereichs haben
Hier meine node.tpl! Nun möchte ich das Modul ganz unten nach dem Ende des Node-Inners haben!
<div class="node <?php print $node_classes ?>" id="node-<?php print $node->nid; ?>"><div class="node-inner">
<?php if ($page == 0): ?>
<h2 class="title">
<a href="<?php print $node_url; ?>"><?php print $title; ?></a>
</h2>
<?php endif; ?>
<?php if ($unpublished) : ?>
<div class="unpublished"><?php print t('Unpublished'); ?></div>
<?php endif; ?>
<?php if ($picture) print $picture; ?>
<?php if ($submitted): ?>
<div class="submitted">
<?php print $submitted; ?>
</div>
<?php endif; ?>
<?php if (count($taxonomy)): ?>
<div class="taxonomy"><?php print t(' in ') . $terms; ?></div>
<?php endif; ?>
<div class="content">
<?php print $content; ?>
</div>
<?php if ($links): ?>
<div class="links">
<?php print $links; ?>
</div>
<?php endif; ?>
</div></div> <!-- /node-inner, /node -->
- Anmelden oder Registrieren um Kommentare zu schreiben
Allgemeiner Tipp: Layout per CSS
am 22.12.2008 - 11:19 Uhr
Hallo,
ganz allgemein würde ich versuchen, Layoutprobleme per CSS zu lösen. Drupal versieht die meisten Elemente (meist
<div>
s) mit aussagekräftigen IDs oder Klassennamen. Mit deren Hilfe kann man per CSS darauf zugreifen und das Layout nach seinen Wünschen ändern.Gruß
Frank
Danke für deine Antwort,
am 22.12.2008 - 13:44 Uhr
Danke für deine Antwort, mit CSS hab ich es versucht aber mir ist kein Befehl bekannt der das macht :(
Ich bin leider kein Profi aber soweit ich weiß "Layoute" ich ja die im php code erzeugten Elemente, wie du schon sagtest.
div id content-inner
div id content-area
div id node-X
div id node-inner
div id content
div´s für CCK Felder, Fivestar Modul, alle anderen Module
Und um jetzt zb den DIV für ein CCK Feld oder Modul ganz zu verschieden, da reicht CSS wohl nicht aus!
Denn ich wills ja aus dem div node-inner raus haben!
Das wäre vom Prinzip auch kein thema, nur weiß ich nicht an welcher Stelle man steuert, wo sich ein Modul oder CCK Feld in die page.tpl einträgt
Positionieren mit CSS
am 22.12.2008 - 15:42 Uhr
Im Prinzip kannst du mit CSS alles positionieren. Wie einfach oder kompliziert das ist, hängt vom konkreten Fall ab.
Infos zum Thema gibt's u.a. hier:
Und mit der Firefox-Erweiterung Firebug kannst du das CSS quasi live am lebenden Objekt analysieren und verändern: http://www.drupalcenter.de/handbuch/6716
Gruß
Frank
mh also mit der bitte um
am 22.12.2008 - 16:04 Uhr
mh also mit der bitte um verständnis daß ich mich nicht super mit css auskenne, aber ich kriege es nicht hin! ich kann natürlich elemente z.b. mit "position" "margin" "floats" etc. positionieren. Aber ich schaffe es nicht es vernünftig und sauber innerhalb des content-inners!
Und es kommt mir irgendwie so vor als müsste ich die festen PHP Bestandteile auch dort in der php template datei verschieben! zumindest funktioniert das sauber und einwandfrei! zumindest mit den elementen, die ich in der node.tpl datei finde!
Live-Beispiel?
am 22.12.2008 - 16:11 Uhr
Zugegeben, Positionierung mit CSS ist nicht ganz ohne...
Kann man sich deine Site live angucken?
Frank
Ich kann das ganze zwar mit
am 22.12.2008 - 16:36 Uhr
Ich kann das ganze zwar mit CSS Positionieren aber dann wird es..naja wie soll ich mich ausdrücken.. aus dem fluss gerissen!
Hier zb mit CSS Positionierung! Also position: relative und top: zb 50px
Schöner und richtig ist es meiner Meinung nach wenn ich die Reihenfolge im node.tpl ändere, was dann so aussieht:
<div class="node <?php print $node_classes ?>" id="node-<?php print $node->nid; ?>"><div class="node-inner">
<?php if ($page == 0): ?>
<h2 class="title">
<a href="<?php print $node_url; ?>"><?php print $title; ?></a>
</h2>
<?php endif; ?>
<?php if ($unpublished) : ?>
<div class="unpublished"><?php print t('Unpublished'); ?></div>
<?php endif; ?>
<?php if ($picture) print $picture; ?>
<?php if ($submitted): ?>
<div class="submitted">
<?php print $submitted; ?>
</div>
<?php endif; ?>
<div class="content">
<?php print $content; ?>
</div>
</div></div> <!-- /node-inner, /node -->
Diese beiden habe ich einfach unterhalb des Node-inner kopiert
<?php if (count($taxonomy)): ?>
<div class="taxonomy"><?php print t(' ') . $terms; ?></div>
<?php endif; ?>
<?php if ($links): ?>
<div class="links">
<?php print $links; ?>
</div>
<?php endif; ?>
Danke für die Beispiele...
am 22.12.2008 - 17:56 Uhr
Danke für die Beispiele! Was ist jetzt nochmal genau dein Problem? Du willst vom Modul (hier 5 Star) generierten Code woanders hinhaben, oder? (Langsam kapier ich's...)
Frank
PS:
Vielleicht hilft dir dieser Artikel weiter:
Overriding themable output
http://drupal.org/node/341628
oder der hier:
http://www.packtpub.com/article/theming-modules-in-drupal-6
ja genau, man siehts auf dem
am 22.12.2008 - 18:22 Uhr
ja genau, man siehts auf dem letzen bild noch!
div class content, darin befinden sich alle Elemente, die CCK Felder, die form id vom fivestar! Und diese will ich zb. direkt in den content-inner haben!
Habe aber leider immer noch
am 23.12.2008 - 00:35 Uhr
Habe aber leider immer noch keine Möglichkeit gefunden :(
Du musst da den Hook_nodeapi
am 23.12.2008 - 10:46 Uhr
Du musst da den Hook_nodeapi anwenden. Dir den Contentaufbau mit dem Devel-Modul ( Tab-Devel laden) anschauen, dann kannste die Reihenfolge mit ['#weight'] verändern.
Vielleicht hast auch Glück das dieses Widget via CCK steuerbar ist. Kleine Wegbeschreibung -> http://www.drupalcenter.de/node/15257#comment-53455
----------------------------------------
Alle Angaben ohne Gewähr!!:D
http://www.tobiasbaehr.de/
Nein, leider nicht! Die
am 23.12.2008 - 13:09 Uhr
Nein, leider nicht! Die Module bzw. Felder für CCK, die ich kenne und nutze kann man immer nur innerhalb des Nodes Positionieren! Aber ausserhalb nicht :(
Und leider ist das Devel Modul anders als bei Drupal 6. Dort kann man recht gut erkennen was auf der Seite passiert. Diese Quellansicht (ich nenne sie einfach mal so :) gibt es beim devel für drupal 5 nicht :(
Also weiter grübeln! Also Drupal ist da echt unflexibel. Selbst in joomla konnte man frei wählen wo ein Modul hin soll, schade daß das hier nicht geht :(
Achso...der Devel Laden Tab
am 23.12.2008 - 13:23 Uhr
Achso...der Devel Laden Tab brachte auch nicht zum Erfolg! Er gibt nicht wirklich viele Infos wie zb bei Drupal 6 her. Nur belangloses Zeugs, dessen Inhalt ich ja eh schon kenne wie z.b.
taxonomy
Array
(
[4] => stdClass Object
(
[tid] => 4
[vid] => 1
[name] => Italienisch
[description] =>
[weight] => 0
)
)
Aber vielleicht findet sich ja noch jemand der mich zum Ziel führt :) Die Hoffnung stirbt zuletzt^^
Taxonomy ist auch kein
am 23.12.2008 - 16:13 Uhr
Taxonomy ist auch kein Fivestar.
Hier wird die Position bestimmt:
<?php
/**
* Implementation of hook_nodeapi()
*
* Adds the fievestar widget to the node view.
*/
function fivestar_nodeapi(&$node, $op, $teaser, $page) {
switch ($op) {
case 'view':
if ($node->in_preview == FALSE && !isset($node->modr8_form_teaser) && variable_get('fivestar_'. $node->type, 0)) {
if ($teaser) {
$position = variable_get('fivestar_position_teaser_'. $node->type, 'above');
}
else {
$position = variable_get('fivestar_position_'. $node->type, 'above');
}
switch ($position) {
case 'above':
case 'below':
if (user_access('rate content')) {
$node->content['fivestar_widget'] = array(
'#value' => fivestar_widget_form($node),
'#weight' => $position == 'above' ? -10 : 50,
);
break;
} // Fall through to static if not allowed to rate.
$position .= '_static';
case 'above_static':
case 'below_static':
$stars = variable_get('fivestar_stars_'. $node->type, 5);
$node->content['fivestar_widget'] = array(
'#value' => fivestar_static('node', $node->nid, $node->type),
'#weight' => strpos($position, 'above') === 0 ? -10 : 50,
);
break;
default:
// We'll do nothing.
break;
}
}
break;
}
}
?>
Und um selbst zubestimmen, muss mit eigenen Modul dies überschreiben. ( $node->content['fivestar_widget']['#weight']=12456; )
----------------------------------------
Alle Angaben ohne Gewähr!!:D
http://www.tobiasbaehr.de/
Danke für die Antwort!
am 23.12.2008 - 18:36 Uhr
Danke für die Antwort! Woher kommt denn dieser Code? Ist der irgendwo im Fivestar Modul? Oder muss ich den komplett neu erstellen ?
Ja der kommt aus dem modul.
am 23.12.2008 - 21:48 Uhr
Ja der kommt aus dem modul. Und wenn du die Reihenfolge ändern willst, musst du ein eigenes minimodul erstellen. welches den hook_nodeapi verwende, um die Voteapi angaben überscheiben zu können.
----------------------------------------
Alle Angaben ohne Gewähr!!:D
http://www.tobiasbaehr.de/