Seite 1 von 2

Crosslinking von Artikeln per Schlagwortvergabe

Verfasst: So 19. Sep 2010, 16:15
von McHubi
Contenido 4.9:
Zur neuen Version dieses Moduls: http://forum.contenido.org/viewtopic.php?f=89&t=36172



-----------------------------
Hallo zusammen,

hatte letztens ein Fachbuch in der Hand, bei dem verschiedene Kapitel mit Querverweisen zu anderen Kapiteln versehen waren. Das lässt sich natürlich nach dem bekannten "das könnte Sie auch interessieren"-Schema auf einer Website einbinden. Also hab ich mir das mal vorgenommen und es klappt.

Kurze Erklärung zum Prinzip:
Artikel A bekommt die Schlagworte "Auto" und "Gelände".
Artikel B bekommt die Schlagworte "Auto" und "Sportwagen".
Artikel C bekommt die Schlagworte "Motorrad" und "Gelände".

Durch diese Verschlagwortung bekommen alle Artikel in einer kleinen Box automatisch erzeugte Querverweise:
Artikel A ist per "Auto" mit Artikel B verlinkt und per "Gelände" mit Artikel C.
Artikel B ist per "Auto" nur mit Artikel A verlinkt.
Artikel C ist per "Gelände" mit Artikel A verlinkt.

In Screenshots sieht das so aus:
BildBild
Bild

So lassen sich verwandte Artikel direkt verlinken und "Interessengruppen" bilden. Sobald ein Artikel neu in eine Schlagwortgruppe kommt, ist er automatisch bei allen verwandten Artikeln dabei. Es muss also keine "manuelle Verlinkung" vorgenommen werden. Gleiches gilt auch umgekehrt, wenn ein Artikel mal nicht mehr in einer Gruppe erscheinen soll.

Die Vergabe von Schlagworten wird in zwei Datenbanktabellen hinterlegt: eine für jedes Schlagwort mit den dazugehörigen Artikel-idarts, eine für jede idart mit den zugeordneten Schlagworten. Bei der Linkerzeugung werden diese beiden Tabellen abgeklappert und auch mit der con_art_lang abgeglichen ob der Artikel überhaupt online ist. Bei der Linkausgabe kann gewählt werden ob der im Reiter Eigenschaften hinterlegte Title oder die Headline angezeigt werden soll. Bei der Headline sind allerdings in der con_content teilweise reichlich Sonderzeichen mit % usw. vorhanden, die vor der Ausgabe per str_replace entfernt oder ersetzt werden. Klappt, aber da gibts evtl. noch einen besseren Weg?

EDIT 15.12.2011: Es gibt jetzt am Anfang des Outputs die Möglichkeit, ein Sortierkriterium anzugeben. "name" sortiert die Verknüpfungen nach Title oder Headline, "created" nach dem Erstellungsdatum des Artikels und "lastmodified" nach dem Zeitpunkt der letzten Änderung.

Über den Reiter Konfiguration lassen sich neue Schlagworte vergeben, löschen und ändern. Beim Löschen wird geprüft, ob irgend ein Artikel mit diesem Schlagwort versehen ist. Wenn ja, ist ein Löschen erst möglich, wenn bei allen Artikeln dieses Schlagwort nicht mehr zugeordnet ist (dabei wird eine Liste mit Links auf diese idarts ausgegeben um einem das Suchen abzunehmen).

Wenn ein Artikel einmal nicht nur offline gestellt sondern komplett gelöscht wird, wird diese idart zukünftig nicht mehr zum Einsatz kommen. Das Modul "erkennt" zwar, dass es diesen Artikel nicht mehr gibt da bei der Prüfung ob er online ist natürlich kein positives Ergebnis kommen kann. Also wird er nicht mehr verlinkt. In den beiden Tabellen ist diese idart aber noch vorhanden. Um sie rauszuwerfen und die Tabellen sauber zu halten, sollte von Zeit zu Zeit die Funktion "auf nicht vorhandene idarts prüfen" durchgeführt werden. Dadurch wird geschaut, ob die in der Tabelle für die Artikel vorhandenen idarts überhaupt noch in der con_art_lang vorkommen. Wenn nicht, Rauswurf in der Tabelle für die Schlagworte und die Artikel.

Die Zuordnung der Schlagworte erfolgt per Dropdownfeld, ebenso das Aufheben der Zuordnung. Im Backend siehts dafür so aus:
Bild

SQL zum Anlegen der Tabellen:

Code: Alles auswählen

CREATE TABLE `crosslinking_schlagworte` (
`id` INT( 255 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`schlagwort` VARCHAR( 50 ) NOT NULL ,
`idart_schlagwort` TEXT
);

CREATE TABLE `crosslinking_artikel` (
`idart` INT( 11 ) NOT NULL PRIMARY KEY ,
`schlagworte` TEXT
);
INPUT:

Code: Alles auswählen

/***********************************************
* crosslinking Input
*
* Author      :     seamless-design Markus Hübner
* Copyright   :     seamless-design Markus Hübner
* Created     :     2010-09-17
************************************************/

//error_reporting(E_ALL);

$tabelle="crosslinking_schlagworte";
$tabelle_artikel="crosslinking_artikel";
$url=$_SERVER['HTTP_HOST'];


/************** NEUES SCHLAGWORT, SCHLAGWORT LÖSCHEN **************/
echo '<strong>Schlagwort eintragen/ l&ouml;schen:</strong><br/>';
echo '<table><tr>';
echo '<td><input name="sw" type="text" size="20"></input></td>';
echo '<td><input type="radio" name="sw_eintragen_loeschen" value="sw_eintragen"> eintragen<br/>';
echo '<input type="radio" name="sw_eintragen_loeschen" value="sw_loeschen"> l&ouml;schen</td>';
echo '<td><input type="image" src="images/submit.gif"></td>';
echo '</tr></table>';


$abfrage = "SELECT schlagwort,idart_schlagwort FROM $tabelle";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis)) $schlagwortarray[]=$row->schlagwort;

