Bug: function conMoveArticles()

emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Bug: function conMoveArticles()

Beitrag von emergence »

contenido 4.4.x - (vermutlich auch CVS_HEAD)
in contenido/includes/functions.con.php

folgendes hab ich durch zufall gefunden:

Code: Alles auswählen

		$sql = "UPDATE ".$cfg["tab"]["cart_lang"]." SET online = 0 WHERE idartlang = " . $db->f("idartlang");
sollte

Code: Alles auswählen

		$sql = "UPDATE ".$cfg["tab"]["art_lang"]." SET online = 0 WHERE idartlang = " . $db->f("idartlang");
sein...

$cfg["tab"]["cart_lang"] gibts nicht...

die andere sache, bei:

Code: Alles auswählen

	/* Set all articles which are in between of our start/endtime to online */
	$sql = "SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE NOW() > datestart AND NOW() < dateend AND online = 0 AND timemgmt = 1";
	
	$db->query($sql);
	
	while ($db->next_record())
	{
		$sql = "UPDATE ".$cfg["tab"]["art_lang"]." SET online = 0 WHERE idartlang = " . $db->f("idartlang");
		$db2->query($sql);
	}
sollte der status nicht auf online = 1 gesetzt werden (beim update) ?
sicher bin ich mir dabei aber nicht...

sollte die on offline schaltung nicht in die function conFlagOnOffline() verschoben werden... (dann hätte die funktion wenigstens ihren namen nicht umsonst...)
Zuletzt geändert von emergence am Fr 19. Mär 2004, 18:38, insgesamt 1-mal geändert.
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

ja, ist im CVS schon gefixt
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

nur so aus neugierde...
hast du jetzt alle 3 änderungen gemacht ?
ansonsten sehe ich es eh im snapshot...
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

jup, sollte.
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

na ja einen hätt ich noch

Code: Alles auswählen

	/* Set all articles after our endtime to offline */
	$sql = "SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE NOW() > datestart AND NOW() < dateend AND online = 0 AND timemgmt = 1";
sollte

Code: Alles auswählen

	/* Set all articles after our endtime to offline */
	$sql = "SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE NOW() > dateend AND timemgmt = 1";
sein...

ich glaube damit stimmt die abfrage dann wirklich... ;-)
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

ich habe das ding komplett umgebaut, schau dir erstmal das im snapshot an
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

alles klar...

ähm genau da gibts ja so die nette geschichte das der code in der con_code nicht mit aktualisiert wird, beim verschieben der artikel
createcode sollte man noch auf 1 setzen....
ist das auch mit drin ?

schönen abend noch...
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

hab mir das jetzt im snapshot angesehen...
wenn ich das richtig verstanden habe wird in der
function conFlagOnOffline()

werden beim ersten query alle artikel die innerhalb des bereiches liegen online geschalten... also WHERE NOW() > datestart AND NOW() < dateend
ist ok...

beim zweiten -> WHERE NOW() > datestart AND dateend = '0000-00-00 00:00:00'
versteh ich auch noch...

beim dritten ist es mir nicht mehr klar... warum bei WHERE NOW() > dateend AND dateend != '0000-00-00 00:00:00'
die artikel ebenso online geschalten werden... sollte das hier noch auf offline gesetzt werden ?

und bei
function conMoveArticles()
werden die artikel vor datestart und nach dateend offline geschalten...
ist okay -> hätt ich aber ebenfalls in die conFlagOnOffline verschoben

die conMoveArticles sollte ja nur mehr den code für die verschiebung beinhalten...

ach ja beim update query für die $cfg["tab"]["cat_art"] in der conMoveArticles sollte noch ein ,createcode = '1' ergänzt werden...
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

irgendwie sind mir die abfragen eine spur zu kompliziert...

also in der conFlagOnOffline würde es reichen alle artikel vor datestart offline zu setzen also mittels:

Code: Alles auswählen

SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE NOW() < datestart AND timemgmt = 1
und alle nach datestart online...

Code: Alles auswählen

SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE NOW() > datestart AND timemgmt = 1
alle nach dem endzeitpunkt sollten mittels

Code: Alles auswählen

SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE NOW() > datestart > dateend AND timemgmt = 1
selektiert werden...

die letzte abfrage sollte bei der
function conMoveArticles()
ebenso verwendet werden...
ich schätze mal die abfragen dürfen somit keinen sonderfall übersehen...
ein onlineschalten bei artikel bei denen nur datestart definiert ist funktioniert ebenso...
momentan wäre es so das alle artikel bei denen keine endzeit eingetragen wurde, automatisch offline bleiben...

die andere sache die mich ein wenig irritiert... bei function conMoveArticles()

sollte bei dem ersten update nach
/* Perform after-end updates */
bereits die zeitsteuerung deaktiviert werden... dies wird sonst nur gemacht wenn time_online_move = 1 ist...

was meinst du dazu ?
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

nein, leider ist es nicht ganz so einfach...ich hab da selbst an den neuen Abfragen mehrere Stunden gesessen, bin aber noch nicht ganz zufrieden. Liegt aber auch daran, daß es keinen Prozess für die Zeitsteuerung gibt...
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

emergence hat geschrieben: bereits die zeitsteuerung deaktiviert werden... dies wird sonst nur gemacht wenn time_online_move = 1 ist...

was meinst du dazu ?
habe ich gerade eingebaut. Ich bin mir aber nicht sicher, ob das jetzt alle Fälle abdeckt :)
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

