Seite 1 von 1

Elternelement mittels idart/idcat herausfinden

Verfasst: Mi 30. Jan 2008, 10:28
von Dalamar
Guten Morgen,

weis jemand, ob es in Contenido eine Standard-Methode gibt, die es mir ermöglicht mittels einer Artikel-ID (idart) und einer Kategorie-Ebene (0..x) die idcat der entsprechenden Elternkategorie zu erhalten.

So alla:

Code: Alles auswählen

function getParentlyIdcat($idart, $level) {
    ...
    return $idcat;
}
Schonmal besten Dank im voraus.

Christian

Verfasst: Mi 30. Jan 2008, 11:01
von emergence
also auf den level bezogen -> nein

vielleicht nützlich
functions.con.php -> function conGetCategoryAssignments
functions.con.php -> function conFetchCategoryTree

beides müsste halt kombiniert werden...

Verfasst: Mi 30. Jan 2008, 11:20
von Dalamar
Schonmal Danke emergence... werde es ausprobieren. :)

Verfasst: Mi 30. Jan 2008, 14:52
von Dalamar
Keine Ahnung, ob ich mir die Mühe umsonst gemacht habe. Leider wusste ich nicht wie man mit Hilfe einer idcat oder einer idart das Elternelement einer bestimmten Ebene beziehen kann. Also habe ich mich selber mal rangesetzt. Hier der Code... vielleicht kann ihn ja jemand gebrauchen:

Code: Alles auswählen

<?

function getCategoryAssignmentByIdart($idart) {
	// Liefert array, obwohl Artikel nur noch einer Kategorie zugeordnet werden kann
	$idcat = conGetCategoryAssignments((int)$idart);
	return $idcat[0];
}

function getCategoryAssignmentByIdcat($idcat) {
	// foo
	return (int)$idcat;
}

/**
 * Get the Idcat of Parent Element dependent on level
 *
 * @param integer $current_idcat - Idcat of Child Element
 * @param integer $level - Level of Parent Element
 *
 * @return $idcat
 *
 */
function getParentIdcatByLevel($current_idcat, $level = 0)
{
	global $db, $cfg, $lang, $client;

	if($current_idcat > 0)
	{
		if ($db === false)
		{
			$db = new DB_Contenido;
		}

		$sql = "SELECT
					c.level AS level
				FROM
					".$cfg["tab"]["cat_lang"]." AS a,
					".$cfg["tab"]["cat"]." AS b,
					".$cfg["tab"]["cat_tree"]." AS c
				WHERE
					a.idlang    = '".$lang."' AND
					b.idclient  = '".$client."' AND
					b.idcat     = '".$current_idcat."' AND
					a.idcat     = b.idcat AND
					c.idcat     = b.idcat";

		$db->query($sql);
		$db->next_record();

		$current_idcat_level = $db->f("level");

		if($current_idcat_level > 0)
		{
			$catarray = array();
			$catarray = conFetchCategoryTree($client);

			for($i = $current_idcat_level - 1; $i >= $level; $i--)
			{
				foreach($catarray AS $key=>$value)
				{
					// Alle Bäume, die sich auf der selben oder einer tieferen Ebenen befinden, löschen
					if($value["level"] > $i) unset($catarray["$key"]);
					// i.O.
					else
					{
						$parent = $current_idcat;

						while($parent != 0)
						{
							$sql = "SELECT
										a.parentid
									FROM
										".$cfg["tab"]["cat"]." AS a,
										".$cfg["tab"]["cat_lang"]." AS b
									WHERE
										a.idclient  = '".$client."' AND
										b.idlang    = '".$lang."' AND
										a.idcat     = b.idcat AND
										a.idcat     = '".$parent."'";

							$db->query($sql);
							$db->next_record();

							$parent = $db->f("parentid");

							if($parent == $value["idcat"] && $value["level"] == $i)
							{
								$parent_idcat = $value["idcat"];
								$parent       = $value["idcat"];
							}
						}
					}
				}
			}
			return $parent_idcat;
		}
	}
	return false;
}

// idart
if($idart) {
	$output = getParentIdcatByLevel(getCategoryAssignmentByIdart($idart), 1);
}
// idcat
else {
	$output = getParentIdcatByLevel(getCategoryAssignmentByIdcat($idcat), 1);
}

// echo $output;

?>

Verfasst: Sa 2. Feb 2008, 17:05
von kloevekorn
Hallo Dalamar,

vielen Dank! Ich glaube, genau diese Funktion könnte ich für mein Ziel gebrauchen, die vpSitemap aufzubohren. Ich möchte alle Kategorien fest auf n Level anzeigen (konkret: n=2), aber die aktuelle Kategorie auf 3-4 Level.
(->http://www.contenido.de/forum/viewtopic.php?t=19214.) Hierfür muss ich innerhalb der vpSitemap nur beim Parent der aktuellen Kategorie mehr Level ausgeben (wenn es ein besseres Modul für den Umbau gibt - nehme gerne einen Tipp an)

Meine Frage (ich kann den Code nicht richtig nachvollziehen): dein Code zeigt immer die oberste ParentID des Level1 an, nicht den direkten Parent, den ich für meinen Wunsch bräuchte. Ich hoffe, man muss nur einen Parameter verändern ... hast du, hat jemand einen Tipp?

Wenn ich den hätte, könnte ich die vpSitemap vielleicht erweitern. Auch wenn ich noch nicht weiß wie :roll:

vielen Dank und Gruß,
jan

Verfasst: Sa 2. Feb 2008, 20:32
von Dalamar
- Navigation (Ebene 0)
-- Menuepunkt 1 (Ebene 1)
---- Menuepunkt 1.1 (Ebene 2)
---- Menuepunkt 1.2 (Ebene 2)
---- Menuepunkt 1.3 (Ebene 2)
-------- Menuepunkt 1.3.1 (Ebene 3)
-------- Menuepunkt 1.3.2 (Ebene 3) <--- idcat 100
-------- Menuepunkt 1.3.3 (Ebene 3)
---- Menuepunkt 1.4 (Ebene 2)
-- Menuepunkt 2 (Ebene 1)


Naja, wenn Du z.B. von Menuepunkt 1.3.2 das Elternelement der zweiten Ebene haben möchtest dann rufst Du einfach die Funktion getParentIdcatByLevel mit folgenden Parametern auf und erhälst die idcat des Menuepunktes 1.3.

Code: Alles auswählen

$idcatderzweitenebene = getParentIdcatByLevel(100, 2);
LG,
Christian

Verfasst: Mo 4. Feb 2008, 13:27
von kloevekorn
Super, dann werde ich mal weiter experimentieren .... danke.