if($sw!="" AND $sw_eintragen_loeschen!="")
{
if(in_array($sw, $schlagwortarray)) $vorhanden="ja";
if($sw_eintragen_loeschen=="sw_eintragen")
  {
  if($vorhanden!="ja")
   {
   $eintrag="INSERT INTO $tabelle (schlagwort) VALUES ('$sw')";
   $eintragen = mysql_query($eintrag);
   if ($eintragen==true) {echo ' Eintrag von '.$sw.' erfolgreich.';} else echo ' Eintrag von '.$sw.' nicht erfolgreich.'; // Info ob Eintrag in DB erfolgte
   }
   else echo ' '.$sw.' ist bereits enthalten!';
   }
if($sw_eintragen_loeschen=="sw_loeschen")
  {
  if($vorhanden=="ja")
   {
   $abfrage = "SELECT idart_schlagwort FROM $tabelle WHERE schlagwort='$sw'";
   $ergebnis = mysql_query($abfrage);
   while($row = mysql_fetch_object($ergebnis)) $idart_schlagworte_vorhanden=$row->idart_schlagwort;
     if($idart_schlagworte_vorhanden!="")
       {
       echo 'Kein L&ouml;schen m&ouml;glich, für '.$sw.' sind Verknüpfungen zu folgenden idart vorhanden:<br/>';
       $avar = explode("#", $idart_schlagworte_vorhanden);
       $len = count($avar);
       for ($i=1; $i<$len; $i++)
       {
       echo '-> <a href="../cms/front_content.php?idart='.$avar[$i].'" target="_blank">'.$avar[$i].'</a><br/>';
       }
       $loeschen_verhindern="ja";
       }
   if($loeschen_verhindern!="ja")
     {
     $loeschung="DELETE FROM $tabelle WHERE schlagwort= '$sw'";
     $loeschen = mysql_query($loeschung);
     if ($loeschen==true) {echo ' L&ouml;schen von '.$sw.' erfolgreich.';} else echo ' L&ouml;schen von '.$sw.' nicht erfolgreich.'; // Info ob Löschen in DB erfolgte
     }
   }
   else echo 'Löschen nicht möglich: '.$sw.' ist in der Liste der Schlagworte nicht enthalten!';
   }
}//if($sw!="" AND $sw_eintragen_loeschen!="")

/*
echo '<br/>';
asort($schlagwortarray);
foreach ($schlagwortarray as $value) {
echo $value.'<br/>';
}
unset($value); // break the reference with the last element
*/


/************** SCHLAGWORT ÄNDERN **************/
echo '<hr>';
echo '<strong>Schlagwort &auml;ndern:</strong><br/>';
echo 'alt: <input name="sw_aendern_alt" type="text" size="20"></input> neu: <input name="sw_aendern_neu" type="text" size="20"></input> <input type="image" src="images/submit.gif">';

if($sw_aendern_alt!="" AND $sw_aendern_neu!="")
  {
  $abfrage = "SELECT schlagwort,idart_schlagwort FROM $tabelle WHERE schlagwort='$sw_aendern_alt'";
  $ergebnis = mysql_query($abfrage);
  while($row = mysql_fetch_object($ergebnis)) 
    {
    $schlagwort=$row->schlagwort;
    $vorhandene_idart=$row->idart_schlagwort;
    }
  if($schlagwort=="") echo '<br/>Dieses Schlagwort ist nicht vorhanden.';
  if($schlagwort!="")
  {
  echo '<br/>Schlagwort wird verwendet von folgenden Artikeln: '.$vorhandene_idart;
  $aenderung_durchfuehren="UPDATE $tabelle SET schlagwort='$sw_aendern_neu' WHERE schlagwort='$sw_aendern_alt'";
  $aendern = mysql_query($aenderung_durchfuehren);
  if ($aendern==true) {echo '<br/>&Auml;ndern von '.$sw_aendern_alt.' in '.$sw_aendern_neu.' in Schlagworttabelle erfolgreich.';} else echo '<br/>&Auml;nderung von '.$sw_aendern_alt.' in '.$sw_aendern_neu.' in Schlagworttabelle nicht erfolgreich.'; // Info ob Zuordnung in DB erfolgte
  }
  
/*Beginn Aufsplitten des idart-strings*/
//echo '<br/>';
$avar = explode("#", $vorhandene_idart);
$len = count($avar);
//echo '<br/>Anzahl Arrayelemente: '.$len.'<br/>';
for ($i=1; $i<$len; $i++)
  {
//  printf("<br>%d: %s<br>\n", $i, $avar[$i]);
//  echo 'aktuelle idart: '.$avar[$i].'<br/>';
  $abfrage = "SELECT schlagworte FROM $tabelle_artikel WHERE idart='$avar[$i]'";
  $ergebnis = mysql_query($abfrage);
  while($row = mysql_fetch_object($ergebnis)) $schlagworte_der_idart=$row->schlagworte;
//  echo '<br/>Zugeordnete Schlagworte: '.$schlagworte_der_idart;
  $schlagworte_der_idart_neu = str_replace($sw_aendern_alt,$sw_aendern_neu,$schlagworte_der_idart);
//  echo '<br/>Neue Schlagworte: '.$schlagworte_der_idart_neu;
  $aenderung_durchfuehren="UPDATE $tabelle_artikel SET schlagworte='$schlagworte_der_idart_neu' WHERE idart='$avar[$i]'";
  $aendern = mysql_query($aenderung_durchfuehren);
  if ($aendern==true) {echo '<br/>&Auml;ndern von '.$sw_aendern_alt.' in '.$sw_aendern_neu.' in Artikeltabelle erfolgreich.';} else echo '<br/>&Auml;nderung von '.$sw_aendern_alt.' in '.$sw_aendern_neu.' in Artikeltabelle nicht erfolgreich.'; // Info ob Zuordnung in DB erfolgte

/*Ende Aufsplitten des idart-strings*/
}
} // if($sw_aendern_alt!="" AND $sw_aendern_neu!="")


