[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
REDAXO Forum • Cronjob: Artikel-Status
Seite 1 von 1

Cronjob: Artikel-Status

Verfasst: 19. Jul 2016, 09:17
von dpf_dd
Hallo Leute,

ich habe mal wieder ein tolles Problem...
Ich verändere den Artikelstatus (online/offline) über einen externen Cronjob, was auch gut funktioniert.

Code: Alles auswählen

<?php
#####################################################################################################
### ZEITSCHALTUNG JE NACH EINSTELLUNG DES ARTIKELS (METAINFO-FELDER "ARTICLE_FROM" / "ARTICLE_TO" ###
#####################################################################################################
### Dokument auf UTF8 einstellen
header('Content-Type: text/html; charset=UTF-8');

class Cronjob{
    ### Container für einzulesende XML-Artikel
    var $onoff = array();
    ### MySQLi connecten
    private $mysqli;
    ### Kontruktor
  public function __construct(MySQLi $mysqli){
    $this->mysqli = $mysqli ;
  }
    ##########################################################################################
    ### PRÜFT, OB DIE AKTUELLE ZEIT ZWISCHEN ZWEI TIMESTAMPS LIEGT
    ##########################################################################################     
    public function isBetween($start = 0, $end = 0){
        $now = time();
        return (
            ($end != 0 && $start != 0 && $end > $now && $now > $start)
                || ($end == 0 && $now > $start)
                || ($start == 0 && $end > $now) 
                || ($start == 0 && $end == 0)
            ) ? 1 : 0;
    }
    ##########################################################################################
    ### LÖSCHT AUTOMATISCH DATENSÄTZE, DIE ÄLTER SIND ALS X TAGE
    ##########################################################################################     
    public function zeitschaltung()
    {    
        $now = time();
        ### SQL-Query
        $query = 'SELECT id, status, art_online_from, art_online_to FROM rex_article WHERE art_online_from > 0 OR art_online_to > 0';
        $result = $this->mysqli->query($query);
        ### Schleife, die jeder selektierte Datensatz durchläuft
        $article = array();
        while($row = $result->fetch_array(MYSQLI_NUM))
        {
            $articles[] = array('id' => $row[0],'status' => $row[1],'online_from' => $row[2],'online_to' => $row[3]);
        }        
        foreach($articles as $article)
        {
            $between = '';
            $between = $this->isBetween($article['online_from'],$article['online_to']);
            ### Wenn $between ungleich $article['status'] => Status in DB ändern
            if($between != $article['status'])
            {
                $query = 'UPDATE rex_article SET status = NOT status WHERE id = '.$article['id'];
                $result = $this->mysqli->query($query);
                echo $this->mysqli->affected_rows;
            }
        }
        $this->mysqli->close();        
        return true;
    }
}
##########################################################################################     
### CRONJOB ZUM AUTOMATISCHEN LÖSCHEN ALTER DATENSÄTZE #############################
##########################################################################################     
### Objekt erstellen und SQL connecten
$mysqli = new MySQLi('localhost','***','***','***');
$artikel = new Cronjob($mysqli);
$artikel = $artikel->zeitschaltung();
?>
Aber irgendwie scheint es noch einen Mechanismus zu geben, der den Cache danach löscht oder sowas???
Mein Cronjob funktioniert jedenfalls tadellos... Er findet die zeitgeschalteten Seite (per Meta-info), stellt den Status der zueghörigen Artikel-ID auf 0 bzw. 1 und im Backend ist die Änderung auch nachvollziehbar.

Der Artikel wird aber einfach nicht "online/offline gestellt" - ich bekomme nach wie vor die 404er-Seite beim Aufruf (ich verwende den SEO42-Offlinemodus, der mir die Seiten auch tatsächlich ausknipst, wenn Sie offline sind...) bzw. die Seite halt noch angezeigt, obwohl die Variable auf 0 steht...

Welche Funktion muss ich also extern noch "nachbauen", damit Redaxo sich korrekt verhält? Könnte mir da mal jemand einen Wink geben?

PS: Ich kann das Redaxo-AddOn "Cronjobs" in diesem Usecase nicht verwenden, da ich dort minimal 1 Stunde als Intervall angeben kann. Ich brauche aber 15 Minuten bzw. manchmal auch minütlich, deswegen ist das AddOn für mich unbrauchbar und ich mache alles extern und außerhalb des Redaxo-Frameworks...

Vielen Dank für Euren Input,
dpf_dd

Re: Cronjob: Artikel-Status

Verfasst: 5. Sep 2016, 10:31
von dpf_dd
*push*

Ich weiß, es ist verpönt - also SORRY fürs Hochholen, aber hier stehe ich immer noch auf dem Schlauch... :roll:

Help anyone?

Vielen Dank und beste Grüße
Stefan / dpf_dd

Re: Cronjob: Artikel-Status

Verfasst: 5. Sep 2016, 12:36
von runstop64
Hi,

die Artikel-Metas werden von Redaxo im Dateisystem gecacht. Bei externen DB-Änderungen musst Du daher den Cache neu generieren lassen. Für den ganzen Cache geht das mit dieser Funktion: https://github.com/redaxo/redaxo4/blob/ ... nc.php#L15 damit wird SEO42 auch dazu gebracht, die Pathlist etc. anzupassen.
Evtl. findest Du in der Datei auch eine Funktion, mit der Du gezielt nur die Artikel neu generieren lassen kannst, die Du änderst, ich weiß allerdings nicht, ob Addons dies dann mitbekommen.

Re: Cronjob: Artikel-Status

Verfasst: 6. Sep 2016, 15:55
von dpf_dd
Hi runstop64,
vielen Dank für deinen Beitrag, das werde ich dann die Tage mal ausprobieren und hier Feedback geben :)

Re: Cronjob: Artikel-Status

Verfasst: 7. Sep 2016, 12:33
von dpf_dd
OK, es gibt Resultate :D
Leider führte dein Vorschlag nicht zur Lösung, da ich diese ganzen Redaxo-Variablen außerhalb des Redaxo nicht zur Verfügung habe. Die von dir genannte aufzurufende Funktion würde funktionieren - aber eben nur im Redaxo-Universum.

Aaaaber ich habe es nun final doch hinbekommen, mir das Redaxo-Cronjob-Addon so anzupassen, dass ich meinen Cronjob auch minütlich abfeuern kann (Standard: minimal stündlich möglich). Da im Cronjob ein "Artikelstatus"-Skript mitgeliefert wird, was tadellos funktioniert, wird einfach dieses Ding jetzt minütlich aufgerufen (und nicht das oben gepostete externe Skript).

Ich muss jetzt nur die Performance im Auge behalten, da minütlich eine DB-Abfrage hinterum stattfindet - aber ansonsten ist das Ziel zu 100% erreicht :) Sehr geil!