Chain: Cache erneuern bei Artikeländerungen

Gesperrt
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Chain: Cache erneuern bei Artikeländerungen

Beitrag von Oldperl »

Hallo Contenidos :)

Diesen Artikel zum Anlass nehmend
:arrow: http://forum.contenido.org/viewtopic.php?f=61&t=31431
habe ich für die CEC von Contenido mal eine neue Chain gebastelt.

Vorgabe:
Für einen "vielschreibenden" Redakteur soll es die Möglichkeit geben die Erneuerung des Eintrages der Artikel im Cache anzustossen um im Frontend immer die aktuelleste Version anzuzeigen.

Überlegungen:
In benanntem Post wird dazu ein komplettes Leeren der con_code über ein FE-Modul welches einen Button nur im Artikeleditor anzeigt vorgeschlagen. IMO hat dieses Vorgehen gerade bei großen Auftritten oder in Mehrmandantensystemen so seine Nachteile und kann dort recht schnell auch zu einer Performancebremse werden.
Besser wäre es wenn nur die entsprechenden geänderten Artikel für eine Erneuerung der con_cache markiert werden. Da diese Möglichkeit bereits automatisiert in Contenido mit dem Flag 'createcode' in der Tabelle con_cat_art genutzt wird und eine CEC beim Speichern von Content (Contenido.Content.SaveContentEntry) vorhanden ist, bietet sich hier eine Chain für Contenido an.

Lösung:
Die hier vorgestellte Chain ermöglicht es über eine Benutzer-, Mandanten- oder Systemeinstellung das Markieren des gerade bearbeiteten Artikels (beim Speichern von Inhalten) für eine Erneuerung des Caches (con_code). Sobald dann für diese Artikel ein Aufruf im Frontend (oder im BE-Edit) erfolgt, wird der Eintrag in der con_code erneuert.

Für einen "Power-Redakteur" muss man dazu nur folgende Benutzereinstellung hinzufügen, wobei ein Entfernen des Eintrages wenn man die Funktion nicht mehr benötigt sinnvoller ist als ein auf false-Setzen.
save_article | clear_cache | [true|false]

Installation:
Das geht kurz und schmerzlos. :wink:
  • Erstelle eine Datei mit dem folgenden Code und dem Namen include.chain.content.set_clear_cache.php in contenido/plugins/chains/includes
  • Öffne die Datei contenido/plugins/chains/includes/config.plugin.php und ergänze diese mit dem 2. Codeschnipsel
  • Fertisch :P
Noch die "Benutzerdefinierte Eigenschaften" angeben und... freuen. :mrgreen:

Freue mich natürlich über Fragen, Anregungen und Verbesserungen. Viel Spaß mit der Chain.

Gruß aus Franken

Ortwin

Datei: include.chain.content.set_clear_cache.php

Code: Alles auswählen

<?php
/**
 * Project:
 * Contenido Content Management System
 *
 * Description:
 * Enables regeneration of con_cache for specific article when article content changes.
 * To enable this chain function you need to set a system-, client- or userproperty
 * 
 * save_article | clear_cache | [true|false]
 * 
 * so you may set it to true for only one power user or something like that.
 *
 * Requirements:
 * @con_php_req 5.0
 *
 *
 * @package    Contenido Backend classes
 * @subpackage Contenido Chain
 * @version    1.0
 * @author     Ortwin Pinke
 * @copyright  DCEonline <www.dceonline.de>
 * @license    http://www.contenido.org/license/LIZENZ.txt
 * @link       http://www.contenido.org
 * @link       http://www.ortwinpinke.de
 * @link       http://forum.contenido.org/viewtopic.php?f=66&t=31432
 *
 * {@internal
 *   created 2011-07-14
 * 
 *   $Id:$
 * }}
 *
 */

if(!defined('CON_FRAMEWORK')) {
	die('Illegal call');
}

/**
 *
 * @param int $idartlang
 * @param int $type
 * @param int $typeid
 * @param string $value
 * @return bool 
 */
function cecContentSetClearCache($idartlang, $type, $typeid, $value) {
    
    $bClearCache = getEffectiveSetting('save_article', 'clear_cache', false);
    
    if($bClearCache) {
        cInclude("classes", "contenido/class.articlelanguage.php");
        $oArtLang = new cApiArticleLanguage();
        if($oArtLang->loadByPrimaryKey($idartlang)) {
            cInclude("classes", "contenido/class.categoryarticle.php");
            $oArtCat = new cApiCategoryArticle();
            if($oArtCat->loadBy('idart', $oArtLang->get('idart'))) {
                $bCreateCode = !$oArtCat->get('createcode');
                if($bCreateCode) {
                    $oArtCat->set('createcode', 1);
                    $oArtCat->store();
                }
            }
        }        
    }
    return $value;
}
?>
Zusatz für config.plugin.php

Code: Alles auswählen

cInclude("plugins", "chains/includes/include.chain.content.set_clear_cache.php");
$_cecRegistry->addChainFunction("Contenido.Content.SaveContentEntry", "cecContentSetClearCache");
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: Chain: Cache erneuern bei Artikeländerungen

Beitrag von Spider IT »

Hallo Ortwin,