/************** ZUORDNUNG SCHLAGWORT **************/
echo '<hr>';
echo '<strong>Zuordnung eines Schlagworts:</strong><br/>';
$abfrage = "SELECT schlagwort, idart_schlagwort FROM $tabelle";
$ergebnis = mysql_query($abfrage);
$schlagwortarray=array("-- bitte wählen --");
while($row = mysql_fetch_object($ergebnis)) $schlagwortarray[]=$row->schlagwort;
asort($schlagwortarray);

echo '<table><tr>';
echo '<td><select name="sw_zuordnung">';
foreach ($schlagwortarray as $schlagwort) {
echo '<option value="'.$schlagwort.'">'.$schlagwort.'</option>';
}
unset($value); // break the reference with the last element
echo '</select></td>';
echo '<td><input type="radio" name="sw_zuordnung_durchfuehren_aufheben" value="sw_zuordnung_durchfuehren"> durchf&uuml;hren<br/>';
echo '<input type="radio" name="sw_zuordnung_durchfuehren_aufheben" value="sw_zuordnung_aufheben"> aufheben</td>';
echo '<td><input type="image" src="images/submit.gif"></td>';
echo '</tr></table>';
if($sw_zuordnung=="") echo '<br/>Kein Schlagwort ausgew&auml;hlt.';
if($sw_zuordnung!="") echo '<br/>Schlagwort '.$sw_zuordnung.' ausgew&auml;hlt.';


/*Beginn Zuordnung durchführen*/
if ($sw_zuordnung!="" AND $sw_zuordnung!="-- bitte wählen --" AND $sw_zuordnung_durchfuehren_aufheben=="sw_zuordnung_durchfuehren")
{
//echo '<br/>idart dieses artikels: '.$idart.'<br/>';
  $ergebnis = mysql_query("SELECT schlagwort, idart_schlagwort FROM $tabelle WHERE schlagwort='$sw_zuordnung'");
  while($row = mysql_fetch_object($ergebnis))
  {
  $vorhandene_idart=$row->idart_schlagwort;
  }
  //echo 'vorhandene_idart: '.$vorhandene_idart.'<br/>';
  if(preg_match("/$idart/",$vorhandene_idart)) // prüfen, ob idart dem Schlagwort bereits zugeordnet wurde
  {
  echo '<br/>Das Schlagwort '.$sw_zuordnung.' ist diesem Artikel bereits zugeordnet!';
  $abbruch_zuordnung="ja";
  }
if($abbruch_zuordnung!="ja")
  {
  /*Beginn Eintrag in Tabelle Schlagworte*/
  $vorhandene_idart_neu=$vorhandene_idart.'#'.$idart;
  $zuordnung_durchfuehren="UPDATE $tabelle SET idart_schlagwort='$vorhandene_idart_neu' WHERE schlagwort='$sw_zuordnung'";
  $zuordnen = mysql_query($zuordnung_durchfuehren);
  if ($zuordnen==true) {echo '<br/>Zuordnung von '.$sw_zuordnung.' in Schlagworttabelle erfolgreich.';} else echo '<br/>Zuordnung von '.$sw_zuordnung.' in Schlagworttabelle nicht erfolgreich.'; // Info ob Zuordnung in DB erfolgte
  /*Ende Eintrag in Tabelle Schlagworte*/
  /*Beginn Eintrag in Tabelle Artikel*/
  $ergebnis = mysql_query("SELECT idart, schlagworte FROM $tabelle_artikel WHERE idart='$idart'");
  while($row = mysql_fetch_object($ergebnis))
  {
  $vorhandene_schlagworte=$row->schlagworte;
  } 
  //echo '<br/>vorhandene schlagworte: ' .$vorhandene_schlagworte.'<br/>';
  /*noch keine schlagworte vorhanden*/
  if($vorhandene_schlagworte=="")
     {
     $schlagworte_neu='#'.$sw_zuordnung;
     $zuordnung2_durchfuehren="INSERT INTO $tabelle_artikel(idart,schlagworte) VALUES ('$idart','$schlagworte_neu')";
     $zuordnen2 = mysql_query($zuordnung2_durchfuehren);
     if ($zuordnen2==true) {echo '<br/>Zuordnung von '.$sw_zuordnung.' in Artikeltabelle erfolgreich.';} else echo '<br/>Zuordnung von '.$sw_zuordnung.' in Artikeltabelle nicht erfolgreich.'; // Info ob Zuordnung in DB erfolgte
     }
  /*schon schlagworte vorhanden*/
  if($vorhandene_schlagworte!="")
    {
    $schlagworte_neu=$vorhandene_schlagworte.'#'.$sw_zuordnung;
    $zuordnung2_durchfuehren="UPDATE $tabelle_artikel SET schlagworte='$schlagworte_neu' WHERE idart='$idart'";
    $zuordnen2 = mysql_query($zuordnung2_durchfuehren);
    if ($zuordnen2==true) {echo '<br/>Zuordnung von '.$sw_zuordnung.' in Artikeltabelle erfolgreich.';} else echo '<br/>Zuordnung von '.$sw_zuordnung.' in Artikeltabelle nicht erfolgreich.'; // Info ob Zuordnung in DB erfolgte
    }
  /*Ende Eintrag in Tabelle Artikel*/
  }// if($abbruch_zuordnung!="ja")
} // if ($sw_zuordnung!="" AND $sw_zuordnung_durchfuehren_aufheben=="sw_zuordnung_durchfuehren")
/*Ende Zuordnung durchführen*/

