hier der Bausatz für die Erweiterung von Contenido um die Möglichkeit zur Seitensortierung:
Vorbemerkung:
dieser Umbau ist etwas zeitaufwendig und sollte nur von leuten durchgeführt werden, die halbwegs wissen, was sie tun (eidiweil dabei zentrale Dateien von Contenido bearbeitet werden).
Durch die Formatierung in diesem Forum sieht der Code zum Teil ein bischen wüst aus:( bei mir funktioniert er aber...
A) Datenbanktabelle anpassen:
die tabelle con_cat_side um spalte SORT erweitern
sort int(11) NULL 0
B)die Anzeige innerhalb des Backend anpassen
Datei con_show_tree.inc
B.1: erweitern um die nützliche möglichkeit: des auf- und zuklappens
(von sven777), diesmal an der Stelle wie in der strenggehüteten nächsten Contenidoversion:)
nach folgender Zeile:
Code: Alles auswählen
echo "<TR valign=top><TH align=left> ".$lngCon["structureandsides"];
Code: Alles auswählen
# erweiterung um 'alle aufklappen (+) und 'alle schließen (-)'
# von Sven777b Nov 02, 2002
echo " | <a class=action href=\"".$sess->url("main.php?area=con&action=51")."\"><img src=\"".$cfgPathImg."but_plus.gif\" alt='alle Ordner schliessen' width=16 height=11 border=0></a>";
echo " <a class=action href=\"".$sess->url("main.php?area=con&action=52")."\"><img src=\"".$cfgPathImg."but_minus.gif\" alt='alle Ordner öffnen' width=16 height=11 border=0></a>";
echo " </TH>";
folgende zeile auskommentieren (also ein # davor schreiben):
Code: Alles auswählen
$sql = "SELECT * FROM $cfgTab_cat_side AS A, $cfgTab_side AS B, $cfgTab_side_lang AS C WHERE A.idcat='$idcat' AND A.idside=B.idside AND B.idside=C.idside AND C.idlang='$lang' ORDER BY B.idside";
und danach einfügen
Code: Alles auswählen
$sql = "SELECT * FROM $cfgTab_cat_side AS A, $cfgTab_side AS B, $cfgTab_side_lang AS C WHERE A.idcat='$idcat' AND A.idside=B.idside AND B.idside=C.idside AND C.idlang='$lang' ORDER BY A.sort desc,B.idside";
nach folgendem pasus:
Code: Alles auswählen
//************* Löschen Button *************
if ($perm->have_perm("area_con_new")){
$tmp_area = "con";
echo "<a class=action href=\"".$sess->url("main.php?area=$tmp_area&action=40&idcat=".$db2->f("idcat")."&idside=".$db2->f("idside"))."#deletethis\"><img src=\"".$cfgPathImg."but_deleteside.gif\" border=\"0\" width=\"13\" height=\"13\" alt=\"".$lngCon["actions"]["41"]."\"></a> ";
}
Code: Alles auswählen
//*************** Seite nach oben schieben*****
#Änderung ps@screengarden.de 5.11: erweiterung um Seitensortierung (spalte sort in con_cat_side)
$tmp_area = "con";
echo "<a class=action href=\"".$sess->url("main.php?area=$tmp_area&action=53&idcat=".$db2->f("idcat")."&idside=".$db2->f("idside")."&sort=".$db2->f("sort"))."#deletethis\"><img src=\"".$cfgPathImg."but_moveup.gif\" border=\"0\" width=\"13\" height=\"13\" alt=\"".$lngCon["actions"]["up"]."\"></a> ";
C) die Übergabe anpassen
in der Datei main_con.php
einfügen nach den aktionen 51 und 52 (von sven777
Code: Alles auswählen
#Änderung ps@screengarden.de 5.11: erweiterung um Seitensortierung (spalte sort in con_cat_side)
if ($action == 53) { //*************** Seite nach oben schieben*****
conMoveUp ($idside,$idcat,$sort);
}
D) Die Funktionen anpassen
Datei inc/fnc_con.inc.php
ganz unten, vor dem ?> (also nach svens funktionen)
einfügen
Code: Alles auswählen
#Änderung ps@screengarden.de 5.11: erweiterung um Seitensortierung (spalte sort in con_cat_side)
function conMoveUp ($idside,$idcat,$sort){
global $db;
global $cfgTab_cat_side;
#nach oben verschieben auf die Position der oberen Seite,
# und die obere Seite nach unten -> die Werte tauschen
$sql = "select idside,sort FROM $cfgTab_cat_side WHERE sort >= '$sort' AND idcat='$idcat' AND idside<>'$idside' ORDER BY sort LIMIT 1";
$db->query($sql);$db->next_record();
$sort_oben = $db->f("sort");
$idside_oben = $db->f("idside");
if ($sort_oben!=""){
# es könnte noch sein, dass $sort == $sort_oben ist, weil vorher bei allen seiten sort==0 war
if($sort_oben==$sort)$sort_oben++;
$sql = "UPDATE $cfgTab_cat_side SET sort='$sort_oben' WHERE idside='$idside' AND idcat='$idcat'";
#echo $sql;
$db->query($sql);
$sql = "UPDATE $cfgTab_cat_side SET sort='$sort' WHERE idside='$idside_oben' AND idcat='$idcat'";
$db->query($sql);
};
};
Das kann unter Umständen nervig sein.
Abhilfe:
Datei inc/fnc_con.inc.php
in der function conEditFirstTime(....)
als erste zeile
Code: Alles auswählen
global $ganzoben;
Code: Alles auswählen
//******** entry in 'cat_side'-table ***************
//**** check if there are sides in this category. if not make it a start side.
Code: Alles auswählen
$sql=...
und darunter folgendes (das ersetz den bestehenden Teil bis zur zeile /**** entry in 'side'-table******/) :
Code: Alles auswählen
$sql = "SELECT sort FROM $cfgTab_cat_side WHERE idcat='$idcat' ORDER BY sort desc ";
$db->query($sql);
if ($db->next_record()) {
if($ganzoben){# beim Neueinfügen wird die Seite ganz oben hingestellt
$sort=max($db->f("sort")+1,$db->num_rows());
}else{
$sort=0;
# wenn es noch andere Seiten gibt werden die nach oben geschoben
$sql="UPDATE $cfgTab_cat_side SET sort=sort+1 WHERE idcat='$idcat'";
$db->query($sql);
};
$sql = "INSERT INTO $cfgTab_cat_side (idcat, idside, is_start, author, created, sort) VALUES '$idcat', '$new_idside', '0', '$author', '$created', '$sort')";
} else {
$sql = "INSERT INTO $cfgTab_cat_side (idcat, idside, is_start, author, created) VALUES ('$idcat', '$new_idside', '1', '$author', '$created')";
}
$db->query($sql);
//******** entry in 'side'-table ***************
und als letzter Teil in dieser Datei das löschen der Seite modifizieren:
in der
function conDeleteSide ($idside)
VOR der folgenden Zeile:
Code: Alles auswählen
$sql = "DELETE FROM $cfgTab_cat_side WHERE idside='$idside'";
Code: Alles auswählen
#---------------------------snip----------------------------
#Änderung ps@screengarden.de 5.11: erweiterung um Seitensortierung (spalte sort in con_cat_side)
$sql = "SELECT * FROM $cfgTab_cat_side WHERE idside='$idside'";
$db->query($sql);
while ($db->next_record()) {
$idcat[]= $db->f("idcat");
$sort[] = $db->f("sort");
}
if (is_array($idcat)) {
$i=0;
foreach ($idcat AS $value) {
$sortierung=$sort[$i];
$i++;
$idcat=$value;
$sql = "UPDATE $cfgTab_cat_side SET sort=sort-1 WHERE idcat='$idcat' AND sort > '$sortierung'";
$db->query($sql);
}
}
#----------------------snap--------------------------------
Bei einer neuen Seite wird SORT nun immer als höchsten Wert eingetragen;
da man das nicht immer haben will, noch das Template ändern:
Datei inc/con_edit_form.inc.php
VOR das letzte
Code: Alles auswählen
echo "<TR ...>
Code: Alles auswählen
// erweiterung um Abfrage der Platzierung(sort) bei Neueingabe
if ($tmp_firstedit == 1) {
echo "<TR valign=top><TD class=head>An oberster Stelle:</TD><TD class=content>";
echo "<INPUT type=checkbox name=ganzoben>ja";
echo "</TD>";
echo " <TD WIDTH=50> </TD></tr>";
};
G) So, nun muss nur noch die Frontendausgabe angepasst werden.
Dazu werden die Seitentemplates umgebaut, so dass die Seiten entsprechend SORT sortiert ausgegeben werden:
in den sql-statements muß es dann immer etwa so heißen:
" select *
FROM $cfgTab_cat_side as A
WHERE A.idcat=$idcat AND A.idside=$idside ORDER BY A.sort desc";
(als beispiel aus dem real life zB die Abfrage aus einem newsmodul:
$sql = "SELECT A.idside AS idside, A.lastmodified, A.datestart,A.dateend, A.title AS title,B.idcat AS idcat,C.parentid AS parentid,D.value AS content
FROM $cfgTab_side_lang AS A,$cfgTab_cat_side AS B,$cfgTab_cat AS C,$cfgTab_content AS D
WHERE A.idside=B.idside AND D.idsidelang=A.idsidelang AND B.idcat=C.idcat AND C.idclient='$client' AND B.idcat='$navmod_id' AND idlang='$lang'
AND online='1' AND is_start='0' group by A.idside order by B.sort desc";
#-----------------------------
So, das wars ...
viel Spaß
peter