Seite 1 von 2

Artikelliste mit "direkten" Zugriff

Verfasst: Do 17. Mär 2005, 14:34
von Eric A.
Hallo Zusammen,

ich verwender die Artikellsite w3concepts.alist.mod3. Ich habe die Sortierung geändert so, dass ich jetzt der Bakend-Titel (title) verwende. Alle klapt ganz gut.
Mein Ziel ist diese Artikelliste zu verwenden für eine Auflistung von Tiere, die Alphabetisch - durch den title - sortiert werden. Pro Artikel wird der Latein-Namen (headline) und eine Thumbild angezeigt.

So jetzt kommt das Problem bzw. die Frage: ich möchte zusätztlich oben am Beginn der Liste eine Zeile mit dem Alphabet und Anchor einsetzten.
So dass durch Auswahl einer Buchstabe, springt man direkt an die Artikeln, die mit diesen Buchstabe anfängen.

Ich hoffe, dass ich mich korrekt ausgedruckt habe.

Ich habe noch keinen solchen Modul gesehen. Aber ich glaube, dass so etwas machbar wäre?

Gruß
Eric

Verfasst: Fr 18. Mär 2005, 00:44
von Beleuchtfix
Such mal hier im Forum, das Problem wurde schon einmal angesprochen (so in Richtung Lexikon als Suchwort).

Viel Erfolg
Florian

Verfasst: Fr 18. Mär 2005, 11:03
von Eric A.
Hallo

Gesucht hatte ich schon.
Außer diesen Link http://www.contenido.org/forum/viewtopic.php?t=6366 habe ich nichts gefunden.

Tja werde noch einmal eine bisschen PHP lernen und vielleicht wäre ich es hinbekommen. Aber für jede Hilfe wäre ich dankbar.

Eingentlich wollte ich soetwas machen:
* Tabelle mit dem Alphabet und default Anchor (Name="A", "B", usw...)

In der Schleiffe der Ausgabe - die schon durch den Backend-Titel alphabetisch sortiert ist - wollte ich dann
* Test des ersten Buchstabe vom Backend-Titel und dann den entsprechenden Anchor zuweisen.

Es würde bedeuten, dass wenn ich zwei Artikel mit dem gleichen Buchstabe habe, werde ich zweimal den Anchor zuweisen.
Nicht gefunden Buchstabe werden kein Anchor zugewiesen.

Ist die Grundprinzip Ok, oder habe ich irgendwo einen Denkfehler?

Gruß
Eric

Verfasst: Fr 18. Mär 2005, 11:23
von Halchteranerin
Hallo Eric,
Eric A. hat geschrieben:Es würde bedeuten, dass wenn ich zwei Artikel mit dem gleichen Buchstabe habe, werde ich zweimal den Anchor zuweisen.
Nicht gefunden Buchstabe werden kein Anchor zugewiesen.
ich weiss nicht, ob das so gut ist. Ich hab's aber auch nie ausprobiert: wenn der Ankername an zwei Stellen vorhanden ist, wohin wird dann gesprungen? Immer zum ersten, oder nach dem Zufallsprinzip? :) Ich wuerd's erstmal an einer statischen HTML-Seite probieren.

Gruss
Christa

Verfasst: Fr 18. Mär 2005, 12:18
von Eric A.
Hallo Halchteranerin,

Anchor:
Ich habe es gerade unter IE 6, Mozilla 1.6, Firefox 1.0.1 und Netscape 4.78 und 7.1 getest. Also es scheint überall zu funktionieren:
- man springt auf dem ersten gesetzten Anchor in der Seite

Aber du hast Recht, dass es nicht sauber ist. Für den ersten Entwurf würde ich es also so machen und im zweiten würde ich die Redundanz entfernen.

Gruß
Eric

Verfasst: Fr 18. Mär 2005, 14:08
von Eric A.
So ich habe jetzt einen Pseudo-Algorithm geschrieben, der keine Redundanz enthälten sollte:

Code: Alles auswählen

//ganz vorne
lastfound =0;
Kette = "ABCD.....Z"

// in der Schleiffe
for i= lastfound to End
(
  if title = Kette[i] 
  (
     Anchor setzen
     lastfound=i+1;
     break
  )
)
So jetzt muss ich noch schauen, wie ich das in PHP umsetze.

Gruß
Eric

Verfasst: Di 22. Mär 2005, 13:46
von darthbach
Hallo.

Ich habe mal folgenden Code direkt aus Contenido herauskopiert.

Bitte die SQL-Anweisungen noch anpassen!!!!
Es gibt bei mir in den Artikeln ein eigenes Feld für das Glossar.

Code: Alles auswählen

<?php

echo "<!-- Modul: Glossarliste -->\n";

function klein($text) {
	$text = urldecode($text);

	$text = strip_tags($text, "");

//	$text = str_replace(" ", "_", $text);
	$text = str_replace(":", "_", $text);
	$text = str_replace("(", "_", $text);
	$text = str_replace(")", "_", $text);
	$text = str_replace("[", "_", $text);
	$text = str_replace("]", "_", $text);
	$text = str_replace("'", "_", $text);
	$text = str_replace('"', '_', $text);

	$text = strtolower($text);

	$text = str_replace("ä", "ae", $text);
	$text = str_replace("ö", "oe", $text);
	$text = str_replace("ü", "ue", $text);
	$text = str_replace("ß", "ss", $text);

	return $text;
}

