next/prev-Code ändern
am 05.12.2010 - 21:07 Uhr in
Hallo,
in einer node.tpl.php habe ich eine netx/prev-Funktion eingebaut, die ich auch drupal.org gefunden habe: http://drupal.org/node/45050
Damit kann ich wunderbar von einem Node zum anderen vor und zurück blättern. Das passiert innerhalb eines Taxonomy-Terms. Sortiert wird nach Node-ID.
Die Funktion wird in der template.php eingebaut:
<?php
function next_prev($current_nid, $type, $button_type, $label, $class) {
$tid = db_result(db_query(db_rewrite_sql("SELECT tid FROM {term_node} WHERE nid = %d"), $current_nid));
if (empty($tid)){ //validate that the node 'does' have a tid
return;
}
switch ($button_type) {
case 'next':
$sort= 'ASC';
$case = '> ';
break;
case 'prev':
$sort = 'DESC';
$case = '< ';
break;
case 'parent':
$name = db_result(db_query(db_rewrite_sql("SELECT name FROM {term_data} WHERE tid = %d"), $tid));
return l($label.$name, "taxonomy/term/$tid", array('title' => $name, 'class' => $class));
case 'last':
$sql = "SELECT n.nid, n.title FROM node n INNER JOIN term_node tn ON n.nid = tn.nid";
$sql .= " INNER JOIN term_data td ON tn.tid = td.tid WHERE n.type = '%s'";
$sql .= " AND td.tid = %d AND n.status = 1 ORDER BY nid ASC LIMIT 1";
$result = db_fetch_array(db_query(db_rewrite_sql($sql), $type, $tid));
return l($label, 'node/'. $result['nid'], array('title' => $result['title'], 'class' => $class));
case 'first':
$sql = "SELECT n.nid, n.title FROM node n INNER JOIN term_node tn ON n.nid = tn.nid";
$sql .= " INNER JOIN term_data td ON tn.tid = td.tid WHERE n.type = '%s'";
$sql .= " AND td.tid = %s AND n.status = 1 ORDER BY nid DESC LIMIT 1";
$result = db_fetch_array(db_query(db_rewrite_sql($sql), $type, $tid));
return l($label, 'node/'. $result['nid'], array('title' => $result['title'], 'class' => $class));
default:
return;
}
$sql = "SELECT n.nid, n.title FROM {node} n
INNER JOIN {term_node} tn ON n.nid = tn.nid
INNER JOIN {term_data} td ON tn.tid = td.tid
WHERE n.type = '%s' AND
n.nid " . $case . "%d AND
td.tid = %d AND
n.status = 1
ORDER BY nid ". $sort . " LIMIT 1";
$result = db_fetch_array(db_query(db_rewrite_sql($sql), $type, $current_nid, $tid));
if (!$result) {
return;
} else {
return l($label, 'node/'. $result['nid'], array('attributes'=>array('class'=>$class, 'title'=>$result['title']), 'html'=>TRUE));
}
}
?>
Aufgerufen wird sie dann in der node.tpl.php:
<?php
if ($terms && arg(0) == 'node' && is_null(arg(2))) {
$next = next_prev($node->nid, 'project_cd', 'next', '', 'link_next');
$previous = next_prev($node->nid, 'project_cd', 'prev', '', 'link_prev');
if ($previous){ print $previous; }
print ('<a href="Link zur eigenen Übericht (View)"></a>');
if ($next){ print $next; }
}
?>
Für die Sortierung habe ich allerdings ein eigenes Feld in dem Inhaltstyp: sort_order
Und nach diesem Feld würde ich gern sortieren.
Ist es möglich, den bestehenden Code so anzupassen, dass man ein eigenes Feld für die Sortierung/Reihenfolge festlegen kann?
Und die Krönung wäre noch, wenn man innerhalb eines Inhaltstyps blättern könnte. Denn das Vokabular habe ich nur wegen der Blätterfunktion angelegt und brauche es sonst nicht.
Ich wäre Euch sehr dankbar, wenn Ihr Euch den Code mal ansehen könntet.
Vielen Dank schon mal fürs Lesen.
- Anmelden oder Registrieren um Kommentare zu schreiben
Zitat: Ist es möglich, den
am 05.12.2010 - 22:59 Uhr
Ist es möglich, den bestehenden Code so anzupassen, dass man ein eigenes Feld für die Sortierung/Reihenfolge festlegen kann?
Wo sollte das Feld denn stehen? Denn wenn es ein CCK-Feld im Inhaltstyp wäre, wird die Sortierung für jeden Node separat gespeichert. Das heißt, die Sortierung für die Links kann sich mit jedem Node ändern, außer, man speichert in allen Nodes die gleiche Sortierung, was bei vielen Nodes allerdings schwierig wird, wenn man es mal ändern will.
Ansonsten, blättern durch den Inhaltstyp dürfte funktionieren (habe den Code oben nur geändert, nicht selbst getestet!):
<?php
function next_prev($node, $button_type, $label, $class) {
$type = node_get_types('type', $node);
switch ($button_type) {
case 'next':
$sort= 'ASC';
$case = '> ';
break;
case 'prev':
$sort = 'DESC';
$case = '< ';
break;
/*
//entfällt, außer man macht sich eine View, die die Teaser aller Nodes dieses Inhaltstyps listet
case 'parent':
$name = db_result(db_query(db_rewrite_sql("SELECT name FROM {term_data} WHERE tid = %d"), $tid));
return l($label.$name, "taxonomy/term/$tid", array('title' => $name, 'class' => $class));
*/
case 'last':
$sql = "SELECT n.nid, n.title FROM {node} n WHERE n.type = '%s' ORDER BY nid ASC LIMIT 1;";
$result = db_fetch_array(db_query(db_rewrite_sql($sql), $type));
return l($label, 'node/'. $result['nid'], array('title' => $result['title'], 'class' => $class));
case 'first':
$sql = "SELECT n.nid, n.title FROM {node} n WHERE n.type = '%s' ORDER BY nid DESC LIMIT 1;";
$result = db_fetch_array(db_query(db_rewrite_sql($sql), $type));
return l($label, 'node/'. $result['nid'], array('title' => $result['title'], 'class' => $class));
default:
return;
}
$sql = "SELECT n.nid, n.title FROM {node} n
WHERE n.type = '%s' AND
n.nid " . $case . "%d AND
n.status = 1
ORDER BY nid ". $sort . " LIMIT 1";
$result = db_fetch_array(db_query(db_rewrite_sql($sql), $type, $current_nid, $tid));
if (!$result) {
return;
} else {
return l($label, 'node/'. $result['nid'], array('attributes'=>array('class'=>$class, 'title'=>$result['title']), 'html'=>TRUE));
}
}
?>
Aufruf in der node.tpl.php:
<?php
if (arg(0) == 'node' && is_null(arg(2))) {
$next = next_prev($node, 'next', '', 'link_next');
$previous = next_prev($node, 'prev', '', 'link_prev');
if ($previous){ print $previous; }
print ('<a href="Link zur eigenen Übericht (View)"></a>');
if ($next){ print $next; }
}
?>
Vielen Dank erst mal. Das
am 06.12.2010 - 10:40 Uhr
Vielen Dank erst mal.
Das Feld "sort_order" erscheint nicht in der Ausgabe. Es wird manuell mit Zahlen bestückt. Leider kenne ich keine andere Lösung, um die Sortierung bei bestehenden Nodes manuel vornehmen zu können. Da es sich nicht um sooo viele Nodes handelt, ist diese Lösung erst mal praktikabel.
Wie sollte sich denn Deine Änderung an dem Code auswirken? Ich teste es gleich mal.
Ich habe das jetzt getestet.
am 06.12.2010 - 11:07 Uhr
Ich habe das jetzt getestet. Leider werden die Links next/prev nicht angezeigt. Es erfolgt keinerlei Ausgabe im Quelltext.
Hoppla, mir ist gerade
am 06.12.2010 - 16:31 Uhr
Hoppla, mir ist gerade aufgefallen, dass ich die letzte SQL-Anweisung nicht geändert habe. Probier's mal damit:
<?php
function next_prev($node, $button_type, $label, $class) {
$type = node_get_types('type', $node);
switch ($button_type) {
case 'next':
$sort= 'ASC';
$case = '> ';
break;
case 'prev':
$sort = 'DESC';
$case = '< ';
break;
/*
//entfällt, außer man macht sich eine View, die die Teaser aller Nodes dieses Inhaltstyps listet
case 'parent':
$name = db_result(db_query(db_rewrite_sql("SELECT name FROM {term_data} WHERE tid = %d"), $tid));
return l($label.$name, "taxonomy/term/$tid", array('title' => $name, 'class' => $class));
*/
case 'last':
$sql = "SELECT n.nid, n.title FROM {node} n WHERE n.type = '%s' ORDER BY nid ASC LIMIT 1;";
$result = db_fetch_array(db_query(db_rewrite_sql($sql), $type));
return l($label, 'node/'. $result['nid'], array('title' => $result['title'], 'class' => $class));
case 'first':
$sql = "SELECT n.nid, n.title FROM {node} n WHERE n.type = '%s' ORDER BY nid DESC LIMIT 1;";
$result = db_fetch_array(db_query(db_rewrite_sql($sql), $type));
return l($label, 'node/'. $result['nid'], array('title' => $result['title'], 'class' => $class));
default:
return;
}
$sql = "SELECT n.nid, n.title FROM {node} n
WHERE n.type = '%s' AND
n.nid " . $case . "%d AND
n.status = 1
ORDER BY nid ". $sort . " LIMIT 1";
$result = db_fetch_array(db_query(db_rewrite_sql($sql), $type, $node->nid));
if (!$result) {
return;
} else {
return l($label, 'node/'. $result['nid'], array('attributes'=>array('class'=>$class, 'title'=>$result['title']), 'html'=>TRUE));
}
}
?>
Übrigens, beim Funktions-Aufruf übergibst du an den Parameter $label einen leeren String. Soll das so sein?
Leider werden die Links noch
am 06.12.2010 - 16:52 Uhr
Leider werden die Links noch immer nicht angezeigt. Der Quellcode zeigt wieder nichts dazu an.
So wie es jetzt aussieht, wird ja auch nach Node-ID sortiert. Kann man das auch nach meinem Feld "sort-order" machen? In dem Feld sind die Node von 1 bis x durchgehend nummeriert.
Vielen Dank nochmal für Deine Mühe.
Mmmh, ersetze mal die Zeile
am 06.12.2010 - 19:50 Uhr
Mmmh, ersetze mal die Zeile
<?php $type = node_get_types('type', $node); ?>
durch<?php $type = $node->type; ?>
und schau mal, ob's dann klappt.Du hast also ein CCK-Feld und in jedem Node ist dort eine andere Zahl eingetragen und danach soll das sortiert werden?
Das dürfte sich machen lassen, denke ich. Aber dazu müsste man wissen, wie die Tabelle heißt, in der die Zahlen gespeichert werden, wie die Spalte heißt und überhaupt welche Spalten die Tabelle hat.
Japp, so werden die Links
am 07.12.2010 - 10:48 Uhr
Japp, so werden die Links angezeigt. Geblättert wird jetzt innerhalb eines Inhaltstyps und sortiert wird jetzt nach Node-ID. Dass das Vokabular wegfallen kann, ist schon mal sehr gut.
Ich lese aus Deinen Zeilen, dass Deine Hilfsbereitschaft noch nicht ganz am Ende ist. Deswegen will ich Dir gleich mal die angefragten Daten schreiben.
Da es das Feld in 5 Inhaltstypen gibt, gibt es das auch in 5 Tabellen:
content_type_project_cd
content_type_project_gd
content_type_project_wd
content_type_project_fa
content_type_project_ro
Für das Script macht es sicher Sinn, das Feld nur 1 Mal anzulegen und in den anderen Inhaltstypen wiederzuverwenden. Verträgt sich das dann aber noch mit der Blätterfunktion innerhalb eines Inhaltstyps? Wenn ja, würde es keine Probleme bereiten, das Feld auf ein einzelnes zu reduzieren und in den anderen Inhaltstypen wiederzuverwenden - wenn es der Anpassung des Quellcodes nützt.
Die Spalten heißen (zur Zeit):
field_sort_order_cd_value
field_sort_order_gd_value
field_sort_order_wd_value
field_sort_order_fa_value
field_sort_order_ro_value
Weiterhin gibt es in der Tabelle:
vid, nid, field_teaser_title_cd_value
field_customer_cd_value
field_agency_cd_value
field_partner_cd_value
field_year_cd_value
field_sort_order_cd_value
field_no_overview_cd_value
field_text_cd_value
field_text_cd_format
Könntest Du damit etwas anfangen oder wird noch mehr benötigt.
Ich danke Dir ganz herzlich für Deinen Einsatz.
Nochmal der vorsichtige
am 07.12.2010 - 11:27 Uhr
Nochmal der vorsichtige Einwand, dass es verschiedene Module zu diesem Thema gibt:
http://drupal.org/project/cck_pager
http://drupal.org/project/custom_pagers
http://drupal.org/project/pagination
Hallo Luca, custom_pagers
am 07.12.2010 - 15:44 Uhr
Hallo Luca,
custom_pagers hatte ich mal probiert, ich bin allerdings nie dahintergekommen, wie ich den pager dann in meine node.tpl.php einbinde.
Die anderen Module kenne ich (noch) nicht.
Ich würde auch gern bei meiner bisherigen Lösung bleiben, da ich dazu das Theme schon fertig habe und es ja grundsätzlich gut funktioniert.
Vielen Dank an dieser Stelle für die Vorschläge - ansehen werde ich sie mir trotzdem.