Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Themes & Theming ›

next/prev-Code ändern

Eingetragen von deelite (468)
am 05.12.2010 - 21:07 Uhr in
  • Themes & Theming
  • Drupal 6.x

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.

‹ Mousehandler und dyn. Positionierung von div's im Mozilla Suchenbutton "normale" Schrift soll weg ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Zitat: Ist es möglich, den

Eingetragen von Exterior (2903)
am 05.12.2010 - 22:59 Uhr
Zitat:

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; }
         }
?>

  • Anmelden oder Registrieren um Kommentare zu schreiben

Vielen Dank erst mal. Das

Eingetragen von deelite (468)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ich habe das jetzt getestet.

Eingetragen von deelite (468)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hoppla, mir ist gerade

Eingetragen von Exterior (2903)
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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Leider werden die Links noch

Eingetragen von deelite (468)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Mmmh, ersetze mal die Zeile

Eingetragen von Exterior (2903)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Japp, so werden die Links

Eingetragen von deelite (468)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Nochmal der vorsichtige

Eingetragen von netzkoop (1820)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Luca, custom_pagers

Eingetragen von deelite (468)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
  • Update Manger läst sich nicht Installieren
Weiter

Neue Kommentare

  • melde mich mal wieder, da ich
    vor 1 Woche 3 Tagen
  • Hey danke
    vor 1 Woche 4 Tagen
  • Update: jetzt gibt's ein
    vor 1 Woche 5 Tagen
  • Hallo, im Prinzip habe ich
    vor 2 Wochen 2 Tagen
  • Da scheint die Terminologie
    vor 2 Wochen 2 Tagen
  • Kannst doch auch alles direkt
    vor 2 Wochen 6 Tagen
  • In der entsprechenden View
    vor 2 Wochen 6 Tagen
  • Dazu müsstest Du vermutlich
    vor 2 Wochen 6 Tagen
  • gelöst
    vor 5 Wochen 3 Tagen
  • Ja natürlich. Dass ist etwas,
    vor 5 Wochen 4 Tagen

Statistik

Beiträge im Forum: 250233
Registrierte User: 20450

Neue User:

  • Mroppoofpaync
  • 4aficiona2
  • AppBuilder

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 1 Benutzer und 18 Gäste online.

Benutzer online

  • dinmikkith

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association