Wie wende ich Chains an?

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
matt.loker
Beiträge: 203
Registriert: Mo 7. Mai 2007, 09:05
Kontaktdaten:

Wie wende ich Chains an?

Beitrag von matt.loker » Do 13. Okt 2016, 16:33

Hallo Liebe Community!
Ich arbeite schon länger mit Contenido aber zum ersten Mal traue ich mich an den Einsatz von Chains. Jedoch versteh ich nicht wie ich damit arbeiten muss.

Als Beispiel:
Ich muss vor dem Laden einer Website eine Datenbankabfrage starten (bisher hätte ich die Abfrage hart reingecoded aber ich will mich ja weiterentwickeln :D).Dafür eignet sich die Contenido.Frontend.AfterLoadPlugins gut (besser wäre eine Chain bevor die Plugins geladen wurden aber nicht weite tragisch). Hier hört es dann auch schon auf bei mir. Was ich mich frage:
Wo schreibe ich meine Datenbankabfrage rein - in eine eigene PHP-Datei oder in einem Modul?
und wie musss ich hier vorgehen?

Mir fehlt hier irgendwie der Einstieg. Ich würde mich freuen wenn Ihr Tipps für mich hättet.

Vielen Dank
Matt

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Wie wende ich Chains an?

Beitrag von Faar » Do 13. Okt 2016, 18:25

Oldperl fragen, der weiß einfach alles. 8)
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Re: Wie wende ich Chains an?

Beitrag von rethus » Fr 14. Okt 2016, 06:53

Wenn die AfterLoadPlugins nicht so 100% passt, ist es besser deine eigene Chain hinzuzufügen.

1) Erstellen die Funktion:
In /contenido/includes/chains/ sollte nun eine Datei liegen, die deine Funktion enthält ( include.chain.frontend.AfterLoad.php).
Könnte so aussehen:

Code: Alles auswählen

<?php
defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
function cecAfterPageLoad($db, $nothingAtAll)
{
// hier die ganze logik für die externe DB Abfrage.
    $data =  "I do :".$nothingAtAll;
    return $data;
}
?>
2) die Datei config.chains.load.php fügst du deine gewünschte Chain hinzu, damit diese geladen wird:

irgendwo nach $_cecRegistry = cApiCecRegistry::getInstance();:

Code: Alles auswählen

$_cecRegistry->addChainFunction('Contenido.Frontend.AfterPageLoad', 'cecAfterPageLoad');
 
Dies bewirkt, dass wenn immer AfterPageLoad getriggert wird, deine Funktion aufgerufen wird.

Damit kommen wir zu :

3.)die chain triggern.
Das kannst du entweder irgendwo im Core-Code oder in einem Modul tuen, das direkt als erstes geladen wird:

Code: Alles auswählen

$_cecIterator = cRegistry::getCecRegistry()->getIterator('Contenido.Frontend.AfterPageLoad');
if ($_cecIterator->count() > 0) {
    while (false !== $chainEntry = $_cecIterator->next()) {
        $businessName = $chainEntry->execute($db, "Nothing");
    }
}

Rückwärts aufgezäumt zum Verständnis:
alles was bei $chainEntry->execute in deinem Modul übergeben wird (Anzahl und Beschaffenheit der Parameter) bestimmst du durch deine Funktion cecAfterPageLoad selber. Überall dort wo du den Code unter 3. einfügst, wird die Chain getriggert.
In der config.chains.load.php legst du eigentlich nur fest, welche Chain geladen werden soll, und wie die Funktion für die chain heißt.

Thats it!
Ich hoffe das war soweit verständlich?!
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType

Oldperl
Beiträge: 4250
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: Wie wende ich Chains an?

Beitrag von Oldperl » Fr 14. Okt 2016, 10:11

Servus,
Faar hat geschrieben:Oldperl fragen, der weiß einfach alles. 8)
Ähm *hüstel* - Alles ist relativ. Zumindest kenne ich mich im CONTENIDO Core ein wenig aus. :)
Trotzdem vielen Dank für die Blumen! :mrgreen:
rethus hat geschrieben:Thats it!
Das war es dann wirklich! Mal abgesehen davon das rethus hier aufzeigt wie man den Core mit einer Chain erweitert, was so in meinen Augen gar nicht die Frage war, ist diese Änderung dann jeweils beim Update des Systems neu einzubauen da sie beim Update jedes Mal überschrieben wird. Grundsätzlich sollte man bei der Verwendung einer CHAIN auf die vorhandenen zurückgreifen. Muss es wirklich ein eigener Zugriffspunkt sein, so böte sich in diesem Falle der Einbau dieser Chain in einer lokalen Konf-Datei an. Für eine Modifikation von Daten über eine vorhandene CHAIN würde ich persönlich ein Plugin nutzen.
Btw, es hätte sicherlich auch ein Link auf die entsprechende Doku zu CHAINs gereicht :arrow: https://docs.contenido.org/display/CONDEVE/Chain
Zur Verwendung gibt es auch für 4.8 etwas, gilt aber analog noch bei 4.9 :arrow: http://forum.contenido.org/viewtopic.php?t=22494