function unterkategorien($kategorie) {
	global $cfg, $unterkat;
	$unterkat[] = $kategorie;

	$db = new DB_Contenido;
	$sql = "SELECT idcat FROM {$cfg['tab']['cat']} WHERE parentid = '".$kategorie."' ORDER BY idcat ASC;";
	$db->query($sql);

	while ($db->next_record()) {
		unterkategorien($db->f("idcat"));
	}
}

$db = new DB_Contenido;
$db2 = new DB_Contenido;

$breiterand = 5;
$breitekomplett = 200 - 2 * $breiterand;

$liste = array("0-9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "@");

foreach ($liste as $buchstabe) {
	$gesamt[$buchstabe] = "";
}

$unterkat = array();
unterkategorien(24);

// liest die anzahl betroffener artikel aus der datenbank
$sql = "SELECT count(*) AS anzahl FROM ".$cfg['tab']['cat']." AS a LEFT JOIN ".$cfg['tab']['cat_art']." AS b ON a.idcat = b.idcat LEFT JOIN ".$cfg['tab']['art_lang']." AS c ON b.idart = c.idart LEFT JOIN ".$cfg['tab']['content']." AS d ON c.idartlang = d.idartlang LEFT JOIN ".$cfg['tab']['cat_lang']." AS e ON a.idcat = e.idcat WHERE a.parentid IN (".implode(", ", $unterkat).") AND d.idtype = '2' AND d.typeid = '2' AND d.value != '';";
$db->query($sql);
$db->next_record();
$anzahl_artikel = $db->f("anzahl");

if ($anzahl_artikel > 0) {
	$sql = "SELECT d.value, b.idart, b.idcat, e.name FROM ".$cfg['tab']['cat']." AS a LEFT JOIN ".$cfg['tab']['cat_art']." AS b ON a.idcat = b.idcat LEFT JOIN ".$cfg['tab']['art_lang']." AS c ON b.idart = c.idart LEFT JOIN ".$cfg['tab']['content']." AS d ON c.idartlang = d.idartlang LEFT JOIN ".$cfg['tab']['cat_lang']." AS e ON a.idcat = e.idcat WHERE a.parentid IN (".implode(", ", $unterkat).") AND d.idtype = '2' AND d.typeid = '2' AND d.value != '';";
	$db->query($sql);

	while ($db->next_record()) {
		$suche = klein($db->f("value"));
		$suchindex = substr($suche, 0, 1);
		$titel = urldecode($db->f("value"));
		$artikel = $db->f("idart");
		$kategorie = $db->f("idcat");
		$abteilung = $db->f("name");

		$gefunden = false;

		foreach ($liste as $value) {
			$wert = ord($suchindex);
			if (($wert > 47) && ($wert < 57))
				$suchindex = "0-9";

			if ($value == $suchindex) {
				$gefunden = true;
				break;
			}
		}

		if ($gefunden) {
			$gesamt[$suchindex][] = array('suche' => $suche, 'titel' => $titel, 'kategorie' => $kategorie, 'artikel' => $artikel, 'abteilung' => $abteilung);
		} else {
			$gesamt['@'][] = array('suche' => $suche, 'titel' => $titel, 'kategorie' => $kategorie, 'artikel' => $artikel, 'abteilung' => $abteilung);
		}
	}

	echo '				<tr><td align="right" colspan="3" class="liste">';
	for ($i = 0; $i < 14; $i++) {
		$text = strtoupper($liste[$i]);

		if (is_array($gesamt[$liste[$i]])) {
			$text = '<a href="#'.$text.'" class="liste">'.$text.'</a>';
		}

		echo $text.'&nbsp;';
	}
	echo '</td></tr>
				<tr><td align="right" colspan="3" class="liste">';
	for ($i = 14; $i < 28; $i++) {
		$text = strtoupper($liste[$i]);

		if (is_array($gesamt[$liste[$i]])) {
			$text = '<a href="#'.$text.'" class="liste">'.$text.'</a>';
		}

		echo $text.'&nbsp;';
	}
	echo '</td></tr>
				<tr><td colspan="3" class="text">Dieses Glossar enth&auml;lt '.$anzahl_artikel.' Artikel.</td></tr>
';

	foreach ($liste as $buchstabe) {
		if (is_array($gesamt[$buchstabe])) {
			sort($gesamt[$buchstabe]);

			$text = strtoupper($buchstabe);

			echo '				<tr><td colspan="3" width="'.$textspalteplus.'"><img src="images/dotclear.gif" width="'.$textspalteplus.'" height="20" alt=""></td></tr>
				<tr>
					<td valign="top" width="'.$breiterand.'">&nbsp;</td>
					<td valign="top" width="'.$breitekomplett.'" valign="top"><a name="'.$text.'"></a>'.$text.'</td>
					<td valign="top" width="'.$breiterand.'">&nbsp;</td>
				</tr>
';

			foreach ($gesamt[$buchstabe] as $eintrag) {
				$link = $sess->url("front_content.php?idcat=".$eintrag['kategorie']."&idart=".$eintrag['artikel'].$sessionid);

				echo '				<tr>
					<td valign="top" width="'.$breiterand.'">&nbsp;</td>
					<td valign="top" width="'.$breitekomplett.'" valign="top"><a href="'.$link.'" class="liste_headlinelink">'.$eintrag['titel'].'</a> ('.$eintrag['abteilung'].')</td>
					<td valign="top" width="'.$breiterand.'">&nbsp;</td>
				</tr>
';
			}
		echo '				<tr>
					<td valign="top" width="'.$breiterand.'">&nbsp;</td>
					<td valign="top" width="'.$breitekomplett.'">&nbsp;</td>
					<td valign="top" width="'.$breiterand.'">&nbsp;</td>
				</tr>
';
		}
	}

} else {
	echo '				<tr>
					<td valign="top" width="'.$breiterand.'">&nbsp;</td>
					<td valign="top" align="center" width="'.$breitekomplett.'">Dieses Glossar enth&auml;lt leider noch keine Artikel.</td>
					<td valign="top" width="'.$breiterand.'">&nbsp;</td>
				</tr>
				<tr>
					<td valign="top" width="'.$breiterand.'">&nbsp;</td>
					<td valign="top" width="'.$breitekomplett.'">&nbsp;</td>
					<td valign="top" width="'.$breiterand.'">&nbsp;</td>
				</tr>
';
}

unset ($breiterand);
unset ($breitekomplett);

?>
Edit: Die SQL-Statements wurden korrigiert, da nur die direkten Kategorien unterhalb der Hauptkategorie berücksichtigt wurden. (2005-10-09)

Bei Fragen einfach melden.

Darthbach

Verfasst: Mi 23. Mär 2005, 10:36
von Gast
Kann man das irgendwo im Einsatz sehen?

Verfasst: Do 24. Mär 2005, 08:00
von darthbach
Hallo.

Leider kann ich nur einen Screenshot anbieten:
http://schmitz-ruhrort.dyndns.org/glossar.jpg (ca. 145 KB)

Edit: Noch ein zweiter Screenshot, der die Struktur zeigen soll: http://schmitz-ruhrort.dyndns.org/glossar2.jpg (ca. 186 KB)
Die Artikel befinden sich unter "News > ..."
Unter "Glossar" befindet sich nur das Glossar!!!!! (2005-10-09)


Darthbach

Verfasst: Do 24. Mär 2005, 21:57
von Gast
Was muss ich als parentid und idtype eintragen?

Verfasst: Do 24. Mär 2005, 23:31
von darthbach
Meine Site hat folgenden Aufbau:

Code: Alles auswählen

+- News
|  +-Abteilung 1
|  +-Abteilung 2
|  +-Abteilung 3
+- Glossar
Die Artikel werden in den einzelnen Abteilungen abgelegt. Die übergeordnete Kategorie News hat die idcat = 24.
idtype = 2 und typeid = 2 ergibt sich daraus, da in den Artikeln ein Feld CMS_HTML[2] eingebaut ist. _Wenn_ dieses Feld ausgefüllt wird (value != ''), erst dann taucht der Artikel in der Glossarliste aus.

Hier also die eigenen Kategorien eintragen.

Darthbach

Verfasst: Mi 6. Apr 2005, 09:51
von Gast
Kann es sein, dass das Modul unter v4.4.5 nicht funktioniert, ich kriege es jedenfalls nicht zum laufen!

Verfasst: Mi 6. Apr 2005, 21:52
von Gast
Anonymous hat geschrieben:Kann es sein, dass das Modul unter v4.4.5 nicht funktioniert, ich kriege es jedenfalls nicht zum laufen!
Ich kenne zwar die Unterschiede nicht so genau, da ich direkt mit der v4.5 begonnen habe.

Du könntest zum Testen alle paar Zeilen auch eine einfache Programmzeile, z.B.

Code: Alles auswählen

echo "1"; ...; echo "2"; ...; 
einfügen.
Dann siehst du ja, wo es Probleme gibt.

Verfasst: Fr 15. Apr 2005, 12:15
von Aixtraweb
Anonymous hat geschrieben:Kann es sein, dass das Modul unter v4.4.5 nicht funktioniert, ich kriege es jedenfalls nicht zum laufen!
Ich brauche nur den Code ins Output zu kopieren und Contenido meckert schon den Code an :-(
Ich nutze auch 4.4.5....

Das Modul ist genau das was ich suchte und brauche!

Wer hilft mir das für die 4.4.5 hinzubekommen?

Verfasst: Fr 15. Apr 2005, 13:22
von Gast
Interesse hätte ich auch, aber ich habe es leider nicht selber hinbekommen. Schön wäre auch, wenn man die Konfiguration nicht im Modul selbst, sondern über die Vorkunfiguration anpassen könnte.