Seite 1 von 2

Erweiterung von Conteido um eine Seitensortierung

Verfasst: Mi 6. Nov 2002, 00:32
von peter
Hi,

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>&nbsp;".$lngCon["structureandsides"];
einfügen:

Code: Alles auswählen

# erweiterung um 'alle aufklappen (+) und 'alle schließen (-)'
# von Sven777b  Nov 02, 2002
echo "&nbsp;|&nbsp;<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 "&nbsp;<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 "&nbsp;</TH>";
B2. Einfügen der modifizierten sql-Abfrage
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";
B3.: einfügen des Buttons für Seite-nach-oben-schieben:
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>&nbsp;";
                                        }
folgendes zusätzlich einfügen:

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>&nbsp;";

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);
   };
};
E) Wenn man nun eine neue Seite einfügt, wird diese immer ganz unten eingefügt.
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;
dann, nach den Zeilen

Code: Alles auswählen

//******** entry in 'cat_side'-table ***************
//**** check if there are sides in this category. if not make it a start side.
die nächste zeile

Code: Alles auswählen

$sql=... 
auskommentieren (# davorschreiben
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'";
dieses einfügen:

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--------------------------------
F)
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  ...> 
einfügen:

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>&nbsp;</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

Verfasst: Mi 6. Nov 2002, 17:03
von Eppi
also, ansich gefällt es mir ganz gut... Mal sehen was wir davon in die 4.4 übernehemn. Wir werden es wahrscheinlich dahingehend optimieren, daß weniger Datenbankabragen nötig sind.

Verfasst: Do 7. Nov 2002, 10:35
von steff
Tolle Erweiterung! Ich hatte bereits selbst angefangen, etwas ähnliches zu bauen, ich hatte aber das Sortierfeld umgedreht belegt, also 0 als erste Seite. 0 als letzte Seite zu nehmen ist aber mit Abstand eleganter. :oops:

Steff

Verfasst: Mo 11. Nov 2002, 22:08
von peter
danke für die Blumen ;)

Problem beim Einbau der Seitensortierung

Verfasst: Di 7. Jan 2003, 00:53
von enduser
Ich habe nach dieser Anleitung die Seitensortierung eingebaut. Nach dem Einloggen und der Auswahl des Clients bekomme ich folgende Fehlermeldung:

Parse error: parse error, unexpected T_STRING in c:\programme\easyphp\www\contenido\main_con.php on line 23

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);  // ***********   Zeile 23  *********************
}
Wenn ich mich einlogge und dann direkt einen anderen Menüpunkt als "Content" anwähle, z.B. Administration, erhalte ich folgende Fehlermeldungen:

Parse error: parse error, unexpected T_IF in c:\programme\easyphp\www\contenido\inc\fnc_con.inc.php on line 59

Code: Alles auswählen

    $sql = "SELECT MAX(idside) FROM $cfgTab_side";
	$db->query($sql);
	$db->next_record();
	$a_tmp = each($db->Record);
	$new_idside = $a_tmp[1] + 1;

	//******** entry in 'cat_side'-table ***************
	//**** check if there are sides in this category. if not make it a start side.
      //$sql = "SELECT * FROM $cfgTab_cat_side WHERE idcat='$idcat'";
