breadcrumb mit artikelausgabe - gelöst.

Gesperrt
kloevekorn
Beiträge: 199
Registriert: Mo 31. Okt 2005, 15:26
Wohnort: Hamburg
Kontaktdaten:

breadcrumb mit artikelausgabe - gelöst.

Beitrag von kloevekorn »

Liebe Leute,

mal wieder 'ne Breadcrumb-Frage, ich hoffe, ich drücke mich verständlich aus:

In der Regel geben die vorhandenen Location String-Module die Kategorien aus. Eins (von Martin Horwath / Matze http://contenido.org/forum/viewtopic.php?t=3048) habe ich gefunden, dass auch die Artikelnamen mit ausgibt. Funktioniert nach einer kleinen Korrektur ("$new_idart=$idart+1" <- das +1 ist von mir) auch fast zufriedenstellend in meiner 4.6.4.

Der Artikelname soll bei mir aber nur ausgegeben werden, wenn es in der Kategorie mehrere Artikel gibt, die auch alle einzeln aufgerufen werden können. Z.B. aus einer Artikelliste. Gibt es nur einen Artikel in der Kategorie (der dann auch gleichzeitig Startartikel ist), soll der Artikelname nicht ausgeben werden. Denn dann ist der Kategorienname Überschrift genug.

Ich versuche jetzt im genannten Horwath-Modul (Code s.u.), im unteren Teil entsprechend nach Startartikel zu selektieren, also in Konzept-Code:

if ($db->f("is_start") != 1) {dann gib den Artikelnamen aus}

Aber das klappt nicht!!! :-(

In der in der Abfrage verwendeten Tabelle "cat_art", gibt es das Feld "is_start", aber der Wert ist für _jeden_einzelnen_Artikel_ der Site auf "0" - wie kann das sein, denn die Startartikel sind im Backend ja entsprechend definiert?

In einer früheren Installation 4.4.5 haben die Startartikel die "1". Ist das Feld "is_start" in der 4.6 ein Relikt und Startartikel werden woanders definiert?

Kann wer helfen :roll: ?

Dank+gruß

Code: Alles auswählen

<?php 

/*********************************************** 
* 
* MODUL: Location-String (ohne Startikel) 
* 
* Author    :     Martin Horwath 
* Created   :     10.09.2003 
* Modified  :     05.02.2005 (by matze) 
* 
************************************************/ 


$nav_tp = $idcat; 

// AUSGABE Location-String (nur Kategorien) 
while($nav_tp > 0) { 
  $sql = "SELECT 
              parentid, A.idcat, A.level, name 
          FROM 
              ".$cfg["tab"]["cat_tree"]." AS A, 
              ".$cfg["tab"]["cat"]." AS B, 
              ".$cfg["tab"]["cat_lang"]." AS C 
          WHERE 
              A.idcat=B.idcat AND 
              B.idcat=C.idcat AND 
              C.idlang='$lang' AND 
              B.idclient='$client' AND 
              B.idcat ='$nav_tp'"; 

  $db->query($sql); 
  $db->next_record(); 
  $nav_tree[$db->f("level")][idcat] = $nav_tp; 
  $nav_tree[$db->f("level")][parent] = $db->f("parentid"); 
  $nav_tree[$db->f("level")][name] = $db->f("name"); 
  $nav_tree[$db->f("level")][link] = $sess->url("front_content.php?idcat=".$db->f("idcat")."&client=".$client."&lang=".$lang.""); 
  $nav_tp = $db->f("parentid"); 
} 

for($i=0;$i<count($nav_tree);$i++) { 
  echo "<a class=\"breadcrump\" href=\"".$nav_tree[$i][link]."\">".$nav_tree[$i][name]."</a>"; 
  if($nav_tree[$i][idcat] != $idcat) { 
    echo " > "; // seperator 
  } 
} 



// AUSGABE vom aktuellen Artikeltitel 
$i=$i; 
$new_idart=$idart+1; 

$sql = "SELECT 
             idart, is_start
        FROM 
              ".$cfg["tab"]["cat_art"]." 
        WHERE 
              idart='$new_idart' AND is_start='1'"; 

$db->query($sql); 



if($db->next_record()) { 

  $sql = "SELECT 
             idartlang, title 
          FROM 
              ".$cfg["tab"]["art_lang"]." 
          WHERE 
              idartlang='$new_idart'"; 

  $db->query($sql); 
  $db->next_record(); 
  
  $art_titel=$db->f("title"); 


echo "> <a class=\"breadcrump\" href=\"".$nav_tree[$i][link]."&idcat=$idcat&idart=$new_idart\">".$art_titel."</a>"; 

} 
?> 
Zuletzt geändert von kloevekorn am So 29. Jan 2006, 20:21, insgesamt 1-mal geändert.
stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese »

im 4.6er wird diese spalte nicht mehr genommen - die ist nur noch wegen kompatibilitätszwecken drinnen.

dafür ist in der cat_lang nun eine spalte namens startidartlang die die idartlang des startartikels enthält. das müsstest du also dahingehend umbauen
kloevekorn
Beiträge: 199
Registriert: Mo 31. Okt 2005, 15:26
Wohnort: Hamburg
Kontaktdaten:

Beitrag von kloevekorn »

stese hat geschrieben:im 4.6er wird diese spalte nicht mehr genommen - die ist nur noch wegen kompatibilitätszwecken drinnen.

dafür ist in der cat_lang nun eine spalte namens startidartlang die die idartlang des startartikels enthält. das müsstest du also dahingehend umbauen
Danke! Die SQL-Abfrage schaffe ich leider trotzdem nicht. Zum einen, weil ich die DB-Struktur nicht 100% erkennen kann und zum anderen, weil mein SQL einfach nicht ausreicht.

Ich identifiziere die Tabellen/Felder cat_art.idart,art_lang.idartlang,cat_lang.startidartlang als irgendwie an der Problemstellung beteiligt. Die idart ist außerdem in der Tabelle art_lang drin.

Im ersten SQL-Block der Artikelabfrage im Modul werden alle Artikel ausgegeben - richtig?
Im zweiten Block dann die Bedingung erfüllt, dass es sich um den aktuellen Artikel handelt - auch richtig?

Die untenstehende Abfrage habe ich in verschiedensten Kombinationen versucht, positiv ausgedrückt: sie macht wenigstens nichts kaputt.

Kann mir jemand einen Tipp geben?

Code: Alles auswählen

$i=$i; 
$new_idart=$idart+1; 


$sql = "SELECT 
             cat_art.idart, cat_art.is_start,art_lang.idartlang,cat_lang.startidartlang
        FROM 
              ".$cfg["tab"]["cat_art"]." ,
              ".$cfg["tab"]["art_lang"].",
              ".$cfg["tab"]["cat_lang"]."  
        WHERE 
              idart='$new_idart' AND is_start='0'"; 

$db->query($sql); 


if($db->next_record()) { 

  $sql = "SELECT 
             art_lang.idartlang, 
             art_lang.idart,
             art_lang.title, 
             cat_lang.startidartlang
          FROM 
              ".$cfg["tab"]["art_lang"]."AS a,
              ".$cfg["tab"]["idart"]."AS b,
              ".$cfg["tab"]["startidartlang"]." AS c
          WHERE 
              idartlang='$new_idart' AND art_lang.idartlang != cat_lang.startidartlang   "; 

  $db->query($sql); 
  $db->next_record(); 
  
  $art_titel=$db->f("title"); 
(Das "is_start" wohl raus, aber weil es nichts kaputt macht, ... hab ich es dringelassen - never change a running query ;-))


Zusatzfrage:
Ich bitte um eine Erklärung des folgenden Konstrukts:

Code: Alles auswählen

" FROM .$cfg["tab"]["art_lang"]." AS a,
was macht $cfg, das erste "[]" - muss in der ersten Klammer immer "tab" stehen??[/code]

1000xDanke!
kloevekorn
Beiträge: 199
Registriert: Mo 31. Okt 2005, 15:26
Wohnort: Hamburg
Kontaktdaten:

Beitrag von kloevekorn »

Den folgenden Schnipsel habe ich aus einem SQL-Buch,Thema Unterabfrage:

Code: Alles auswählen

SELECT *
FROM Tabelle1
WHERE Tabelle1.Eine_Spalte =
   (SELECT Eine_Andere_Spalte
    FROM Tabelle2
    WHERE Eine_Andere_Spalte = Ein_Wert)
sowas in etwas brauche ich doch auch, dazu eine Klausel wie "ANY", weil ich ja wissen will, ob die aktuelle idart (oder idartlang ?) _irgendwo_ in der cat_lang als Startartikel vorhanden ist.
Ich übersetze mal und ergänze den 2. SQL-Block:

Code: Alles auswählen

$i=$i; 
$new_idart=$idart+1;

SELECT idart
FROM ".$cfg["tab"]["cat_art"]." 
WHERE  idart='$new_idart' AND
       $new_idart !=ANY(hier soll ein Subquery hin: SELECT alle startidartlang FROM cat_lang)";
Ist das prinzipiell so richtig oder völliger Schwachsinn?
Kann mir jemand vielleicht dieses Sub-Select aufbauen - ich komme mit dem $cfg-Teil nicht klar und weiß auch nicht, ob man dafür eine eigenes DB-Objekt erstellen muss.
rezeptionist
Beiträge: 1536
Registriert: Fr 20. Aug 2004, 10:07
Kontaktdaten:

Beitrag von rezeptionist »

schau mal hier

http://w3concepts.net/1/1/51/112.html

vielleicht hilfts
greets
Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin »

Das Problem ist, dass MySQL keine Subselects unterstuetzt(e), ich weiss nicht, ob die neueren Versionen es tun. Sonst muss man mit Joins arbeiten.
Bitte keine unaufgeforderten Privatnachrichten mit Hilfegesuchen schicken. WENN ich helfen kann, dann mache ich das im Forum, da ich auch alle Postings lese. PN werden nicht beantwortet!
Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin »

noch etwas: das $cfg["tab"] steht fuer dein Tabellenpraefix, i.d.R. "con", (oder ist es con_?), jedenfalls wird mit $cfg["tab"]["cat_art"] oder $cfg["tab"]["art_lang"] die jeweilige Tabelle der Datenbank "angesprochen".
Bitte keine unaufgeforderten Privatnachrichten mit Hilfegesuchen schicken. WENN ich helfen kann, dann mache ich das im Forum, da ich auch alle Postings lese. PN werden nicht beantwortet!
kloevekorn
Beiträge: 199
Registriert: Mo 31. Okt 2005, 15:26
Wohnort: Hamburg
Kontaktdaten:

Beitrag von kloevekorn »

Halchteranerin hat geschrieben:Das Problem ist, dass MySQL keine Subselects unterstuetzt(e), ich weiss nicht, ob die neueren Versionen es tun. Sonst muss man mit Joins arbeiten.
Danke für diese existentielle Information, da würde man ja verrückt beim coden!! Nur Joins sind nun leider auch nicht meine Stärke :-(. Mit dem von receptionist genannten Modul komme ich auch nicht weiter.

Ich versuche jetzt, die aktuelle Artikel-ID mit allen Startartikel-IDs abzugleichen, die ich in einer eigenen Abfrage extrahieren und in ein array $alle_startartikel einfügen möchte.

Also ein dritter Block im Modul wie folgt um zuerst das Array zu erzeugen:

Code: Alles auswählen


$sql3 = "SELECT
	      startidartlang
		FROM	
           ".$cfg["tab"]["cat_lang"];
           
$db2->query($sql3);

while ($db2->next_record())
{
$element = $db2->f("startidartlang");
/*echo "$element";*/
$alle_startartikel[]= $element;
}
$anzahl = count($alle_startartikel);
for ($i=0;$i<$anzahl;$i++);{echo "ein element: $alle_startartikel[$i]<br>";}
Was funktioniert:
- mit echo "$element" wird eine Ausgabe erzeugt, die richtig aussieht (habe die Daten aber nicht als richtig verifiziert)
Was nicht funktioniert:
- das array $alle_startartikel wird nicht mit $element gefüllt - warum? Weil selbst dieses einfache PHP für mich zu hart ist.

Warum füllt sich das Array nicht, nach meiner Literatur ist $arrayname[]= "element"; richtig?

Sorry, dass ich mit diesem Anfänger-PHP-Fragen hier komme, aber ich kanns halt nicht. :roll:
kloevekorn
Beiträge: 199
Registriert: Mo 31. Okt 2005, 15:26
Wohnort: Hamburg
Kontaktdaten:

Beitrag von kloevekorn »

So, ich habs geschafft.

Das untenstehende Breadcrumb-Modul gibt, wie gehabt, die Kategorien aus. Den Artikeltitel nur dann, wenn es sich nicht um einen Startartikel handelt. Für mich sinnvoll dann, wenn aus einer Artikelliste auf einen (nicht-start)-Artikel gelingt wird, der sich in der gleichen Kategorie befindet.

Der Code geht garantiert eleganter .... aber was solls? D.h. Verbesserungen wg. Sicherheit, Performance würden highly appreciated.

Code: Alles auswählen

<?php 

/*********************************************** 
* 
* MODUL: Location-String (ohne Startikel) 
* 
* Author    :     Martin Horwath 
* Created   :     10.09.2003 
* Modified  :     05.02.2005 (by matze) ,26.1.06 idart+1 weil falsche Artikel angezeigt wurden
* 
************************************************/ 


$nav_tp = $idcat; 

// AUSGABE Location-String (nur Kategorien) 
while($nav_tp > 0) { 
  $sql = "SELECT 
              parentid, A.idcat, A.level, name 
          FROM 
              ".$cfg["tab"]["cat_tree"]." AS A, 
              ".$cfg["tab"]["cat"]." AS B, 
              ".$cfg["tab"]["cat_lang"]." AS C 
          WHERE 
              A.idcat=B.idcat AND 
              B.idcat=C.idcat AND 
              C.idlang='$lang' AND 
              B.idclient='$client' AND 
              B.idcat ='$nav_tp'"; 

  $db->query($sql); 
  $db->next_record(); 
  $nav_tree[$db->f("level")][idcat] = $nav_tp; 
  $nav_tree[$db->f("level")][parent] = $db->f("parentid"); 
  $nav_tree[$db->f("level")][name] = $db->f("name"); 
  $nav_tree[$db->f("level")][link] = $sess->url("front_content.php?idcat=".$db->f("idcat")."&client=".$client."&lang=".$lang.""); 
  $nav_tp = $db->f("parentid"); 
} 

for($i=0;$i<count($nav_tree);$i++) { 
  echo "<a class=\"breadcrumb\" href=\"".$nav_tree[$i][link]."\">".$nav_tree[$i][name]."</a>"; 
  if($nav_tree[$i][idcat] != $idcat) { 
    echo " > "; // seperator 
  } 
} 



// AUSGABE vom aktuellen Artikeltitel 
$i=$i-1; 
$new_idart=$idart+1; 

$sql = "SELECT 
             idart, is_start 
        FROM 
              ".$cfg["tab"]["cat_art"]." 
        WHERE 
              idart='$new_idart' AND is_start='0'"; 

$db->query($sql); 

if($db->next_record()) { 

  $sql = "SELECT 
             idartlang, title 
          FROM 
              ".$cfg["tab"]["art_lang"]." 
          WHERE 
              idartlang='$new_idart'"; 

  $db->query($sql); 
  $db->next_record(); 
  $art_titel=$db->f("title"); 
  
  
  
$sql3 = "SELECT
			startidartlang
		FROM	
           ".$cfg["tab"]["cat_lang"]."";  
  
$db->query($sql3);

while ($db->next_record())
{
$element = $db->f("startidartlang");
$alle_startartikel[]= $element;
}
  
if (in_array($new_idart,$alle_startartikel))
{echo "";}
  
  else
  
{echo " > $art_titel";}
  
} 
?> 






Nochmal Danke für Support!
stefkey
Beiträge: 556
Registriert: Mi 19. Okt 2005, 16:10
Wohnort: Heidelberg
Kontaktdaten:

Beitrag von stefkey »

Hallo,

ich nutze auch dieses Modul und finde es sehr praktisch! Danke!

Allerdings gibt es woh lnoch einen kleinen Fehler:

Bei einer Kategorie wird ein Artikeltitel angezeigt obwohl es in dieser Kategorie nur einen Startartikel gibt.
Allerdings wird auch ein anderer Titel von einem Artikel in einem anderen Mandanten.

Ich könnte aus der Datenbank folgendes rauslesen:

der Artikel des anderen Mandanten hat
idart 227
idcatart 279
idartlang 261


und der richtige Artikel (Starartikel) hat
idart 261
idcatart 356
idartlang 325


Ich denke da wird irgendwie idart und idartlang vertauscht.

Kann man den Fehler beseitigen?


Danke und Grüße
stefkey
stefkey
Beiträge: 556
Registriert: Mi 19. Okt 2005, 16:10
Wohnort: Heidelberg
Kontaktdaten:

Beitrag von stefkey »

Ich habs gefunden! :D

ich habe ganz unten im Output aus $new_idart ein $idartlang gemacht

orginal:
if (in_array($new_idart,$alle_startartikel))
{echo "";}

meine Änderung:
if (in_array($idartlang,$alle_startartikel))
{echo "";}



Ich kann aber nicht erklären warum...war eher Zufall....

Hat es etwas mit der Contenido Version zu tun? :?:


Grüße,
stefkey
Gesperrt