timo hat geschrieben:nein, leider ist es nicht ganz so einfach...ich hab da selbst an den neuen Abfragen mehrere Stunden gesessen, bin aber noch nicht ganz zufrieden.
ich hab damit auch meinen sonntag nachmittag verbracht... sich in die queries reinzudenken ist wirklich nicht so einfach...

deshalb dachte ich mir mach die queries wieder einfacher...

bei der on offline schaltung zu kontrollieren ob dateend korrekt eingetragen ist hat mir einfach nicht gefallen...
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

also nochmal zusammengefasst:

1. alle artikel vor datestart sollen offline bleiben
2. alle artikel nach der datestart sollen online gestellt werden...
3. alle artikel wo datestart < dateend < now() sollen offline gestellt werden

oder hab ich da was übersehen... ?

bei movearticle

1. alle artikel wo datestart < dateend < now() und time_move_cat = 1
sollen erst hier verschoben und upgedatet werden...

sonderfälle:
wo dateend nicht gesetzt wurde bleiben online
wo datestart nicht gesetzt wurde sollen ab dateend offline gesetzt werden...

die frage jetzt dabei ist ab welchem zeitpunkt muss das timemanagment deaktiviert werden...
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

Ich habe mir dazu noch ein paar Gedanken gemacht:
emergence hat geschrieben: 1. alle artikel vor datestart sollen offline bleiben
1. Vorraussetzung datestart ist gesetzt: Alle Artikel vor datestart sollen unberücksichtigt bleiben, egal ob sie on- oder offline sind.
2. alle artikel nach der datestart sollen online gestellt werden...
Ja, sofern datestart gesetzt ist.
3. alle artikel wo datestart < dateend < now() sollen offline gestellt werden
3. Alle Artikel sollen online gestellt werden, wenn now() > dateend und dateend gesetzt ist? Eine Prüfung auf datestart bräuchte man da eigentlich nicht, oder?

Ist "move" aktiv, muß der Artikel verschoben werden. Ist "make online after move" nicht gesetzt, wird der Artikel wieder offline gestellt, ansonsten nicht.

move und make online after move werden ignoriert wenn kein Enddatum aktiv ist.

Soweit alles richtig?
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

:oops: das hab ich noch gar nicht gepostet

die oben genannte variante hab ich schon umgesetzt...
damit ersparst du dir hoffentlich weitere denkarbeit ;-)

Code: Alles auswählen

/**
 * Set articles on/offline for the time management function
 *
 * @param none
 *
 * @author Timo A. Hummel <Timo.Hummel@4fb.de>
 * @copyright four for business AG 2003
 */
function conFlagOnOffline()
{
    global $cfg;
    $db = new DB_Contenido;
    $db2 = new DB_Contenido;

    /* Set all articles which are before our starttime to offline */
    $sql = "SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE NOW() < datestart AND timemgmt = 1";

    $db->query($sql);

    while ($db->next_record())
    {
        $sql = "UPDATE ".$cfg["tab"]["art_lang"] ." SET online = 0 WHERE idartlang = ".$db->f("idartlang");
        $db2->query($sql);
    }

    /* Set all articles which are in between of our start/endtime to online */
    $sql = "SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE NOW() > datestart AND NOW() < dateend AND online = 0 AND timemgmt = 1";

    $db->query($sql);

    while ($db->next_record())
    {
        $sql = "UPDATE ".$cfg["tab"]["art_lang"]." SET online = 1 WHERE idartlang = " . $db->f("idartlang");
        $db2->query($sql);
    }

    /* Set all articles after our endtime to offline */
    $sql = "SELECT idartlang FROM ".$cfg["tab"]["art_lang"]." WHERE NOW() > dateend AND dateend != '0000-00-00 00:00:00' AND timemgmt = 1";

    $db->query($sql);

    while ($db->next_record())
    {
        $sql = "UPDATE ".$cfg["tab"]["art_lang"]." SET online = 0 WHERE idartlang = " . $db->f("idartlang");
        $db2->query($sql);
    }

}


/**
 * Move articles for the time management function
 *
 * @param none
 *
 * @author Timo A. Hummel <Timo.Hummel@4fb.de>
 * @copyright four for business AG 2003
 */
function conMoveArticles()
{
    global $cfg;
    $db = new DB_Contenido;
    $db2 = new DB_Contenido;

    /* Perform after-end updates */
    $sql = "SELECT idartlang, idart, time_move_cat, time_target_cat, time_online_move FROM ".$cfg["tab"]["art_lang"]." WHERE NOW() > dateend AND dateend != '0000-00-00 00:00:00' AND timemgmt = 1";

    $db->query($sql);

    while ($db->next_record())
    {
        $sql = "UPDATE ".$cfg["tab"]["art_lang"]." SET timemgmt = 0, online = 0 WHERE idartlang = ".$db->f("idartlang");
        $db2->query($sql);
        if ($db->f("time_move_cat") == "1")
        {
            $sql = "UPDATE ".$cfg["tab"]["cat_art"]." SET idcat = ".$db->f("time_target_cat") . ",createcode = '1' WHERE idart = " . $db->f("idart");
            $db2->query($sql);

            if ($db->f("time_online_move") == "1")
            {
                $sql = "UPDATE ".$cfg["tab"]["art_lang"] ." SET online = 1 WHERE idart = ".$db->f("idart");
            } else {
                $sql = "UPDATE ".$cfg["tab"]["art_lang"] ." SET online = 0 WHERE idart = ".$db->f("idart");
            }
            $db2->query($sql);
        }
    }

}
ich setzt das jetzt ca. seit 6 monaten ein... bis jetzt ist mir da noch kein weiterer bug aufgefallen...
*** make your own tools (wishlist :: thx)
Gesperrt