Seite 1 von 1

2 simple outputcodes gesucht: oberste u. aktuelle kat

Verfasst: Mi 23. Nov 2005, 18:19
von mvf
hallo community

ich krieg zwei, für die cracks wahrscheinlich sehr simple outputcodes nichtgebacken :(

zum einen möchte ich von einem kategoriebaum in dem ich mich befinde nur die aller oberste ebene ausgeben, zum anderen nur die aktuelle ebene, und dieser output dann jeweils verlinkt. zur erklärung:

kategoriebaum:

Code: Alles auswählen

 kat 1
     kat 1.1
     kat 1.2
         kat 1.2.1
	         [artikel A]
     kat 1.3
     kat 1.4
I.) output soll immer kat 1 verlinked auf kat 1 liefern
II.) output soll immer die aktuelle kat liefern also wenn ich den artikel A anschaue möchte ich gerne kat 1.2.1 verlinked auf kat 1.2.1 haben.

für die erste variante habe ich einen sehr umständlichen workaround gefunden, indem ich das standardmodul Navigationspfad auf die oberste ebene begrenzt habe. das geht mit sicherheit wesentlich kürzer und eleganter.

aber ich lerne ja noch und je mehr code ich so lese und damit rumspiele umsomehr kommt auch das verständnis, allerdings binich wie man der frage entnimmt eben doch noch ein 'greenhorn' :(

Verfasst: Mi 23. Nov 2005, 19:14
von mvf
das liefert mir ja schon mal den namen aber eben nur den letzten in der tabelle da es ja alphabetisch sortiert wird nach name.

aber wie bekomme ich es hin das er einmal die erste nimmt im baum und einmal nur die aktuelle ???

Code: Alles auswählen

<?php
$sql = "SELECT CATLANG.idcat, CATLANG.idcatlang, CATLANG.name
 FROM ".$cfg["tab"]["cat"]." AS CAT, ".$cfg["tab"]["cat_lang"]." AS CATLANG
 WHERE CATLANG.idcatlang = CAT.idcat AND CATLANG.idlang = '$lang'
  AND CATLANG.visible = '1' AND CAT.idclient='$client' 
 ORDER BY CATLANG.name ASC,CATLANG.created DESC";
$db->query($sql);

while ($db->next_record()) {
  $name = $db->f("name");
}
echo '&nbsp;>>>&nbsp;'.$name.'&nbsp;<<<&nbsp;';

?>
:oops:

Verfasst: Mi 23. Nov 2005, 19:26
von stese
den aktuellen kategorienamen findest du so heraus:

Code: Alles auswählen

$db = new DB_Contenido;
$sql = "SELECT name FROM " . $cfg["tab"]["cat_lang"] . " WHERE idcat = " . $idcat . " AND idlang = " . $lang;
$db->query($sql);
$db->next_record();
print $db->f("name");
die nächsthöhere kategorie findest du mit einer contenido internen funktion raus:

Code: Alles auswählen

$upper_idcat = strNextBackwards($idcat);
in einer schleife kannst du nun so lange die funktion aufrufen bis $upper_idcat = 0 ist (denn dann bist du beim hauptbaum)

den namen dieser kategorie findest du mit dem code oben raus - einfach die variable $idcat durch die $upper_idcat ersetzen.

um das ganze bequem und schön zu basteln, schaust du dir am besten mal bei de.php.net an, wie eine while schleife funktioniert und wie man mit php funktionen umgeht und diese selbst schreibt und seinen bedürfnissen anpasst.

Verfasst: Mi 23. Nov 2005, 19:39
von mvf
das bringt mich sicher ans ziel

stese, merci vielmal !!!

Verfasst: Mi 23. Nov 2005, 23:56
von mvf
mvf hat geschrieben:das bringt mich sicher ans ziel
... dachte ich

Code: Alles auswählen

<?php

$db = new DB_Contenido;
$sql = "SELECT CATLANG.name, CATTREE.level FROM ".$cfg["tab"]["cat_lang"]." AS CATLANG, ".$cfg["tab"]["cat_tree"]." AS CATTREE WHERE CATTREE.idcat = CATLANG.idcat AND CATLANG.idcat =  ".$idcat." AND CATLANG.idlang = ".$lang;

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

print "level: ".$db->f("level")." name: ".$db->f("name");


?>
liefert mir das level nun möchte ich wie stese beschrieben hat bis das level =0 ist rückwärts und hftte dann auf eine ausgabe mit level '0' und name 'oberste ebene' aber keine chance :(

Code: Alles auswählen

<?php

$db = new DB_Contenido;
$sql = "SELECT CATLANG.name, CATTREE.level FROM ".$cfg["tab"]["cat_lang"]." AS CATLANG, ".$cfg["tab"]["cat_tree"]." AS CATTREE WHERE CATTREE.idcat = CATLANG.idcat AND CATLANG.idcat =  ".$idcat." AND CATLANG.idlang = ".$lang;

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

while ($db->f("level") != 0) {
          
          $upper_idcat = strNextBackwards($idcat);
          $idcat = $upper_idcat;
          $db->next_record();

}
print "level: ".$db->f("level")." name: ".$db->f("name");


?>
und das ist nicht das einzige was ich probiert habe :(

Verfasst: Do 24. Nov 2005, 00:15
von stese
so wird nen schuh draus:

Code: Alles auswählen

<?php

// aktueller kateoriename:
print getCatnamesById ( $idcat, $lang );

// oberste kategorie ausgeben
$cat = $idcat;
while ( $cat > 0 ) {
  $temp_cat = strNextBackwards($cat);
  if ($temp_cat == 0) break;
  $cat = $temp_cat;
}
print getCatnamesById ( $cat, $lang );


function getCatnamesById ( $idcat = 0, $idlang = 0 ) {
   global $cfg;

   $sql = "SELECT name FROM " . $cfg["tab"]["cat_lang"] . " WHERE idcat = " . $idcat . " AND idlang = " . $idlang; 

   $db = new DB_Contenido();
   $db->query($sql);
   $db->next_record();

   return urldecode($db->f("name"));
}

?>
basis ist die neue function getCatnamesById die den kategorienamen anhand einer übergebenen idcat ausgibt.

Verfasst: Do 24. Nov 2005, 00:35
von mvf
merci again ;) das werden wohl mehr als nur ein zwei bierchen :lol:

aber leider funzt des ned :( es liefert mir die nächst höhere ebene, dort aber nicht die eigentliche kat sonder die nächste auf selber ebene

beispiel

Code: Alles auswählen

kat 0
	kat 1
		Artikel 1        //mit dem code liefert als return  'Artikel 1 kat 2'
	kat 2		


sollte aber 'Artikel 1 Kat 0' liefern :?

Verfasst: Do 24. Nov 2005, 00:39
von mvf
muss mich revidieren, es springt schon nach oben, aber nicht in die oberste ebene also im beispielmandanten möchte ich wirklich bis auf HAUPTNAVIGATION zurückspringen also die aller erste ebene im kategoriebaum, sprich der baum selber sozusagen

Verfasst: Do 24. Nov 2005, 00:43
von mvf
nochmal zur verdeutlichnug

code liefert 'Artikel kat 3' und ich brauche 'Artikel kat 0'

Code: Alles auswählen

kat 0  // oberste ebene
	kat 1	
	kat 2
		kat 2.1 
			kat 2.1.1
              Artikel        //mit dem code liefert als return  'Artikel kat 3' 
	kat 3
	kat 4

Verfasst: Do 24. Nov 2005, 00:48
von mvf
momentan löse ich das sehr umständlich :( über die von mir stümperhaft gekappten breadcrumbs

@stese nicht lachen bitte :oops:

Code: Alles auswählen

<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname  :      Navigationpath
* Author(s)   :     Andreas Lindner
* Copyright   :     Contenido - four for business, Andreas Lindner
* Created     :     05-08-2005
************************************************/

#Settings
$separator = '::';
$max_length = 65;

#Get path to root
$dummy = conCreateLocationString2($idcat,' '.$separator.' ', $retval2, true, "navipath", 0);

if ($retval2=='') {
	$retval2='&nbsp;';	
} else {
	$pattern = "'>.*?<'";
	
	preg_match_all($pattern, $retval2, $matches);
	$matches = $matches[0];
	
	#Get effective text length
	$length = 0;
	foreach ($matches as $value) {
		$length += strlen($value) - 2;
	}
	
	#Get shorten factor
	if ($length > $max_length * 4) {
		$shorten = 5;
	}
	elseif ($length > $max_length * 3) {
		$shorten = 4;
	}
	elseif ($length > $max_length * 2) {
		$shorten = 3;
	}
	elseif ($length > $max_length) {
		$shorten = 2;
	} else {
		$shorten = 1;
	}
	
	#Shorten items
	if ($length > $max_length) {
		foreach ($matches as $value) {
			if (strpos($value, $separator) === FALSE) {
				$text = substr($value, 1, strlen($value) - 2);
				$len = strlen($text);
				if (strpos($text, ' ') === FALSE) {
					$text_new = $text;
				} else {
					$text_new = capiStrTrimAfterWord($text, intval($len / $shorten));
				}
	
				if (strlen($text) != strlen($text_new)) {
					$text_new .= '...';
				}
	
				$text_new = '>'.$text_new.'<';
				$retval2 = str_replace('>'.$text.'<', $text_new, $retval2);
			}
		}
	}
	$retval2 = str_replace('"/index.html"', '"Home/index.html"', $retval2);
}

$retval2 = explode("::",$retval2);
$retval2 = trim($retval2[0]);
    
echo $retval2;
?>

Verfasst: Do 24. Nov 2005, 00:55
von mvf
ist das etwa schon der elegante kurze weg?

oder kann man $dummy einfacher auf die ausgabe des ersten wertes kürzen? denn dann kann man über den letzten parameter 0 auch entscheiden welche ebene relativ zum kategorie-root man ausgeben möchte.

Code: Alles auswählen

#Get path to root
$dummy = conCreateLocationString2($idcat,' '.$separator.' ', $retval2, true, "navipath", 0);