Aber nochmal zum Anfang. Wenn ich das richtig verstehe wird eine Möglichkeit gesucht eine eigene DB-Abfrage bereits vor dem Laden anderer Seitenbestandteile auszuführen. Da es dafür mehrere Möglichkeiten gibt sich in den Ablauf einzuklinken, müßte man zuerst einmal den benötigten IST-Zustand des Systems haben
  • Was soll wann modifiziert bzw. abgefragt werden?
  • Welche Core-Bestandteile müssen dazu schon geladen sein?
  • Wird die Funktion nur im Front, im Backend oder bei Beiden benötigt?
Eigene Funktionen kann man nämlich über mehrere Wege integrieren, beispielsweise
  • Einbinden einer eigenen Datei per lokaler Konfigurationsdatei
  • Nutzung vorhandener "Hooks", in Contenido von CHAINs
  • Einbindung in Form eines Modules (nur für Frontend-Erweiterungen
  • Einbindung in Form eines Plugins
  • nur im absoluten Notfall - Modifikation des CONTENIDO-Core (immer gut dolumentieren)
matt.loker hat geschrieben:Dafür eignet sich die Contenido.Frontend.AfterLoadPlugins gut (besser wäre eine Chain bevor die Plugins geladen wurden aber nicht weite tragisch).
Es gibt aktuell keine CHAIN davor. Die einzige Möglichkeit bleibt hier entweder ein Plugin welches an 1. Stelle geladen wird, oder die Einbindung über die lokale Konfig-Datei des Systems, da diese bereits in der includes/startup geladen wird.

Ich hoffe ich konnte mit diesen Hintergrund-Infos ein wenig weiter helfen. Wer Hilfe bei der Umsetzung in CONTENIDO benötigt kann mich gerne (kostenpflichtig) kontaktieren.

Gruß aus Franken

Ortwin
Zuletzt geändert von Oldperl am Fr 14. Okt 2016, 10:41, insgesamt 1-mal geändert.
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Re: Wie wende ich Chains an?

Beitrag von rethus » Fr 14. Okt 2016, 10:31

Oldperl hat geschrieben:Servus,

Das war es dann wirklich! Mal abgesehen davon das rhetus hier aufzeigt wie man den Core mit einer Chain erweitert, was so in meinen Augen gar nicht die Frage war, ist diese Änderung dann jeweils beim Update des Systems neu einzubauen da sie beim Update jedes Mal überschrieben wird.
Man schreibt rethus mit h hinter dem t -soviel Zeit muss sein :!:

Nun ja, ich sehe das jetzt nicht so...:
Es ist keine Core-Erweiterung, die ich beschrieben habe, sondern das allgemeine Prozedere mit Chains. Ich erwähne ja, das man die im Core, oder in einem Modul einhängen könnte. (Vom Core ist - wie von oldperl richtig angemerkt - nur anzuraten, wenn das auch in künftige Releases vom Core-Team übernommen wird. Eigenimplementierungen sollten Upgrade-Save sein, oder gut dokumentiert sein.

Vielleicht nochmal zur Verdeutlichung:
  1. Anstatt die Chain-Datei in contenido/include/chains abzulegen könnte er es auch in seinem Modul ablegen, und via include verfügbar machen. Aber selbst wenn das nicht gehen würde.. bei einem Upgrade eine Chain-datei rüber zu kopieren... das ist doch kein Aufwand?!
  2. Den Chainload sehe ich auch nicht als Problem, da ein Upgrade /data/config/production/config.chains.load.php nicht überschreibt. Will man 1000% Nummer-Sicher gehen, packt man den addChainFunction-Befehl mit ins Modul anstatt in die Config.
  3. Packt er wie von mir empfohlen den Trigger für die Chain (punkt 3 in meiner Beschreibung) nicht in den Core (wovon ich übrigens auch abrate), sondern ins Modul, ist auch hier kein Problem bei upgrades.
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType

Oldperl
Beiträge: 4250
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: Wie wende ich Chains an?

Beitrag von Oldperl » Fr 14. Okt 2016, 11:18

rethus hat geschrieben:Man schreibt rethus mit h hinter dem t -soviel Zeit muss sein :!:
Bleib mal locker! :P
Manchmal sind meine Finger einfach schneller wie meine Tastatur (oder umgekehrt)... :mrgreen:
Hab das aber gerne korrigiert! 8)
rethus hat geschrieben:Es ist keine Core-Erweiterung, die ich beschrieben habe...
rethus hat geschrieben:Das kannst du entweder irgendwo im Core-Code...
:roll:

Aber wie auch immer, ich drück mich ja auch nicht immer so klar aus, also, nochmal zum Mitschreiben:
CORE = Pfui - wegen Updates :!: :wink:
rethus hat geschrieben:
  1. Anstatt die Chain-Datei in contenido/include/chains abzulegen könnte er es auch in seinem Modul ablegen, und via include verfügbar machen. Aber selbst wenn das nicht gehen würde.. bei einem Upgrade eine Chain-datei rüber zu kopieren... das ist doch kein Aufwand?!
Das hat nichts mit dem Aufwand zu tun! Zum Einen kommt es drauf an wie man sein Update/Upgrade macht (Dateien überschreiben oder Löschen und neu Hochladen) und zum Anderen WER es macht. Ich habe leider in letzter Zeit häufiger Systeme gesehen - sowohl CMS aber auch Shops - bei denen viele individuelle Modifikationen gemacht wurden. Zumeist sind diese aber gar nicht oder nur sehr unzureichend dokumentiert. Gerade in solchen Momenten wäre es hilfreich wenn sich die "alten" Entwickler beim Pimpen des Systems zumindest an ein paar grundlegende Regeln gehalten hätten. Und dazu gehört in meinen Augen, dass man nicht eigene Dateien einfach irgendwo in den Core-Verzeichnissen ablegt, sondern dazu beispielsweise ein eigenes Plugin zum Einbinden nimmt, oder die dafür vorhandenen Ablageorte.
rethus hat geschrieben:
  1. Den Chainload sehe ich auch nicht als Problem, da ein Upgrade /data/config/production/config.chains.load.php nicht überschreibt. Will man 1000% Nummer-Sicher gehen, packt man den addChainFunction-Befehl mit ins Modul anstatt in die Config.
  2. Packt er wie von mir empfohlen den Trigger für die Chain (punkt 3 in meiner Beschreibung) nicht in den Core (wovon ich übrigens auch abrate), sondern ins Modul, ist auch hier kein Problem bei upgrades.
Das stimmt auch nicht, denn werden bei einem Update/Upgrade CHAINs hinzu gefügt, so wird sogar empfohlen diese Dateien auszutauschen. Eine eigene CHAIN sollte man daher grundsätzlich entweder per lokaler Konfigurations-Datei oder per Plugin-Konfiguration einbinden. Möchte man wirklich in den Core-Konfigurations-Dateien ändern, dann sollte man aber zumindest eine eigen Umgebung (Enviroment) dafür wählen, so dass des im Core vorhandene Verzeichnis 'production' nicht genutzt wird bzw. einen anderen Namen hat.
Eine Ablage der CHAIN-Einbindung im Modul beschränkt die Anwendung der CHAIN dann auch ausschließlich auf das Frontend und schließt die entsprechende CEC-Funktion von der Anwendung im Backend oder in Plugins komplett aus.

Vielleicht wäre es ja mal eine Idee hier entsprechende Entwickler-Vorgaben auszuarbeiten, die den Umgang für solche Fälle regeln, Anwendungsfälle aufzeigen und das eine oder andere Tutorial enthalten.

Gruß aus Franken

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

matt.loker
Beiträge: 203
Registriert: Mo 7. Mai 2007, 09:05
Kontaktdaten:

Re: Wie wende ich Chains an?

Beitrag von matt.loker » Do 20. Okt 2016, 09:22

Hallo zusammen! Sorry für die späte Rückmeldung.

Vielen lieben Dank rethus und Oldperl. Das war der Fehlende Einsteig. Ich werd in den nächsten Tagen gleich mal versuchen ob ich es auch praktisch verstanden habe :)