/*Beginn Zuordnung aufheben*/
if ($sw_zuordnung!="" AND $sw_zuordnung!="-- bitte wählen --" AND $sw_zuordnung_durchfuehren_aufheben=="sw_zuordnung_aufheben")
{
//echo '<br/>idart dieses artikels: '.$idart.'<br/>';
  /*Beginn Aufheben in Tabelle Artikel*/
  $ergebnis = mysql_query("SELECT idart, schlagworte FROM $tabelle_artikel WHERE idart='$idart'");
  while($row = mysql_fetch_object($ergebnis))
  {
  $vorhandene_schlagworte=$row->schlagworte;
  }
  //echo 'vorhandene_schlagworte: '.$vorhandene_schlagworte.'<br/>';
  $replace="";
  $vorhandene_schlagworte_neu=str_replace("#".$sw_zuordnung, $replace, $vorhandene_schlagworte);
  if($vorhandene_schlagworte_neu!="")
    {
    $aufheben_durchfuehren="UPDATE $tabelle_artikel SET schlagworte='$vorhandene_schlagworte_neu' WHERE idart='$idart'";
    $aufheben = mysql_query($aufheben_durchfuehren);
    if ($aufheben==true) {echo '<br/>Aufheben der Zuordnung von '.$sw_zuordnung.' in Artikeltabelle erfolgreich.';} else echo '<br/>Aufheben von '.$sw_zuordnung.' in Artikeltabelle nicht erfolgreich.'; // Info ob Zuordnung in DB erfolgte
    }
    else
      {
      $aufheben_durchfuehren="DELETE FROM $tabelle_artikel WHERE idart='$idart'";
      $aufheben = mysql_query($aufheben_durchfuehren);
      if ($aufheben==true) {echo '<br/>Aufheben der Zuordnung von '.$sw_zuordnung.' in Artikeltabelle erfolgreich.';} else echo '<br/>Aufheben von '.$sw_zuordnung.' in Artikeltabelle nicht erfolgreich.'; // Info ob Zuordnung in DB erfolgte     
      }
  /*Ende Aufheben in Tabelle Artikel*/
  /*Beginn Aufheben in Tabelle Schlagworte*/
  $ergebnis = mysql_query("SELECT schlagwort,idart_schlagwort FROM $tabelle WHERE schlagwort='$sw_zuordnung'");
  while($row = mysql_fetch_object($ergebnis))
  {
  $vorhandene_idart_schlagwort=$row->idart_schlagwort;
  }
  //echo '<br/>vorhandene_idart_schlagwort: '.$vorhandene_idart_schlagwort.'<br/>';
  $replace="";
  $vorhandene_idart_schlagwort_neu=str_replace("#".$idart, $replace, $vorhandene_idart_schlagwort);
  $aufheben_durchfuehren="UPDATE $tabelle SET idart_schlagwort='$vorhandene_idart_schlagwort_neu' WHERE schlagwort='$sw_zuordnung'";
  $aufheben = mysql_query($aufheben_durchfuehren);
  if ($aufheben==true) {echo '<br/>Aufheben der Zuordnung von '.$sw_zuordnung.' in Schlagworttabelle erfolgreich.';} else echo '<br/>Aufheben von '.$sw_zuordnung.' in Schlagworttabelle nicht erfolgreich.'; // Info ob Zuordnung in DB erfolgte
  /*Ende Aufheben in Tabelle Schlagworte*/
}








/************** DIESEM ARTIKEL ZUGEORDNETE SCHLAGWORTE **************/
echo '<hr>';
echo '<strong>Diesem Artikel zugeordnete Schlagworte:</strong><br/>';
$abfrage = "SELECT idart, schlagworte FROM $tabelle_artikel WHERE idart=$idart";
$ergebnis = mysql_query($abfrage);
$schlagwortarray="";
while($row = mysql_fetch_object($ergebnis)) $schlagworte=$row->schlagworte;
//echo $schlagworte;
$schlagwortarray = explode('#',$schlagworte);
asort($schlagwortarray);
foreach($schlagwortarray as $schlagwort) echo $schlagwort.' # ';