$sql = "SELECT sort FROM $cfgTab_cat_side WHERE idcat='$idcat' ORDER BY sort desc "; 
$db->query($sql); 
if ($db->next_record()) {  //*********  ZEILE 59 *************************************************
  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 ***************
Auf welche Stellen sich die Meldungen beziehen, scheint mir schon klar zu sein, aber wo liegt der Fehler?

Verfasst: Di 7. Jan 2003, 02:31
von Björn
Mein Respekt, klasse Erweiterung.

Verfasst: Di 7. Jan 2003, 19:42
von peter
@ enduser:
sorry, ich hab im moment keine idee dazu.
vielleicht fällt einem der Contenido-Entwickler was dazu ein <hoffnungsvoll guck>, weil das Teil bei mir natürlich ohne Probs läuft, und bei einigen anderen scheinbar ja auch (oder?)

grz
peter

Hab auch ein Prob

Verfasst: Do 9. Jan 2003, 20:54
von Sausi
Also, ich habe auch ein Problem mit dieser Erweiterung. Allerdings funktioniert sie in meinem Backend sehr gut. Anders sieht es dagegen aus mit dem Frontend. Ich habe mein Newsmodul entsprechend der Anleitung geändert. Es lautet jetzt im entscheidenden SQL-Statement:

Code: Alles auswählen

// select all articles in category widthout start article
$query = "SELECT ARTLANG.idside, ARTLANG.idsidelang FROM $cfgTab_cat_side AS CATART, $cfgTab_side_lang AS ARTLANG ".
         "WHERE CATART.idcat = '$selcat' AND ARTLANG.idside = CATART.idside AND ARTLANG.idlang = '$lang' AND ".
         "ARTLANG.online = '1' AND CATART.is_start = '0' ORDER BY B.sort DESC LIMIT $countart";
Ich erhalte aber immer folgende Fehlermeldung: Warning:
"Invalid argument supplied for foreach() in /homepages/7/d28671464/htdocs/contenido/extra/front_content.php(128) : eval()'d code on line 193"

Hat jemand eine Idee? Muß ich eventuell auch in der front_content.php irgendwelche SQL-Befehle umschreiben? Wenn ja, wo?
Muß ich noch an anderer Stelle frontendbezogene Dateien ändern?

Wäre schön, wenn jemand Rat wüßte.

Gruß Joerg

Prob gelöst

Verfasst: Do 9. Jan 2003, 23:10
von enduser
Die Tips bezüglich Zeilenumbruch waren hilfreich. Offenbar gab's außerdem noch Fehler, die auf Blanks am Zeilenende und Einrückungen etc. zurückzuführen waren. Habe alle Einrückungen und am Zeilenende folgenden Leerzeichen rausgenommen, jetzt läuft's ohne Fehlermeldung durch.

Allerdings funktioniert das "Alle Ordner öffnen/schließen" nicht. Die Seite "Content-Seiten" wird zwar neu aufgebaut, allerdings ohne Änderung. Außerdem ist der linke "+"-Knopf sinnverkehrt mit "alle Ordner schließen" und der rechte "-"-Knopf mit "alle Ordner öffnen" in Mauszeiger-Popup beschriftet. Ist nicht weiter tragisch, nur geht's mir halt gegen den Strich, daß diese Super-Erweiterung nicht komplett funktioniert. Ja ja, ich weiß: dransetzen, selber machen. Aber so gut bin ich - noch - nicht.

Verfasst: Fr 10. Jan 2003, 01:05
von peter
@Sausi:
schau Dir das sql-statement nochmal an:
wenn Du statt

Code: Alles auswählen

ORDER BY B.sort DESC 
schreibst

Code: Alles auswählen

ORDER BY CATART.sort DESC 
sollte es gehen ...

siehe Anleitung:
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";

@enduser:
wahrscheinlich hast du die entsprechenden erweiterungen von sven 777 nicht eingebaut,
ansonsten zitiere ich nochmal die anleitung
Vorbemerkung:
dieser Umbau ... sollte nur von leuten durchgeführt werden, die halbwegs wissen, was sie tun
:wink:

peter

Verfasst: Fr 10. Jan 2003, 11:10
von enduser
@peter:

Zu meiner "Qualifikation": Stimmt. Aber was nicht klappt, muß geübt werden... Hab's auch nur auf einem kleinen inhaltsleeren Versuchssystem ausprobiert, Fehler bleiben also folgenlos.

Dazu passend die ahnungslose Frage: _Welche_ Erweiterungen von Sven?

Verfasst: Fr 10. Jan 2003, 12:13
von enduser
Hab' Svens Erweiterungen selbst gefunden. Wer lesen kann, kommt weiter...

erweiterung

Verfasst: So 4. Mai 2003, 21:57
von frankie
hi zusammen,

tolle sache, dass peter eine erweiterung für die reihenfolge geschrieben hat. das ist nämlich ein schwachpunkt von contenido. (sonst ist es aber eine coole sache :-)

also ich hab die files angepasst und im backend erschienen auch die buttons für das verschieben der seiten.
doch wenn ich draufklicke, lädt die seite zwar neu (also werden die sql befehle ausgeführt), sie erscheint aber wieder in der selben reihenfolge (ich rede bis jetzt nur vom backend).

ich nehme mal an, das ist, weil ich die sql abfragen noch nicht angepasst habe (der letzte schritt der anleitung von peter).

wo muss ich überall die sql abfragen anpassen? für das frontend im navigationsmodul? und wo muss ich sie anpassen, dass auch im backend die sortierung angezeigt wird?

danke für eure hilfe!
grüsse aus der schweiz
frankie

Verfasst: Mo 5. Mai 2003, 06:14
von hk-cons
Hallo

Du mußt echt nur alles aus Peters Anleitung machen, bei mir hats auf Anhieb gefunzt.
Schau doch auch mal in die errorlog.txt iunter contenido/logs bzw. clientxxx/logs, da wird wahrscehinlich ein sql-Fehler zu sehen sein.
Ich vermute mal, du hast die eine Tabelle nicht um die Spalte sort erweitert. :cry:

Gruß Harald

erweiterung

Verfasst: Mo 5. Mai 2003, 16:14
von frankie
danke für die rasche antwort.

ich habe die spalte "sort" in die datenbank eingefügt. hat es bei euch gefunzt, ohne irgendwelce sql befehle anzupassen? ich denke, dass dort mein problem liegt. ich bin eben nicht so vertraut mit php und sql. peter schreibt ja, man müsse die sql abfragen anpassen, oder?

danke!
grüsse
frankie