Erweiterung von Conteido um eine Seitensortierung

peter
Beiträge: 42
Registriert: Do 19. Sep 2002, 19:07
Wohnort: berlin
Kontaktdaten:

Erweiterung von Conteido um eine Seitensortierung

Beitrag von peter » Mi 6. Nov 2002, 00:32

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
gruß peter s/berlin

Eppi
Beiträge: 252
Registriert: Di 17. Sep 2002, 16:33
Wohnort: Ilmenau (Thüringen)
Kontaktdaten:

Beitrag von Eppi » Mi 6. Nov 2002, 17:03

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.
Ein neues CMS-System:
www.der-dirigent.de

steff
Beiträge: 31
Registriert: Mo 28. Okt 2002, 12:56
Wohnort: Kölle
Kontaktdaten:

Beitrag von steff » Do 7. Nov 2002, 10:35

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

peter
Beiträge: 42
Registriert: Do 19. Sep 2002, 19:07
Wohnort: berlin
Kontaktdaten:

Beitrag von peter » Mo 11. Nov 2002, 22:08

danke für die Blumen ;)
gruß peter s/berlin

enduser
Beiträge: 36
Registriert: Di 22. Okt 2002, 23:22
Wohnort: Pfalz
Kontaktdaten:

Problem beim Einbau der Seitensortierung

Beitrag von enduser » Di 7. Jan 2003, 00:53

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?

Björn
Beiträge: 276
Registriert: Di 17. Sep 2002, 18:25
Kontaktdaten:

Beitrag von Björn » Di 7. Jan 2003, 02:31

Mein Respekt, klasse Erweiterung.

peter
Beiträge: 42
Registriert: Do 19. Sep 2002, 19:07
Wohnort: berlin
Kontaktdaten:

Beitrag von peter » Di 7. Jan 2003, 19:42

@ 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

Sausi
Beiträge: 53
Registriert: Do 10. Okt 2002, 11:47
Kontaktdaten:

Hab auch ein Prob

Beitrag von Sausi » Do 9. Jan 2003, 20:54

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

enduser
Beiträge: 36
Registriert: Di 22. Okt 2002, 23:22
Wohnort: Pfalz
Kontaktdaten:

Prob gelöst

Beitrag von enduser » Do 9. Jan 2003, 23:10

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.

peter
Beiträge: 42
Registriert: Do 19. Sep 2002, 19:07
Wohnort: berlin
Kontaktdaten:

Beitrag von peter » Fr 10. Jan 2003, 01:05

@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
gruß peter s/berlin

enduser
Beiträge: 36
Registriert: Di 22. Okt 2002, 23:22
Wohnort: Pfalz
Kontaktdaten:

Beitrag von enduser » Fr 10. Jan 2003, 11:10

@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?

enduser
Beiträge: 36
Registriert: Di 22. Okt 2002, 23:22
Wohnort: Pfalz
Kontaktdaten:

Beitrag von enduser » Fr 10. Jan 2003, 12:13

Hab' Svens Erweiterungen selbst gefunden. Wer lesen kann, kommt weiter...

frankie
Beiträge: 14
Registriert: Fr 14. Mär 2003, 14:02
Kontaktdaten:

erweiterung

Beitrag von frankie » So 4. Mai 2003, 21:57

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

hk-cons
Beiträge: 99
Registriert: Di 25. Mär 2003, 09:08
Kontaktdaten:

Beitrag von hk-cons » Mo 5. Mai 2003, 06:14

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
Gott schütze die Dummen, denn sie ernähren die Wissenden

frankie
Beiträge: 14
Registriert: Fr 14. Mär 2003, 14:02
Kontaktdaten:

erweiterung

Beitrag von frankie » Mo 5. Mai 2003, 16:14

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

Gesperrt