/************** IDART CHECK **************/
echo '<hr>';
echo '<strong>Auf nicht vorhandene idarts pr&uuml;fen:</strong><br/>';
echo 'Pr&uuml;fung durchf&uuml;hren? ';
echo '<input type="radio" name="idart_check_durchfuehren" value="ja"> ja ';
echo '<input type="radio" name="idart_check_durchfuehren" value="nein" checked="checked"> nein ';
echo '<input type="image" src="images/submit.gif">';

if ($idart_check_durchfuehren=="ja")
  {
  echo '<br/>Mit Schlagworten versehene idarts:';
  $abfrage = "SELECT idart FROM $tabelle_artikel";
  $ergebnis = mysql_query($abfrage);
  while($row = mysql_fetch_object($ergebnis)) 
  {
  $zu_loeschende_idart=$row->idart;
  echo '<br/>'.$zu_loeschende_idart;
  $einlesen = mysql_query("SELECT idart FROM con_art_lang WHERE idart='$row->idart'");
  if(mysql_num_rows($einlesen)==1) {echo " - vorhanden"; $vorhanden="ja";}
  else {echo " - nicht vorhanden"; $vorhanden="nein";}
  if ($vorhanden=="nein")
    {
    $loeschung="DELETE FROM $tabelle_artikel WHERE idart= '$row->idart'";
    $loeschen = mysql_query($loeschung);
    if ($loeschen==true) {echo ' - L&ouml;schen von idart '.$row->idart.' in Artikeltabelle erfolgreich.';} else echo ' - L&ouml;schen von idart '.$row->idart.' in Artikeltabelle nicht erfolgreich.'; // Info ob Löschen in DB erfolgte
   
   echo '<hr>';
     /*Beginn Entfernen in Tabelle Schlagworte*/
     $ergebnis2 = mysql_query("SELECT schlagwort,idart_schlagwort FROM $tabelle");
     while($row = mysql_fetch_object($ergebnis2))
     {
     $schlagwort=$row->schlagwort;
     $vorhandene_idart=$row->idart_schlagwort;
     //echo 'vorhandene_idart: '.$vorhandene_idart.'<br/>';
 
  $replace="";
  $vorhandene_idart_neu=str_replace("#".$zu_loeschende_idart, $replace, $vorhandene_idart);
  if($vorhandene_idart_neu!=$vorhandene_idart) // nur dann sql-Abfrage starten, wenn tatsächlich die zu löschende idart vorkommt
    {
    //echo 'zu loeschende idart'.$zu_loeschende_idart.'<br/>';
    $idart_loeschen="UPDATE $tabelle SET idart_schlagwort='$vorhandene_idart_neu' WHERE schlagwort='$schlagwort'";
    $loeschen = mysql_query($idart_loeschen);
    if ($loeschen==true) {echo 'L&ouml;schen der idart '.$zu_loeschende_idart.' in Schlagworttabelle erfolgreich.';} else echo 'L&ouml;schen der idart '.$zu_loeschende_idart.' in Schlagworttabelle nicht erfolgreich.'; // Info ob Zuordnung in DB erfolgte
    echo '<br/>idarts mit '.$schlagwort.' (alt): '.$vorhandene_idart.'<br/>';
    echo 'idarts mit '.$schlagwort.' (neu): '.$vorhandene_idart_neu.'<br/>';
    }
   
  } //while($row = mysql_fetch_object($ergebnis))
  /*Ende Entfernen in Tabelle Schlagworte*/

  } //if ($vorhanden=="nein")
  } //while($row = mysql_fetch_object($ergebnis)) 
  } //if ($idart_check_durchfuehren=="ja")
CMS_VALUE[10]=$schlagworte;
OUTPUT:

Code: Alles auswählen

<?php

/***********************************************
* crosslinking Output
*
* Author      :     Markus Hübner
* Copyright   :     Markus Hübner
* Created     :     2010-09-17
* modified    :     2011-12-15 (sortierkriterien name, created und lastmodified hinzugefügt)
************************************************/

//echo 'aktuelle idart dieses Artikels: '.$idart.'<br/>';

$linktextvariante="headline"; // headline oder title angeben
$sortierreihenfolge="auf"; // ab oder auf angeben
$sortierkriterium="name"; // name -> Sortierung nach headline oder title | created -> Sortierung nach Erstelldatum des Artikels | lastmodified -> Sortierung nach letzter Änderung
$tabelle="crosslinking_schlagworte";
$tabelle_artikel="crosslinking_artikel";

$abfrage = "SELECT idart, schlagworte FROM $tabelle_artikel WHERE idart=$idart";
$ergebnis = mysql_query($abfrage);
$schlagwortarray="";
while($row = mysql_fetch_object($ergebnis)) $schlagworte=$row->schlagworte;
//echo 'Diesem Artikel zugeordnete Schlagworte: '.$schlagworte;