sehr elegante Lösung, aber sollte man im Zuge der Upgradefähigkeit nicht lieber die Finger von Systemdateien lassen (hier config.plugin.php)?
Kann man das stattdessen über einen Eintrag in die DB lösen?

Gruß
René
dosenbrot
Beiträge: 102
Registriert: Fr 27. Aug 2004, 15:37
Kontaktdaten:

Re: Chain: Cache erneuern bei Artikeländerungen

Beitrag von dosenbrot »

Und ne weitere Frage: Funktioniert das auch noch mit der 4.8.11 und AMR??? :-)
Danke auch für deine Realisierung!
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Re: Chain: Cache erneuern bei Artikeländerungen

Beitrag von Oldperl »

Hallo René,

danke fürs Lob. :D

Da hast du sicherlich Recht. Es müßte aber auch funktionieren wenn man den entsprechenden Eintrag in eine contenido/includes/config.local.php macht, welche bei einem Update/Upgrade nicht verändert wird. Kommt auf nen Versuch an, hab ich aber noch nicht gemacht.

Gruß aus Franken

Ortwin
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Re: Chain: Cache erneuern bei Artikeländerungen

Beitrag von Oldperl »

dosenbrot hat geschrieben:Funktioniert das auch noch mit der 4.8.11 und AMR??? :-)
Nun, die CEC-Schnittstelle gab es, soviel ich weiß, auch schon in der 4.8.11.
AMR hat damit NULL zu tun, da hier ja keinerlei URL's in Verwendung sind, sondern eine "interne" Contenido-Schnittstelle, eben die CEC, verwendet wird.
Ergo, sollte gehen! :-)
dosenbrot hat geschrieben:Danke auch für deine Realisierung!
Gerne doch 8)

Gruß aus Franken

Ortwin
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: Chain: Cache erneuern bei Artikeländerungen

Beitrag von xmurrix »

Gefällt mir, der Punkt mit den Systemdateien wurde ja schon angesprochen, ansonsten gibt es von meine Seite aus nichts zu meckern ;-)

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
dosenbrot
Beiträge: 102
Registriert: Fr 27. Aug 2004, 15:37
Kontaktdaten:

Re: Chain: Cache erneuern bei Artikeländerungen

Beitrag von dosenbrot »

Hallo Ortwin,

noch nutze ich die Möglichkeit mit dem Button, was dein Ausgangspunkt für die Chain war. Aber du hast recht, bei umfangreichen Seiten kann es wiederum nach dem Löschen zur Bremse werden.

Nun meine Frage zu deiner Chain:
Ich benötige das für eine Nachrichtenseite in Kombination mit der Artikelliste. Macht die Chain dann bei mir überhaupt einen Sinn? Sprich: Wird die Listenansicht, in der die Artikel der Aktualität nach nur angerissen werden und man per "weiter"-Link auf die Detailseite des Artikels kommt, auch mit der Chain aktualisiert oder würde das nur für eine Seite wie Impressum gelten, wenn ich darin etwas ändere?
Ich habe also Sorge, dass die Startseite des gesamten Portals sowie die Listenansicht "News" bei neuen Artikeln nicht aktualisiert werden. Ist meine Sorge berechtigt und gibt es in dem Fall ggf. einen Trick, wie dies dennoch möglich wäre?

Ich freue mich über deine Rückmeldung und sichere auch dir den ein oder anderen Kaffee zu, wenn das mit meiner Seite und meinen Vorstellungen klappen sollte. :-)

Danke und Grüße
Felix
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Re: Chain: Cache erneuern bei Artikeländerungen

Beitrag von Oldperl »

Hallo Felix,

also prinzipiell kann ich die Chain (fast) alles machen lassen. Es kommt halt drauf an was du genau benötigst, entsprechendes integriert man dann halt. Vorteil der Chain ist IMO das man nicht zusätzlich irgendwo klicken muss, sondern das es, hat man den Schalter für den Benutzer gesetzt, automatisch abläuft.

Am Besten du gibst mir konkrete Vorgaben was wann wo und wie aktualisiert werden soll. Artikelteaser z.B. auf einer Inhalts- oder Startseite sollte eigentlich, sobald der Artikel aktualisiert wird und da sie normalerweise dynamisch erzeugt werden, direkt die neuen Inhalte zeigen. Es kann jedoch sein das ein Cachingmechanismus verwendet wird, oder z.B. statische Seite (aus einem Cache) ausgeliefert werden, so wie es oft bei Wordpress konfiguriert wird. Die Chain müßte dann mit diesem Cachingmechanismus entsprechend kommunizieren und eine Aktualisierung bewirken. Dazu müßte ich dann aber wissen was dort eingesetzt wird.

Soweit einmal ohne deine Seite bzw. deinen Bedarf wirklich konkret zu kennen.

Gruß aus Franken

Ortwin
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Re: Chain: Cache erneuern bei Artikeländerungen

Beitrag von Oldperl »

Hallo Felix,

vielen Dank für den Kaffee und viel Spaß mit der Chain. :)
Dabei ist mir dann auch gleich mal aufgefallen das meine Kaffeekasse auf meinem Blog garnicht richtig funktionierte. :wink:
Irgendwie war da der "Schlitz" zu klein. :mrgreen:

Gruß aus Franken

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