Grüße
matt

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Re: Wie wende ich Chains an?

Beitrag von rethus » Do 20. Okt 2016, 11:45

Bitte gern.
Wenns irgendwo harkt, einfach hier weiter nachfragen. :wink:
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType

matt.loker
Beiträge: 203
Registriert: Mo 7. Mai 2007, 09:05
Kontaktdaten:

Re: Wie wende ich Chains an?

Beitrag von matt.loker » Do 8. Dez 2016, 19:11

Ich wollte euch auch nochmal Rückmeldung geben.

Zu Beginn bin ich absolut nicht zurecht gekommen mit den Chains. Deine Lösung mit der eigenen Chain @rethus hat mich zu Begin sogar völlig aus dem Konzept gebracht. Aber manchmal brauchen Dinge etwas Zeit um zu reifen. In einem anderen Post, bei dem ich aktuell um Hilfe gebeten habe (http://forum.contenido.org/viewtopic.php?f=98&t=36979), war ich wieder gezwungen mir die Chains anzuschauen. Nach dem ich mir in diesem Post nochmal eure Rückmeldungen (@rethus und Oldperl) durchgelesen habe ist doch tatsachlich bei mir der Groschen gefallen und ich hab Licht am Ende des Tunnels gesehen :).

Auch wenn ich mein Problem doch nicht über Chains gelöst habe, bin ich mega Happy dass ich endlich kappiert habe wie ich diese einzusetzen hab :). Vielen Dank euch beiden.

Grüße
Matt

PS: Vielleicht hilft es dem ein oder anderen der/die vor dem gleichen Problem steht. Mit hat dieser Link an einem gewissen Punkt sehr geholfen http://api.contenido.org/con490/class-cApiCecHook.html

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Re: Wie wende ich Chains an?

Beitrag von rethus » Sa 10. Dez 2016, 11:55

Bitte gerne, und auch danke für dein positives Feedback.
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType

Antworten