if($schlagworte!="")
{
echo '<hr>';



/*Beginn Aufsplitten des Schlagwortstrings*/
//echo '<br/>';
$avar = explode("#", $schlagworte);
$len = count($avar);
//echo $len.'<br/>';
for ($i=1; $i<$len; $i++)
  {
  //printf("%d: %s<br>\n", $i, $avar[$i]);
  //echo $avar[$i].'<br/>';
  /*Beginn Ausgabe der dem gerade gesplitteten Schlagwort zugeordneten idarts*/
  $abfrage = "SELECT idart_schlagwort FROM $tabelle WHERE schlagwort='$avar[$i]'";
  $ergebnis = mysql_query($abfrage);
  while($row = mysql_fetch_object($ergebnis)) $idart_schlagwort=$row->idart_schlagwort;
  //echo $idart_schlagwort.'<br/>';
  $idart_schlagwortgesamt=$idart_schlagwortgesamt.$idart_schlagwort; // hier werden alle idarts die allen schlagworten zugeordnet wurden hineingeschrieben
  /*Ende Ausgabe der dem gerade gesplitteten Schlagwort zugeordneten idarts*/
  }
/*Ende Aufsplitten des Schlagwortstrings*/



//echo '<hr>';
//echo $idart_schlagwortgesamt;
$avar2 = explode("#",$idart_schlagwortgesamt);
$len2 = count($avar2);
//echo $len2.'<br/>';

for ($j=1; $j<$len2; $j++)
  {
  //echo 'idart: '.$avar2[$j].'<br/>';
  $idart_schlagwortarray[]=$avar2[$j];
  }

  //print_r($idart_schlagwortarray);echo '<br/>';
  $idart_schlagwortarray=array_unique($idart_schlagwortarray); //entfernt doppelte idarts
  //print_r($idart_schlagwortarray);echo '<br/>';
  $entferne_idart = array ("$idart"); // Entfernen der idart des aktuell aufgerufenen Artikels, damit er sich nicht selbst verlinkt
  $idart_schlagwortarray=array_diff($idart_schlagwortarray,$entferne_idart);
  sort($idart_schlagwortarray);// notwendig, da mit die "Adressierung" der Inhalte für $i stimmt
  //echo 'idart_schlagwortarray;'; print_r($idart_schlagwortarray);
  $anzahl_verlinkungen = count($idart_schlagwortarray);
  //echo '<br/>Anzahl der Verlinkungen: '.$anzahl_verlinkungen.'<br/>';

$ausgabearray_linktext=array("");

for ($i=0; $i<$anzahl_verlinkungen; $i++)  
  {
  $idart_online="";
  $abfrage = "SELECT idartlang,title,online,created,lastmodified FROM con_art_lang WHERE idart='$idart_schlagwortarray[$i]'"; // Abfragen für Anzeige der Artikeltitel als Linktext und weiter
  $ergebnis = mysql_query($abfrage);
  
  while($row = mysql_fetch_object($ergebnis))
    {
    $idart_idartlang=$row->idartlang;
    $idart_title=$row->title;
    $idart_online=$row->online;
    $idart_created=$row->created;
    $idart_lastmodified=$row->lastmodified;
    }
  
  //echo $idart_schlagwortarray[$i].': '.$idart_online.'<br/>';
  if($idart_online=="1") //Prüfen ob Artikel online ist
    {
    $abfrage2 = "SELECT value FROM con_content WHERE idartlang='$idart_idartlang' AND idtype='1' AND typeid='1'"; //Abfrage der Headline für Anzeige der Artikeltitel als Linktext
    $ergebnis2 = mysql_query($abfrage2);

    if($linktextvariante=="headline")
      {
      while($row = mysql_fetch_object($ergebnis2))
        {
        $inhalt=$row->value;
        $stra=array('%3Cp%3E','%3C%2Fp%3E','%0D%0A','+','%28','%3E','%3A','%26auml%3B','%26Auml%3B','%26ouml%3B','%26Ouml%3B','%26uuml%3B','%26Uuml%3B','%26szlig%3B','%2C','%3B','%2F','%E4');
        $strb=array(''       ,''          ,''      ,' ','('  ,')'  ,':'  ,'&auml;'    ,'&Auml;'    ,'&ouml;'    ,'&Ouml;'    ,'&uuml;'    ,'&Uuml;'    ,'&szlig;'    ,','  ,';'  ,'/'  ,'&auml;');
        $inhalt = str_replace($stra,$strb,$inhalt);
        //echo $inhalt.'<br/>';
        if($sortierkriterium=="name") $ausgabearray_linktext[]="$inhalt#/#$idart_schlagwortarray[$i]";
        if($sortierkriterium=="created") $ausgabearray_linktext[]="$idart_created#/#$inhalt#/#$idart_schlagwortarray[$i]";
        if($sortierkriterium=="lastmodified") $ausgabearray_linktext[]="$idart_lastmodified#/#$inhalt#/#$idart_schlagwortarray[$i]";
        }
      }
    
    if($linktextvariante=="title")
      {
      $ausgabearray_linktext[]="$idart_title#/#$idart_schlagwortarray[$i]";
      }

    }
  }

$ausgabearray_linktext=array_filter($ausgabearray_linktext); //wirft leere Elemente raus
$ausgabearray_linktext=array_values($ausgabearray_linktext); //baut array-index neu auf

if ($sortierreihenfolge=="auf") sort($ausgabearray_linktext);  
if ($sortierreihenfolge=="ab") rsort($ausgabearray_linktext);  

$j=0;
while ($j<$anzahl_verlinkungen)
{
$ausgabearray=explode("#/#",$ausgabearray_linktext[$j]);
if($sortierkriterium=="name") echo '<a href="front_content.php?idart='.$ausgabearray[1].'" title="zum Artikel '.$ausgabearray[0].'">'.$ausgabearray[0].'</a><br/>'; 
  else echo '<a href="front_content.php?idart='.$ausgabearray[2].'" title="zum Artikel '.$ausgabearray[1].'">'.$ausgabearray[1].'</a> ('.$ausgabearray[0].')<br/>'; 
$j++;
}
  
} //if($schlagworte!="")
?>
Wichtig: lasst euch beim Anlegen des ersten Schlagwortes nicht von der Fehlermeldung stören. Die kommt nur beim ersten Schlagwort vor, da die Prüfung ob es schon vorhanden ist ins Leere läuft.

