Artikel-Autoarchivierung mittels Cronjob
Ziel: Archivieren von Artikeln mit dem ADDON:CRONJOB (nach vorgegeben Zeitraum)
Was wird benötigt:
- MetaInfoFeld: (select) Zur Auswahl des Zeitraums, ab wann archiviert werden soll
- eigene Cronjob Datei (
cronjob.php
) - 2 Kategorien im REDAXO CMS: News + News-Archiv (wobei die Kategorienamen frei gewählt werden können!)
Schritt-für-Schritt-Anleitung
-
Werden die beiden Kategorien im REDAXO CMS angelegt:
- Kategorie: "News"
- Kategorie: "News-Archiv"
-
Im Addon
Meta Infos
unterArtikel
ein neues Feldarchive_period
einfügen:Spaltenname: archive_period Feldbezeichnung: Archivieren nach Zeitraum (Tagen) ausgehend vom Erstelldatum: Feldtyp: select Parameter: 0:nicht archivieren|7:7|14:14|30:30|60:60|90:90 In allen Kategorien verfügbar: Neine (abgehakt) Nur in folgenden Kategorien verfügbar: News, News-Archiv
Nun könnt Ihr ein paar Test-Artikel in der Kategorie "News" anlegen und den jeweiligen Zeitraum in der gerade erstellten MetaInfo-Selectbox, unterschiedlich einstellen (rein zum testen)
-
Datei
cronjob.php
anlegen und im CMS Dateisystem ablegenIn diesem Beispiel wird das
project
-Addon verwendet. In demproject
-Addon (redaxo/src/addons/project/) eine Datei (cronjob.php) in das Unter-Verzeichnis /lib/ erstellen bzw. hochladen. Info: Die Datei muss nicht zwingend cronjob.php lauten. Wird aber i.R. so auch bei anderen Addons verwendet. -
Im
project
-Addon in der /lib/cronjob.php
wird der Code für den eigenen CRONJOB eingefügt:Als erstes extenden wir die CLASS rex_cronjob und vergebn hier den erweiterten CLASS-Name an
class rex_cronjob_archive_status extends rex_cronjob { }
Dann werden die benötigten Methoden der rex_cronjob eingefügt. Folgende Methoden werden benötigt:
execute()
: Das eigentliche Script, was ausgeführt werden sollgetTypeName()
: Bezeichnung des CronJobScripts in der Auswahl des AddOns:CronjobgetParamFields()
: Hier können weitere Felder dem CronJob im backend hinzugefügt werden
In diesem Beispiel werden 3 ParamFields an den CRONjob hinzugefügt:
- LINK-Auswahl "News Artikel/Kategorie"
- LINK-Auswahl "News-Archiv Artikel/Kategorie"
- CHECKBOX - mail an Admin versenden (ja/nein)
Was passiert in dem Script
Im ersten Abschnitt wird überprüft ob das
MetaInfo
-Feldart_archive_period
vorhanden ist. Wenn ja gehts weiter, wenn nein wird ein Fehler ausgegeben.Im zweiten Schritt wird das eigentlich Vorhaben (Artikel zu archivieren) abgehandelt. Am Ende des Scripts (
getParamFields
) werden die zusätzlichen Felder für Link-Auswahl (News, News-Archiv, Mail Checkbox) in einem Array() definiert.Info: Diversen Typen (type) können dafür verwendet werden:
- text
- textarea
- media
- medialist
- link
- linklist
- select
- checkbox
- radio
Beispiel type
text
'label' => 'Die URL', 'name' => 'url', 'type' => 'text', 'default' => 'http://',
Beispiel type
select
'label' => rex_i18n::msg('search_it_generate_actions_title'), 'name' => 'action', 'type' => 'select', 'options' => [ 1 => rex_i18n::msg('search_it_generate_full'), 2 => rex_i18n::msg('search_it_generate_columns'), 3 => rex_i18n::msg('search_it_generate_articles')], 'default' => '1', 'notice' => rex_i18n::msg('search_it_generate_actions_title')
-
Der komplette Code der cronjob.php (
redaxo/src/addons/project/lib/cronjob.php
)<?php class rex_cronjob_archive_status extends rex_cronjob { public function execute() { $metaInfoField_Select = 'art_archive_period'; $sql = rex_sql::factory(); $sql->setQuery(' SELECT name FROM ' . rex::getTablePrefix() . 'metainfo_field WHERE name="'.$metaInfoField_Select.'" '); $rows = $sql->getRows(); if ($rows < 1) { if ($rows == 0) { $msg = 'Metainfo field "' . $metaInfoField_Select . '" not found'; } $this->setMessage($msg); return false; } $newsArticleCategoryId = $this->getParam('newsid'); $newsArchiveCategoryId = $this->getParam('newsarchiveid'); $time = time(); $sql->setQuery(' SELECT id, clang_id, createdate, parent_id, '.$metaInfoField_Select.' FROM ' . rex::getTablePrefix() . 'article WHERE parent_id = '.$newsArticleCategoryId .' AND '.$metaInfoField_Select.' != "" AND status = 1'); $rows = $sql->getRows(); if($rows > 0) { for ($i = 0; $i < $rows; ++$i) { if ($sql->getValue($metaInfoField_Select) == 0) { # mach nichts; } else { $createDate = strtotime($sql->getValue('createdate')); $archiveTime = $createDate + ($sql->getValue($metaInfoField_Select) * 24 * 60 * 60); if ($time >= $archiveTime) { rex_article_service::moveArticle($sql->getValue('id'), $sql->getValue('parent_id'), $newsArchiveCategoryId); } } $sql->next(); } $this->setMessage('Updated articles: ' . $rows ); if ($this->getParam('sendmail') == '|1|') { mail(rex::getErrorEmail(), "REDAXO CMS CRONJOB - Artikel-Archiv-Status", "Der REDAXO CMS CRONJOB 'Artikel-Archiv-Status' wurde ausgeführt! (" . rex::getServer() . ")"); } return true; } else { $this->setMessage("Keine Artikel für das Archiv gefunden!"); return true; } } public function getTypeName() { return 'Artikel-Archiv-Status'; } public function getParamFields() { $fields = [ [ 'label' => 'News Kategorie', 'name' => 'newsid', 'type' => 'link', 'notice' => 'Artikel/Kategroie-ID zu den News mit dem MetaInfoFeld: art_archive_period', ], [ 'label' => 'Archiv Kategorie', 'name' => 'newsarchiveid', 'type' => 'link', 'notice' => 'Artikel/Kategroie-ID zum Archiv mit dem MetaInfoFeld: art_archive_period', ], [ 'name' => 'sendmail', 'type' => 'checkbox', 'options' => [1 => 'E-Mail Benachrichtgung erhalten'], 'notice' => 'Die Nachricht wird an die im <a href="index.php?page=system/settings">System</a> hinterlegte Admin E-Mail Adresse gesendet ('.rex::getErrorEmail().')' ] ]; return $fields; } } ?>
-
Im project-Addon in der
boot.php
noch folgenden Code einfügen um das Script noch am AddOn-CRONJOB zu registrierenif (rex_addon::get('cronjob')->isAvailable() && !rex::isSafeMode()) { rex_cronjob_manager::registerType('rex_cronjob_archive_status'); }
Neuen CronJob im AddOn anlegen
Nun sollte im AddOn:CRONJOB (im redaxo Backend -> neue Cronjob erstellen (+) ) in der Auswahl der gerade erstellte CRONJOB "Artikel-Archiv-Status stehen.
Fertig