[CON-358]CMS_TEASER: Keine Sort. nach Veröffentlichungsdatum

Gesperrt
Oldperl
Beiträge: 4255
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

[CON-358]CMS_TEASER: Keine Sort. nach Veröffentlichungsdatum

Beitrag von Oldperl » Do 28. Okt 2010, 14:53

Beim Einsatz des CMS_TEASER habe ich folgenden Bug gefunden.
Möchte man einen Teaser sortiert nach Veröffentlichungsdatum ohne Startartikel anzeigen lassen, so erhält man nur eine leere Ausgabe und eine Fehlermeldung im errorlog

Code: Alles auswählen

[28-Oct-2010 15:30:18] xxx/contenido/external/backendedit/front_content.php?area=con_editcontent&idart=28&idcat=32〈=1&action=20&client=1&contenido=2f9dabdf1676b120aac13fd6bde0b6b6 MySQL error 1054: Unknown column 'a.publisheddate' in 'order clause'
SELECT
                    a.idart,
					a.idartlang,
					c.is_start
                FROM
                    con_art_lang AS a,
                    con_art AS b,
                    con_cat_art AS c
                WHERE
                    c.idcat = 32 AND
                    b.idclient = 1 AND
                    b.idart = c.idart AND
                    a.idart = b.idart AND
					
                    a.idlang = 1 AND a.online = 1  ORDER BY a.publisheddate desc
[28-Oct-2010 15:30:18] xxx/contenido/external/backendedit/front_content.php?area=con_editcontent&idart=28&idcat=32〈=1&action=20&client=1&contenido=2f9dabdf1676b120aac13fd6bde0b6b6 next_record called with no query pending in Module ID 15.
Falsch ist das Feld 'publisheddate' welches so nicht in der DB existiert. Dort heißt es nur 'published'.

Wählt man nun im Teaser aber "mit Startartikel" aus, so kommt es zumindest zu einer Listenanzeige, welche halt nicht nach dem Veröffentlichungsdatum sortiert ist.

Also habe ich mich mal auf die Suche begeben wo den da ein so unterschiedliches Verhalten herkommt. Zuerst wurde ich fündig in contenido/classes/class.cms_teaser.php Zeile 1011 ff. Dort wird je nach gesetzer Auswahl Startartikel eine andere Funktion in der Klasse Contenido_Category_Articles, die man in ../contenido/classes/Contenido_Category/Contenido_Category_Articles.class.php findet, aufgerufen.

Die aufgerufene Funktion bei "ohne Startartikel" heißt getNonStartArticlesInCategory() und genau dort passiert dann das Malheur.

Code: Alles auswählen

public function getNonStartArticlesInCategory($iCategoryId, $sOrderBy = 'created', $sOrderDirection = 'DESC', $bArticleIdAsKey = false) {
        if (!in_array(strtolower($sOrderDirection), array('asc', 'desc'))) {
            $sOrderDirection = 'DESC';
        }
		
		$sOrderBy == 'sortsequence' ? $sOrderBy = 'artsort' : null;
		$sOrderBy == 'modificationdate' ? $sOrderBy = 'lastmodified' : null;
		$sOrderBy == 'creationdate' ? $sOrderBy = 'created': null;
Ist der Parameter $sOrderBy mit einem anderen String als den geprüften belegt, so wird dieser für den Query genommen. Es gab nun mehrere Möglichkeiten das zu vermeiden. SO habe ich auch an eine Umbennung der Queryvariable mit Vorbelegung (NULL) gedacht, habe mich aber am Ende für folgende Variante entschieden, da diese relativ einfach zu erweitern ist.

Code: Alles auswählen

    public function getNonStartArticlesInCategory($iCategoryId, $sOrderBy = 'created', $sOrderDirection = 'DESC', $bArticleIdAsKey = false) {
        if (!in_array(strtolower($sOrderDirection), array('asc', 'desc'))) {
            $sOrderDirection = 'DESC';
        }

        if($sOrderBy != 'created') {

            switch ($sOrderBy) {
                case 'sortsequence':
                    $sOrderBy = 'artsort';
                    break;
                case 'modificationdate':
                    $sOrderBy = 'lastmodified';
                    break;
                case 'creationdate':
                    $sOrderBy = 'created';
                    break;
                case 'publisheddate':
                    $sOrderBy = 'published';
                    break;

                default:
                    $sOrderBy = 'created';
            }
        }
Ändert man den Klassen-Code entsprechend, tritt der Fehler nicht mehr auf und eine Sortieren nach Veröffentlichungsdatum ohne Startartikel ist nun möglich.

Gruß aus Franken

Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Re: [CON-358]CMS_TEASER: Keine Sort. nach Veröffentlichungsd

Beitrag von OliverL » Fr 29. Okt 2010, 09:39

Sieht gut aus.

auch die Überlegung das der neue Code dann einfacher zu erweitern ist ist in meinem Sinn.
Ich werde das am WE auch noch mal selber Testen.

mfg OliverL

Oldperl
Beiträge: 4255
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: [CON-358]CMS_TEASER: Keine Sort. nach Veröffentlichungsd

Beitrag von Oldperl » Fr 29. Okt 2010, 09:52

Hallo Oli,

ja mach mal, wobei ich noch überlege ob man beide Functionen (mit/ohne Startartikel) nicht noch zusammenfassen sollte, da sie ja dasselbe machen, bis auf den Param Startartikel. Na mal schaun. :-)

Gruß aus Franken

Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

Gesperrt