Im Code hab ich so ziemlich alle Anmerkungen drin gelassen und Testausgaben nur auskommentiert statt zu löschen. So sollte man rel. schnell die einzelnen Schritte nachvollziehen können.

Viel Spass damit :D

Re: Crosslinking von Artikeln per Schlagwortvergabe

Verfasst: Mo 20. Sep 2010, 10:32
von Oldperl
Hallo McHubi,

sehr schönes Modul. :-)

Aber schau dir doch mal die Content Allocation an, das ist eigentlich deine "Verschlagwortung" für Contenido. Wenn du nun auf diese mit deinem Modul zugreifst, hättest du den gleichen Effekt ohne eine zusätzliche Angabe
Auch sparst du dir einen Input-Bereich im Artikel, da die Content Allocation sich bereits im Artikelbereich einklinkt und auch die zusätzlichen DB-Einträge.

Gruß aus Franken

Ortwin

Re: Crosslinking von Artikeln per Schlagwortvergabe

Verfasst: Mo 20. Sep 2010, 11:29
von McHubi
Hallo Ortwin,

Danke für's Lob :D

Tja, hatte mir das Thema hier http://forum.contenido.org/viewtopic.php?f=60&t=21874 schonmal zu Gemüte geführt und musste da ehrlich gesagt passen, wass den Durchblick im Code angeht. Also kam dann da die Idee das Ganze selbst zu stricken. Aber der Winter steht ja vor der Tür und bringt massig Zeit sich im Dunkeln vor Quellcodes zu hocken... :mrgreen:

Grüße aus dem Bergischen,


Markus

Re: Crosslinking von Artikeln per Schlagwortvergabe

Verfasst: Mo 20. Sep 2010, 12:37
von kummer
Wie soll denn eine Beschlagwortung mit Content Allocation möglich sein? Man gibt ja die Tags beim Artikel an und soll ja in der Lage sein, neue hinzuzufügen. Die Daten der Content Allocation müssen ja in dieser gepflegt werden. Nur die Zuweisung bereits bestehender Tags ist mit der Content Allocation möglich. Oder irre ich mich da?

Re: Crosslinking von Artikeln per Schlagwortvergabe

Verfasst: Mo 20. Sep 2010, 12:39
von Oldperl
Hallo Markus,
McHubi hat geschrieben:Danke für's Lob :D
Immer gern. :-)
McHubi hat geschrieben:Wichtig: lasst euch beim Anlegen des ersten Schlagwortes nicht von der Fehlermeldung stören.
Die kannst du vermeiden indem du an der Stelle auf ein leeres Array prüfst (is_array / empty)
Wobei ich dir empfehlen würde hier die DB-Klasse von Contenido zu nutzen, so wäre das Modul auch für verschiedene DB-Systeme bzw. -Layer verwendbar.
Beispielsweise nutzt Contenido sowohl PHP-mysql als auch -mysqli, gerade bei PHP >= 5.3 nutzen viele die mysqli-Erweiterung.
Inwiefern zum Beispiel auf MS-Servern andere DB's (Server) zur Anwendung kommen kann ich nicht sagen, du wärst aber vorbereitet dafür.

Falls du dich in die Content Allocation einarbeitest wäre es schön wenn du deine gesammelten Infos dann mit in eine Doku dazu einfliessen lassen würdest (z.B. im Wiki).

Gruß aus Franken

Ortwin

Re: Crosslinking von Artikeln per Schlagwortvergabe

Verfasst: Do 15. Dez 2011, 11:57
von Andreas
Hallo,

wie funktioniert die Sortierung der Artikel ("auf", "ab")?
Ist das alphabetisch?

Wäre es auch möglich, die Sortierung der Artikel nach dem Erstellungsdatum durchzuführen?

Re: Crosslinking von Artikeln per Schlagwortvergabe

Verfasst: Do 15. Dez 2011, 12:33
von McHubi
Hallo Andreas,
Ist das alphabetisch?
Ja... alphabetisch nach title oder headline - je nachdem was Du am Anfang des Output unter $linktextvariante eingetragen hast.
Wäre es auch möglich, die Sortierung der Artikel nach dem Erstellungsdatum durchzuführen?
Ja. Ansatz auf die Schnelle...
1) Ergänze die Abfrage

Code: Alles auswählen

$abfrage = "SELECT idartlang,title,online FROM con_art_lang WHERE idart='$idart_schlagwortarray[$i]'"; // Abfragen für Anzeige der Artikeltitel als Linktext und weiter
um die Info über created und/oder lastmodified.
2) Bei der Generierung des Array $ausgabearray_linktext[] stellst Du diese Info(s) VORAN, die Daten liegen ja nach dem Schema JJJJ-MM-TT hh:mm:ss in der DB vor. Voran deshalb, damit die alphabetische Sortierung nach wie vor greift.
3) Durch die Ergänzung mit den Daten zu created/lastmodified beinhaltet $ausgabearray=explode("#/#",$ausgabearray_linktext[$j]); nicht mehr zwei sondern drei oder vier Daten. Insofern musst Du hier auch noch Anpassungen vornehmen:
echo '<a href="front_content.php?idart='.$ausgabearray[1].'" title="zum Artikel '.$ausgabearray[0].'">';
echo $ausgabearray[0].'</a><br/>';


