Hallo miteinander,
ich hab hier die erste Lösung parat. Ich habs nur in der Version 4.4.5r1 getestet, aber ich denke, das funktioniert genauso in anderen.
Das Ergebnis sieht momentan so aus:

Nach dem Löschen eines Artikels wird dem Redakteur mitgeteilt, welche Container noch auf den gelöschten Artikel verweisen.
Um das zu realisieren sind folgende zwei Codeänderungen/-ergänzungen notwendig:
In der MySQL Tabelle actions (con_actions) muss in der Zeile "name='con_deleteart'" das Feld "code" folgenden Inhalt erhalten:
Code: Alles auswählen
$linkcheck=conLinkcheck($idart);
$lm="";
foreach ($linkcheck as $lc) {
$lm.="<BR />".$lc."\n";
}
if ($lm!="") $lm="<BR /><BR />Folgende Artikel verweisen noch auf den eben gelöschten Artikel:".$lm;
conDeleteArt ($idart);
$tmp_notification = $notification->returnNotification("info", i18n("Artikel gelöscht".$lm));
conLinkcheck liefert ein Array mit den Clickstreams zu den Artikeln, die einen Link auf den gelöschten Artikel beinhalten.
Die Funktion conLinkcheck habe ich in contenido/includes/functions.con.php eingefügt. Diese sieht so aus:
Code: Alles auswählen
function conLinkcheck($idart) {
global $db, $cfg;
// einige Werte initialisieren
$ClickStreamSeperator=" > ";
$linkerArts = array(); // wird returned
$idcat=array();
$idcatart=array();
// alle idcat und idcatart rausfischen, die bei verlinkung auf idart führen
$sql = "SELECT * FROM ".$cfg["tab"]["cat_art"]." WHERE idart = '".$idart."'";
$db->query($sql);
while ( $db->next_record() ) {
$idcatart[] = $db->f("idcatart");
// alle idcat mit speichern, die idart als startartikel haben
if ($db->f("is_start")==1) $idcat[] = $db->f("idcat");
}
// hier beginnt die suche. alle CMS_HTMLHEAD und CMS_HTML typen nach front_content.php durchsuchen
$sql = "SELECT
a.idcontent AS idart_linker,
a.value AS value,
b.idcat AS idcat_linker,
c.title AS arttitle
FROM
".$cfg["tab"]["content"]." AS a,
".$cfg["tab"]["cat_art"]." AS b,
".$cfg["tab"]["art_lang"]." AS c
WHERE
(a.idtype = 1 OR a.idtype = 2) AND
a.value LIKE '%front_content.php%' AND
a.idcontent = b.idart AND
a.idcontent = c.idart";
$db->query($sql);
// jetzt prüfen, ob auf die idart seite verlinkt wird
while ( $db->next_record() ) {
$htmlDecoded=urldecode($db->f("value"));
$tmpoffset=0;
$HitsOnThisPage=0;
while ($tmpoffset=strpos($htmlDecoded,"front_content.php?", $tmpoffset)) {
// strlen("front_content.php?") == 18; hol dir nur die parameter; alles zwischen ? und "
$toScan=substr($htmlDecoded, $tmpoffset+18, strpos($htmlDecoded,"\"", $tmpoffset)-$tmpoffset-18);
$URLParameter = explode("&", $toScan);
foreach ($URLParameter as $UP) {
list($tmpname, $tmpvalue) = explode("=", $UP);
$TrifftZu=false;
switch ($tmpname) {
case "idcat":
if (in_array($tmpvalue, $idcat)) $TrifftZu=true;
break;
case "idcatart":
if (in_array($tmpvalue, $idcatart)) $TrifftZu=true;
break;
case "idart":
if ($tmpvalue==$idart) $TrifftZu=true;
break;
}
if ($TrifftZu) $HitsOnThisPage++;
}
$tmpoffset++; // damit er nicht immer die selbe stelle findet
}
if ($HitsOnThisPage!=0) {
$clickstream="";
conCreateLocationString($db->f("idcat_linker"), $ClickStreamSeperator, $clickstream);
$linkerArts[] = $HitsOnThisPage."x ".$clickstream.$ClickStreamSeperator.$db->f("arttitle");
}
}
return $linkerArts;
}
Kurze Erläuterung:
Ich hole mir zuerst alle idcat und idcatart über die der zu löschende Artikel erreichbar ist. Dann fische ich alle CMS_HTML und CMS_HTMLHEAD (haben die immer idtype 1 und 2?) Container, wo im "value" der String "front_content.php?" vorkommt. Gleichzeitig besorge ich mir den Titel des Artikels von diesem Container, sowie seine Kategorie, die beide für den Clickstream benötigt werden. Dann wird nur noch geguckt, ob der Link auf die zu löschende Seite verweist. Wenn ja, wird dieser Artikel in das Array mit aufgenommen, welches die Funktion zurückliefert.
Funktioniert bei mir einwandfrei. Ich habe noch einige Fragen, auch diese Funktion betreffend, vielleicht kann mir da einer helfen:
In der Datenbank: Ist das Verhältnis con_content.idcontent=con_art.idart richtig?
Ein Link auf eine Contenido Seite hat doch immer nur idart, idcat oder idcatart als Parameter, aber niemals eine Mischung, oder? Würde doch auch keinen Sinn machen?
Und die wichtigste Frage: Momentan (wie im Screenshot zu sehen) werden die gefundenen Artikel in dem Notification Feld ausgegeben. Was nicht gerade benutzerfreundlich ist. Schöner wäre es, wenn ein Popup mit dieser Artikelliste aufspringen würde und der Redakteur, wenn er sich an die Änderungen begibt, immer zu dem Popupfenster zurückkehren kann um sich die Liste nochmal anzuschauen. Contenido hat ja dafür die Javascript Funktion messageBox.notify. Hat Contenido eine Funktion um die Ausführung von Javascript Code zu veranlassen? Ich könnte auch einen Javascript Block in das Notification Feld reingeben, aber das wäre leicht unsauber.
Für Kritik und/oder Verbesserungsvorschäge wäre ich sehr dankbar.
MfG,
jkv