Blockinhalt zufällig wechseln
![](http://www.drupalcenter.de/files/noavatar_mini.gif)
am 06.11.2008 - 15:15 Uhr in
Hallo,
habe mir einen eigenen Blocktyp namens "Schaufenster" gemacht und hab gleichzeitig einen neuen Inhaltstyp "Schaufenster" erstellt.
Ziel ist es, dass ich neue Inhalte für diesen Block erstellen kann und der eine Block diese Inhalte per Zufall wechselt (z.b. einmal am Tag)!
Ich habe hier im Forum diesen Code gefunden und leicht abgeändert, um alle Inhalte anzuzeigen:
//veröffentlichte showcases auswählen
$sql = "SELECT * FROM {node} WHERE type = 'showcase' AND status = 1";
// db_query() macht die Abfrage, db_rewrite_sql() ist wichtig damit access rules beachtet werden.
$result = db_query(db_rewrite_sql($sql));
// Mit while() alle gefundenen Elemente der Abfrage abarbeiten.
// db_fetch_object() gibt die Resultate als Objekte aus (also mit "->" ansprechen)
while ($data = db_fetch_object($result)) {
$node = node_load($data->nid);
print $node->body;
}
?>
Meine eigentliche Frage: kann ich die einzelnen Inhalte in ein array laden bzw. gibt es vielleicht schon ein array, das man verwenden könnte?
Das mit dem Zufall werd ich dann allein lösen können!
- Anmelden oder Registrieren um Kommentare zu schreiben
zufälliger Inhalt
am 06.11.2008 - 15:24 Uhr
Moin!
Mal ein etwas anderer Ansatz: frage nur die Node-Ids des entsprechenden Inhaltstyps ab und suche Dir daraus einen zufälligen Wert heraus. Dann kannst Du anhand dieser Id die entsprechende node laden. Das ist auf jeden Fall performanter.
<?php
$result = db_query("SELECT nid FROM {node} WHERE type='%s' AND status = %d", array('showcase', 1));
$nids = array();
while ($object = db_fetch_object($result)) {
$nids[] = $object->nid;
}
// Node laden
$node = node_load(array('nid' => array_rand($nids)));
print $node->body;
?>
hth,
Stefan
evtl. "Views Rotator"
am 06.11.2008 - 15:27 Uhr
Das hier schonmal angesehen? ist zwar nicht zufällig, könnte aber evtl. deine Wünsche befriedigen.
http://drupal.org/project/views_rotator
Hier noch was ergänzendes dazu: http://mustardseedmedia.com/podcast/episode12
Roger
Ok, schon mal vielen Dank
am 06.11.2008 - 15:30 Uhr
Ok, schon mal vielen Dank für die schnellen Antworten.
Ich werde das mal testen und meine Ergebnisse posten!
Soweit so gut, es
am 06.11.2008 - 15:37 Uhr
Soweit so gut, es funktioniert.
So krieg ich aber allerdings alle Inhalte der Website. Hab gerade im Block das Impressum angezeigt bekommen, aber ich will ja nur Inhalte vom Inhaltstyp "showcase"
mal noch ne andere
am 06.11.2008 - 18:48 Uhr
mal noch ne andere frage:
ich kann ja mit
SELECT nid,title FROM {node} WHERE type = 'showcase' AND status = 1
auf den titel und die id des nodes zugreifen. aber wie komm ich an den body ran? geht das direkt über ein select? Weil Select body FROM {node}... geht nicht!
Zufällige Nodes laden
am 06.11.2008 - 20:01 Uhr
Hallo hijacker,
Hier ein Codeschnipsel aus dem Buch Learning Drupal 6 Module Development von Matt Butcher (http://www.packtpub.com/drupal-6-module-development/book). Das ganze Kapitel 4 beschreibt ein Modul, dessen Funktion deinen Wünschen wohl ziemlich nahe kommt. Damit werden Nodes mit der entsprechenden SQL-Funktion zufällig aus der Datenbank abgerufen.
<?php
function _philquotes_get_quote() {
$sql = "SELECT nid FROM {node} ".
"WHERE status=1 AND type='quotes' ORDER BY RAND() LIMIT 1";
$res = db_query($sql);
$item = db_fetch_object($res);
$quote = node_load($item->nid);
return $quote;
}
?>
Hoffe, das hilft
Frank
node_load
am 06.11.2008 - 23:10 Uhr
...aber wie komm ich an den body ran?
Hast Du mal mein Codeschnipsel ausprobiert? Die Funktion node_load() lädt Dir zu einer Node-Id (oder diversen anderen Parametern) ein komplettes Node-Objekt. Inklusive Body, Teaser und was sonst von anderen Modulen noch hinzugefügt wird.
hth,
Stefan
stBorchert
am 07.11.2008 - 00:46 Uhr
...aber wie komm ich an den body ran?
Hast Du mal mein Codeschnipsel ausprobiert? Die Funktion node_load() lädt Dir zu einer Node-Id (oder diversen anderen Parametern) ein komplettes Node-Objekt. Inklusive Body, Teaser und was sonst von anderen Modulen noch hinzugefügt wird.
hth,
Stefan
ja, hab das ausprobiert. allerdings wurde dann das impressum (also eine zufällige node id von allen inhaltstypen angezeigt)
ich wollte aber, dass es einen zufälligen "showcase" inhalt anzeigt.
Views ?
am 07.11.2008 - 10:23 Uhr
Hallo,
falls du auf deiner Seite schon Views 2 einsetzt, damit geht es auch: einfach einen Block View mit genau einem Node anlegen, und als Sortierkriterium "Random".
Gruß,
Boris
habs jetzt ganz einfach so
am 07.11.2008 - 12:31 Uhr
habs jetzt ganz einfach so gemacht:
<?php
$sql = "SELECT * FROM {node} WHERE type = 'showcase' AND status = 1 ORDER BY RAND() LIMIT 1";
$result = db_query(db_rewrite_sql($sql));
while ($data = db_fetch_object($result)) {
$node = node_load($data->nid);
print '<h3>'.$node->title.'</h3>'.'<br>';
print $node->body;
}
?>
jetzt bastel ich mir nur noch ein zufallsalgorithmus, der den block nur noch einmal am tag wechselt und nicht nach jedem laden!
Dann mal vielen Dank für eure guten Antworten!
performance
am 08.11.2008 - 18:52 Uhr
Moin!
Aus Performancegründen würde ich dann jedoch "SELECT nid FROM {node}..." verwenden, da so nur eine Spalte von mysql geladen werden muss. Das ist wesentlich schneller als "SELECT *".
Stefan