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

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
dpf_dd
Beiträge: 151
Registriert: 20. Dez 2007, 14:07

Cronjob: Artikel-Status

19. Jul 2016, 09:17

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

dpf_dd
Beiträge: 151
Registriert: 20. Dez 2007, 14:07

Re: Cronjob: Artikel-Status

5. Sep 2016, 10:31

*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

Benutzeravatar
runstop64
Beiträge: 369
Registriert: 23. Okt 2012, 21:34
Wohnort: Hamburg
Kontaktdaten: Website Facebook Twitter

Re: Cronjob: Artikel-Status

5. Sep 2016, 12:36

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.
Viele Grüße,
Daniel


studio-ahoi.de | Referenzen | Friends Of REDAXO

dpf_dd
Beiträge: 151
Registriert: 20. Dez 2007, 14:07

Re: Cronjob: Artikel-Status

6. Sep 2016, 15:55

Hi runstop64,
vielen Dank für deinen Beitrag, das werde ich dann die Tage mal ausprobieren und hier Feedback geben :)

dpf_dd
Beiträge: 151
Registriert: 20. Dez 2007, 14:07

Re: Cronjob: Artikel-Status

7. Sep 2016, 12:33

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!

Zurück zu „Allgemeines [R4]“