Das sollte es dann grundsätzlich gewesen sein. :D

Re: Crosslinking von Artikeln per Schlagwortvergabe

Verfasst: Do 15. Dez 2011, 12:44
von Andreas
Danke für die schnelle Antwort!!!

Leider bin ich in PHP nicht so fit...
Wäre es viel Arbeit (oder eine unverschämte Frage), die Änderungen in dem Modul zu ergänzen?
Das wäre wirklich klasse und würde mir sehr helfen....

Re: Crosslinking von Artikeln per Schlagwortvergabe

Verfasst: Do 15. Dez 2011, 14:23
von McHubi
Leider bin ich in PHP nicht so fit...
Naaaaaahhhhh... dann wird's Zeit sich etwas damit zu beschäftigen. Denn sooo kompliziert ist die Erweiterung nicht. Also, schau Dir gleich mal meine grobe Anleitung dazu nochmal an und such nach den entsprechenden Stellen im erweiterten Output von Post 1. :wink:

:idea: Im Modulcode sind zahlreiche Ausgaben von Informationen auskommentiert. Nimm hier und da mal die Kommentierung raus damit Du im Frontend siehst was da gerade im Modul passiert. Das erleichtert das Verständnis manchmal erheblich.

Re: Crosslinking von Artikeln per Schlagwortvergabe

Verfasst: Do 15. Dez 2011, 15:26
von Andreas
OK. Mit einigem Tüfteln habe ich es hin bekommen :D

Allerdings wird der aktuellste Artikel, der mit dem Schlagwort verbunden wurde, leider nicht in der Liste aufgeführt.
Auch nicht, wenn ich einen anderen Artikel aus der Liste aufrufe (kann also nicht am "Ausschluss" des aktuellen Artikels liegen).
Alle anderen werden wie gewünscht dargestellt....

Da weiß ich nun wirklich nicht weiter. :oops:

Re: Crosslinking von Artikeln per Schlagwortvergabe

Verfasst: Do 15. Dez 2011, 15:39
von McHubi
Der vermisste Artikel ist aber online, oder? Sonst wird der automatisch übergangen da sonst ja eine Fehlermeldung erscheinen würde...

Re: Crosslinking von Artikeln per Schlagwortvergabe

Verfasst: Do 15. Dez 2011, 15:47
von Andreas
Ja, ist online.
Habe gerade mal einen weiteren (neueren) Artikel mit dem Schlagwort versehen.
Sofort wird der zuvor vermisste Artikel in der Liste dargestellt.
Der neu hinzugekommene jedoch nicht...

Habe das wieder rückgängig gemacht und schon ist auch der zuvor vermisste Artikel wieder weg.
Kann also irgendwie nur am aktuellsten Artikel mit Schlagwort liegen.

Re: Crosslinking von Artikeln per Schlagwortvergabe

Verfasst: Do 15. Dez 2011, 16:07
von McHubi
Hast Du den geänderten Output exakt so übernommen wie er im 1. Post steht? Hier hatte ich zunächst das gleiche Problem, wenn die Sortierreihenfolge statt auf- absteigend war.

Grund: Beim Erzeugen des arrays für die Auflistung im Frontend wird ein leeres Element (5xArtikelinfos + 1xleer = 6 Elemente) am Ende eingefügt. Die Anzahl der gezählten Artikel lag korrekt bei 5, also zählte die Schleife von 0 (1. Element des arrays wird mit 0 angesprochen) bis 4 hoch, so dass alle Artikel aufgeführt wurden. Dreht man die Reihenfolge der Elemente um, kommt das leere Element an den Anfang des Arrays - und so wird in der Ausleseschleife zu früh beendet, da das letzte Element mit $ausgabearray_linktext[5] ausgelesen werden müsste. Die Schleife bricht aber schon bei 4 ab.

Nachdem ich ein array_filter/ array_value hinzugefügt habe, das das array vor der Sortierung um leere Elemente bereinigt, trat der Fehler nicht mehr auf.

Gib mal die Inhalte von $ausgabearray_linktext vor und nach der Sortierung (am Ende des Output) per print_r($ausgabearray_linktext); aus und guck ob ein leeres Element drin ist.

Ggf. schickst Du mir per PN mal Zugangsdaten. Dann schaue ich mir das heute abend mal an.

Re: Crosslinking von Artikeln per Schlagwortvergabe

Verfasst: Do 15. Dez 2011, 16:23
von Andreas
Genau das scheint es zu sein.
Es wird ein leeres Element erzeugt.

Könntest Du mir ggf. Deine Lösung mit dem
array_filter/ array_value
posten und sagen, an welcher Stelle ich das eingefügt muss?
Dann brauche ich Dich heute Abend nicht mehr belästigen...

Re: Crosslinking von Artikeln per Schlagwortvergabe

Verfasst: Do 15. Dez 2011, 16:27
von McHubi
Hast Du den geänderten Output exakt so übernommen wie er im 1. Post steht?
:twisted: