PlugIn Manager entwickeln – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self PlugIn Manager entwickeln Fri, 13 Dec 19 19:24:25 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761623#m1761623 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761623#m1761623 <p>moin,</p> <p>Ich möchte einen <em>PlugIn</em>-Manager schreiben.</p> <p>Ich hab lauter Ideen, wie ich spezielle Probleme in jeinem jeweiligen Projekt lösen kann. Dazu muss man eine Art Kern schreiben, der die grundlegenden Dinge abarbeiten kann. Die <em>PlugIns</em> überlassen dann die grundlegende Arbeite dem Kern und knnen sich dann der Lösung widmen. Insofern braucht man nicht für jede Lösung die in einem Projekt realisiert wird, intern einen eigenen Kern schreiben. <em>(Ich hab es in einer App gemacht die seeehr statisch war)</em></p> <p>Ich hab leider im Internet keine Möglichkeit gefunden <em>(Tutor, abstrakte Anleitung)</em> wie man sowas macht. Beispiele gibts genügend <em>(z.B. Drupal)</em>.</p> <p>Einen heranghehensweise habe ich dennoch schon im Kopf. Man benötigt denke ich <em>FS</em>, <em>Fehlerbehandlung</em>, <em>Caches</em> für eine <strong>Manager</strong>.</p> <p>habe ich nowas vergessen?</p> <p>lgmb</p> PlugIn Manager entwickeln Fri, 13 Dec 19 23:36:08 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761630#m1761630 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761630#m1761630 <blockquote> <p>Ich hab leider im Internet keine Möglichkeit gefunden <em>(Tutor, abstrakte Anleitung)</em> wie man sowas macht.</p> </blockquote> <p>…</p> <blockquote> <p>Beispiele gibts genügend <em>(z.B. Drupal)</em>.</p> </blockquote> <p>?</p> <p>... dann studiere doch den <em>Quellcode der Beispiele</em>. Hilfreich dabei sind Debugger (die funktionieren auch bei Code der funktioniert )</p> PlugIn Manager entwickeln Sat, 14 Dec 19 10:12:00 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761635#m1761635 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761635#m1761635 <p>Hallo MB,</p> <p>sprichst Du von Plugins, oder von einem Framework?</p> <p>Von Plugins spricht man, wenn man eine Basis-Anwendung hat, die allein funktionsfähig ist, aber definierte Andockpunkte hat, wo Code hinzugefügt werden kann.</p> <p>Ein Framework kann sich darum kümmern, alle HTTP Requests grundsätzlich entgegen zu nehmen, Objekte für die allgemeine Steuerung zu erzeugen, ggf. auch nach bestimmten Regeln die Requestparameter (GET und POST) zu parsen, zu prüfen und in Objekten abzulegen. Diese Objekte sind Teil des <strong>Modell</strong>s.</p> <p>Über einen Router ermittelst Du dann die Klasse, die für die Verarbeitung des konkreten Requests zuständig ist - den <strong>Controller</strong>. Der Controller erzeugt weitere Modellklassen über Datenbankzugriffe, wobei gerne ein <strong>Repository</strong> zum Einsatz kommt. Und am Schluss erzeugt er eine Objektstruktur, die zusammen mit einem <strong>Template</strong>-Namen als <strong>ViewModel</strong> einer generischen Template-Engine übergeben wird, um die Ausgabe zu rendern.</p> <p>Vertraute Begriffe?</p> <p>Die kommen aus dem Konzept Model - View - Controller (MVC) oder seiner Variante Model - View - ViewModel (MVVM). Wenn Du Futter für deine Konzeption brauchst, mach Dich darüber mal schlau.</p> <p>Es sei denn, das weißt Du alles schon und ich habe dein Anliegen missverstanden.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> PlugIn Manager entwickeln Sat, 14 Dec 19 10:33:20 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761636#m1761636 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761636#m1761636 <p>moin,</p> <blockquote> <p>Ich möchte einen <em>PlugIn</em>-Manager schreiben.</p> <p>Ich hab lauter Ideen, wie ich spezielle Probleme in jeinem jeweiligen Projekt lösen kann. Dazu muss man eine Art Kern schreiben, der die grundlegenden Dinge abarbeiten kann. Die <em>PlugIns</em> überlassen dann die grundlegende Arbeite dem Kern und knnen sich dann der Lösung widmen. Insofern braucht man nicht für jede Lösung die in einem Projekt realisiert wird, intern einen eigenen Kern schreiben. <em>(Ich hab es in einer App gemacht die seeehr statisch war)</em></p> </blockquote> <p>Genau das ist der Sinn einer Vererbung in OOP: Du hast eine Basiklasse (Kern) und eine Klassenerweiterung (Plugin) welche bei Bedarf die Methoden der Basisklasse überschreibt.</p> <p>Leider versteht PHP dies als Klassenerweiterung, also ich finde der Begriff Erweiterung ist falsch. Denn die abgeleitete Klasse in einer solchen Hierarchie erweitert ja nicht sondern spezialisiert (wie Du ja auch feststellst).</p> <p>Eine andere Form dafür kennt PHP als Interface. Es wäre also zu überlegen ob Du Dein Pluginmodell als Interface oder Klassenerweiterung konzipierst.</p> <p>Wie das bei mir ausschaut siehst Du <a href="https://rolfrost.de/routes.htm" rel="nofollow noopener noreferrer">hier.</a></p> <p>MFG</p> PlugIn Manager entwickeln Wed, 18 Dec 19 13:41:35 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761875#m1761875 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761875#m1761875 <blockquote> <p>habe ich nowas vergessen?</p> </blockquote> <p>Es gäbe noch, neben der Möglichkeit der Klassenerweiterung/Vererbung die Möglichkeit Code durch Traits zu erweitern bzw. zu spezialisieren.</p> <p>MFG</p> PlugIn Manager entwickeln Sat, 14 Dec 19 12:34:03 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761647#m1761647 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761647#m1761647 <p>moin,</p> <blockquote> <p>... dann studiere doch den <em>Quellcode der Beispiele</em>. Hilfreich dabei sind Debugger (die funktionieren auch bei Code der funktioniert )</p> </blockquote> <p>Ok ohne Zweifel. Aber es ist mir von der Komplexität her zu anstrengen. Das gibt meine Kapazität bei den anderen Sachen nicht her . Ich kann mich einlassen aber dann muss ich in meinem Leben alles ausbleden und dann bekomme ich es sicherlich hin. Der Aufwand ist mir echt zu groß, also warum nicht Tutorien oder Anleitungen zur Hand nehmen?</p> <p>lgmb</p> PlugIn Manager entwickeln Sat, 14 Dec 19 12:24:34 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761645#m1761645 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761645#m1761645 <p>moin,</p> <blockquote> <p>Von Plugins spricht man, wenn man eine Basis-Anwendung hat, die allein funktionsfähig ist, aber definierte Andockpunkte hat, wo Code hinzugefügt werden kann.</p> </blockquote> <p>Danke ich kennne mich mit dem Design Pattern <em>MVC</em> aus . Hab ja selbst was geschrieben aber es ist mir peinlich es zu präsentieren, weil ich aus dieser Sache mich weioter entwickelt habe.</p> <p>lgmb</p> PlugIn Manager entwickeln Sat, 14 Dec 19 12:42:57 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761650#m1761650 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761650#m1761650 <p>moin,</p> <blockquote> <p>[…] Eine andere Form dafür kennt PHP als Interface. Es wäre also zu überlegen ob Du Dein Pluginmodell als Interface oder Klassenerweiterung konzipierst.</p> </blockquote> <p>Es geht weit aus Komplexer zu. Ich verwende sicherlich <strong>Interface</strong>s auf den <em>PlugIn</em>-Manager bezogen der diese einbindet. Aber <strong>Interface</strong> allein reichen nicht. Jedoch wenn man's simplifiziert, kann ich es mir Vorstellen allein <strong>Interface</strong>s zu verwenden. Aber das wäre dann sehr statisch.</p> <p>lgmb</p> PlugIn Manager entwickeln Sun, 15 Dec 19 11:11:15 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761696#m1761696 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761696#m1761696 <p>Tach!</p> <blockquote> <p>Genau das ist der Sinn einer Vererbung in OOP: Du hast eine Basiklasse (Kern) und eine Klassenerweiterung (Plugin) welche bei Bedarf die Methoden der Basisklasse überschreibt.</p> </blockquote> <p>Nein, wieviele Plugins man am Ende zum Projekt hinzufügen möchte, weiß man zur Entwicklungszeit normalerweise nicht. Für diese unbekannte Anzahl Möglichkeiten je eine Basisklasse bereitzustellen, ist jedenfalls keine gescheite Vorgehensweise. Vererbung ist nicht die Technik, in der man Plugins grundlegend implementiert. Ein Plugin ist üblicherweise ein eigenes Modul, das erst zur Laufzeit hinzugefügt wird und nicht ins Programm hineinkompiliert. Ob dabei Vererbung verwendet wird oder nicht, ist ein Implementierungsdetail.</p> <blockquote> <p>Leider versteht PHP dies als Klassenerweiterung, also ich finde der Begriff Erweiterung ist falsch. Denn die abgeleitete Klasse in einer solchen Hierarchie erweitert ja nicht sondern spezialisiert (wie Du ja auch feststellst).</p> </blockquote> <p>Warum soll das keine Erweiterung sein? Die Grundfunktionalität der Basisklasse wird um spezielle Funktionalität erweitert. Und wenn abstrakte Methoden implementiert werden, ist das zweifellos eine Erweiterung.</p> <blockquote> <p>Eine andere Form dafür kennt PHP als Interface. Es wäre also zu überlegen ob Du Dein Pluginmodell als Interface oder Klassenerweiterung konzipierst.</p> </blockquote> <p>Plugins können auf einer Basisklasse aufbauen oder ein Interface implementieren, aber zwingende Voraussetzung ist das nicht. Die Kommunikation zwischen Basisprogramm und Plugin kann auch über Datenströme erfolgen.</p> <p>dedlfix.</p> PlugIn Manager entwickeln Sat, 14 Dec 19 12:26:53 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761646#m1761646 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761646#m1761646 <p>moin,</p> <blockquote> <p>moin,</p> <blockquote> <p>Von Plugins spricht man, wenn man eine Basis-Anwendung hat, die allein funktionsfähig ist, aber definierte Andockpunkte hat, wo Code hinzugefügt werden kann.</p> </blockquote> </blockquote> <p>Was ist der Unterschied zu <em>PlugIn</em> und <em>Modul</em> gibt es überhaupt unterschiede? Und wenn ja, auf auf Compuzterwissenschafts Ebene oder speziell auf <em>PHP</em> Ebene??? Das würd mich jetzt mal interessieren.</p> <blockquote> <p>Ein Framework kann sich darum kümmern, alle HTTP Requests grundsätzlich entgegen zu neh. […].</p> </blockquote> <p>Danke ich kennne mich mit dem Design Pattern <em>MVC</em> aus . Hab ja selbst was geschrieben aber es ist mir peinlich es zu präsentieren, weil ich aus dieser Sache mich weioter entwickelt habe.</p> <p>lgmb</p> PlugIn Manager entwickeln Sat, 14 Dec 19 12:34:40 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761648#m1761648 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761648#m1761648 <p>Hallo MB,</p> <blockquote> <p>Was ist der Unterschied zu PlugIn und Modul</p> </blockquote> <p>Es ist eine Teilmengenbeziehung. Der Begriff "Modul" ist sehr weit reichend, selbst wenn man nur den Modulbegriff der Softwareentwicklung betrachtet...</p> <p>PlugIns sind spezielle Module, die</p> <ul> <li>die Anforderungen einer speziellen Schnittstelle erfüllen. Diese Schnittstelle wird von der Plugin-fähigen Anwendung festgelegt.</li> <li>sich dynamisch nachladen lassen</li> </ul> <p>Das lässt sich auf tausenderlei Arten implementieren.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> PlugIn Manager entwickeln Sat, 14 Dec 19 12:37:04 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761649#m1761649 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761649#m1761649 <p>moin,</p> <blockquote> <p>PlugIns sind spezielle Module, die [...]</p> </blockquote> <p>supi!!! Dann habe ich es doch Begriffen . Dankeschön für die Auffrischung. Ich meine <em>PlugIns</em>.</p> <p>lgmb</p> PlugIn Manager entwickeln Sat, 14 Dec 19 15:39:46 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761658#m1761658 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761658#m1761658 <p>hi,</p> <p>mit dem was PHP unter Interface versteht konnt ich mich noch nie anfreunden. Von daher implementiere ich mein FW-Interface als eine ganz normale Klassenerweiterung. und seit ich <a href="http://phphtmltemplate.sourceforge.net/" rel="nofollow noopener noreferrer">HTML::Template für PHP</a> entdeckt habe, entwickle ich mein PHP FW mit wachsender Feude. Und natürlich kam ich auch nicht umhin, eine eigene Klassenerweiterung für HTML::Template zu schreiben, genauer gesagt überschreibt die nur den Konstruktor. Und zwar so, daß ein Template auch mal als Plain/Text übergeben werden kann. Z.B. für meine Klasse NotFound:</p> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token comment"># hier steht die Klase</span> <span class="token delimiter important">?></span></span> und hier steht das Template </code></pre> <p>Ansonsten will ja HTML::Template eine Datei haben. Im Übrigen läuft ein Web-Framework stets auf ein Interface hinaus. Ganz einfach deswegen weil die Abläufe in einem Request/Response-Zyklus immer dieselben sind.</p> <p>Viel Spaß noch dabei.</p> PlugIn Manager entwickeln Sat, 14 Dec 19 17:57:13 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761666#m1761666 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761666#m1761666 <p>moin,</p> <blockquote> <p>mit dem was PHP unter Interface versteht konnt ich mich noch nie anfreunden.</p> </blockquote> <p>Ok? Das ist doch gängiges <em>OOP</em> Zeugs mit <strong>Interface</strong>s und <strong>Inheritance</strong>s. Ich hab hier im Forum und bei Tutors gelehnt, das <strong>Interface</strong> eine total feine Sache ist, bezogen auf <em>Design Patterns</em> (z.B. Structure Pattern). Das ist dir doch nicht neu oder verstu ich mich da?.</p> <p>lgmb</p> PlugIn Manager entwickeln Sat, 14 Dec 19 18:37:30 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761669#m1761669 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761669#m1761669 <p>moin,</p> <blockquote> <blockquote> <p>mit dem was PHP unter Interface versteht konnt ich mich noch nie anfreunden.</p> </blockquote> <p>Ok? Das ist doch gängiges <em>OOP</em> Zeugs mit <strong>Interface</strong>s und <strong>Inheritance</strong>s. Ich hab hier im Forum und bei Tutors gelehnt, das <strong>Interface</strong> eine total feine Sache ist, bezogen auf <em>Design Patterns</em> (z.B. Structure Pattern). Das ist dir doch nicht neu oder verstu ich mich da?.</p> </blockquote> <p>Natürlich ist das alles OOP und alles nichts Neues. Nur PHP unterscheidet eben zwischen interface und class. So muß z.B. eine interface-Erweiterung sämtliche Methoden definieren die das Basis-Interface vorschreibt. Eine Klassenerweiterung hingegen definiert nur Methoden die den Anwendungsfall spezialisieren.</p> <p>So überlagert <a href="https://rolfrost.de/ctype.htm" rel="nofollow noopener noreferrer">die hier vorgestellte Klasse</a> nur die control()-Methode. Meine <a href="https://rolfrost.de/man.htm" rel="nofollow noopener noreferrer">NotFound</a> class hingegen hat gar keine control()-Methode und überlagert nur die bodybuild()-Methode weil das Template für den BODY aus einer anderen Quelle geladen wird.</p> <p>Sofern das Template namentlich im file-Attribut genannt ist, lädt bodybuild() (der Basisklasse) automatisch das Template von da und muss in der Klassenerweiterung nicht neu definiert werden.</p> <p>So einfach kann OOP sein </p> PlugIn Manager entwickeln Sat, 14 Dec 19 19:17:35 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761673#m1761673 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761673#m1761673 <p>moin,</p> <p>Ach dawie gerade von Templates sprechen <a href="https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761671#m1761671" rel="noopener noreferrer">Table Constructor</a></p> <p>lgmb</p> PlugIn Manager entwickeln Sat, 14 Dec 19 21:01:21 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761675#m1761675 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761675#m1761675 <p>Hallo pl,</p> <blockquote> <p>So muß z.B. eine interface-Erweiterung sämtliche Methoden definieren die das Basis-Interface vorschreibt.</p> </blockquote> <p>Unter Erweiterung verstehst Du <code>extends</code>, nicht <code>implements</code>, ja? Aber Interfaces können Methoden erben:</p> <pre><code class="block language-php"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">IAnimal</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">move</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">interface</span> <span class="token class-name-definition class-name">IMammal</span> <span class="token keyword">extends</span> <span class="token class-name">IAnimal</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">move</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// unnötig!</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">cry</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Oder sowas hier?</p> <pre><code class="block language-php"><span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">Animal</span> <span class="token keyword">implements</span> <span class="token class-name">IAnimal</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">move</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Hä? Wie geht das?<br>"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">Cat</span> <span class="token keyword">extends</span> <span class="token class-name">Animal</span> <span class="token keyword">implements</span> <span class="token class-name">IMammal</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">move</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Tapp Tapp Tapp<br>"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">cry</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Miau<br>"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>An dieser Stelle ist es interessant, ob man IAnimal::move in IMammal wiederholt hat oder nicht. Hat man es getan, dann verlangt PHP vor 5.3 die move-Methode in der Cat-Klasse. Hat man es <strong>nicht</strong> getan, dann kann Animal::move von Cat geerbt werden. Cat kann aber auch selbst move implementieren und Animal::move überschreiben.</p> <p>Das älteste Förmchen, das ich im <a href="http://sandbox.onlinephpfunctions.com/" rel="nofollow noopener noreferrer">Sandkasten</a> gefunden habe, ist PHP 5.0.4. Auch damit funktionierte das. Es gibt da auch noch PHP 4 Versionen, aber da sich die OOP-Implementierung von PHP 4 auf 5 stark geändert hat, compilierte der obige Code damit nicht und es ist heute auch nicht mehr relevant.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> PlugIn Manager entwickeln Sun, 15 Dec 19 05:21:22 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761681#m1761681 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761681#m1761681 <p>moin,</p> <blockquote> <p>Ach dawie gerade von Templates sprechen <a href="https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761671#m1761671" rel="noopener noreferrer">Table Constructor</a></p> </blockquote> <p>Das hat doch mit Templates nichts zu tun. Und HTML mit PHP zu erzeugen ist äußerst unschön. Guck Dir mal ne richtige Templateengine an, danach möchtest Du nie wieder HTML mit PHP erzeugen.</p> <p>Schön Sonntag.</p> PlugIn Manager entwickeln Mon, 16 Dec 19 20:38:20 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761798#m1761798 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761798#m1761798 <p>moin,</p> <blockquote> <p>Ach dawie gerade von Templates sprechen <a href="https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761671#m1761671" rel="noopener noreferrer">Table Constructor</a></p> </blockquote> <p>Ach grad gelesen, das Perlmodul <code>CGI.pm</code> aus dem Jahre 1997 kann auch Tabellen und beliebige HTML-Elemente erzeugen. Ganz ähnlich wie Du das machst. Hast Du die Idee von da?</p> <pre><code class="block language-pod"> :html2 Import all methods that generate HTML 2.0 standard elements. :html3 Import all methods that generate HTML 3.0 elements (such as <table>, <super> and <sub>). :html4 Import all methods that generate HTML 4 elements (such as <abbrev>, <acronym> and <thead>). </code></pre> <p>MFG</p> PlugIn Manager entwickeln Sun, 15 Dec 19 17:07:19 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761721#m1761721 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761721#m1761721 <p>moin,</p> <blockquote> <p>moin,</p> <blockquote> <p>Ach dawie gerade von Templates sprechen <a href="https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761671#m1761671" rel="noopener noreferrer">Table Constructor</a></p> </blockquote> <p>Das hat doch mit Templates nichts zu tun.</p> </blockquote> <p>Ok, ok, in Ordnung. Was ist im -<em>Software Ingenieur teschnischen Sinn</em>- ein <em>Template</em>? Das möchte ich gern von <em>„Dir“</em> persönlich wissen. Vermutlich verstehen wir beide unter dem Begriff, ein wenig was anderes, dewegen ist die Frage wichtig.</p> <blockquote> <p>Und HTML mit PHP zu erzeugen ist äußerst unschön.</p> </blockquote> <p>Pflichte ich dir total bei. Deswegen mache ich den Kontextwechsel so gering wie möglich.</p> <blockquote> <p>Guck Dir mal ne richtige Templateengine an, danach möchtest Du nie wieder HTML mit PHP erzeugen.</p> </blockquote> <p>habe ich.</p> <p>lgmb</p> PlugIn Manager entwickeln Sun, 15 Dec 19 11:46:31 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761699#m1761699 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761699#m1761699 <p>Hallo dedlfix,</p> <blockquote> <p>Für diese unbekannte Anzahl Möglichkeiten je eine Basisklasse bereitzustellen,</p> </blockquote> <p>ich glaube, jetzt liegst Du daneben.</p> <p>Man kann durchaus eine Art PDK (Plugin Developer Kit) anbieten, bestehend aus <strong>einer</strong> Basisklasse, von der alle Plugins erben, plus einem oder einigen Interfaces, die dem Plugin bereitgestellt werden und über die es Dienste der Basis-Application nutzen kann. Das kann dem Plugin einiges an Boilerplate-Code ersparen, bzw. es hilft, die Kommunikation mit der Basis-Application zu standardisieren.</p> <p>Eine eigene Basisklasse in der Application für jedes denkbare Plugin wäre Unsinn, das führt die Plugin-Idee ad absurdum.</p> <blockquote> <p>Datenströme</p> </blockquote> <p>Sicherlich. Aber genormt sein müssen die auch, und auch dafür sind vorgefertigte Helper nützlich. Ein PDK in der einen oder anderen Form braucht man immer. Wenn es der Anbieter der Basis-Application nicht tut, dann tut es jeder Plugin Entwickler für sich...</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> PlugIn Manager entwickeln Sun, 15 Dec 19 12:41:46 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761703#m1761703 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761703#m1761703 <p>Tach!</p> <blockquote> <blockquote> <p>Für diese unbekannte Anzahl Möglichkeiten je eine Basisklasse bereitzustellen,</p> </blockquote> <p>ich glaube, jetzt liegst Du daneben.</p> <p>Man kann durchaus eine Art PDK (Plugin Developer Kit) anbieten, bestehend aus <strong>einer</strong> Basisklasse, von der alle Plugins erben, plus einem oder einigen Interfaces, die dem Plugin bereitgestellt werden und über die es Dienste der Basis-Application nutzen kann.</p> </blockquote> <p>Ja, man kann OOP als Codebasis für Plugins nehmen. Aber das ist keine Voraussetzung. Plugins zu entwickeln ist nicht "der Sinn von Vererbung".</p> <blockquote> <p>Eine eigene Basisklasse in der Application für jedes denkbare Plugin wäre Unsinn, das führt die Plugin-Idee ad absurdum.</p> </blockquote> <p>Wenn man ein Plugin einbinden möchte, braucht man einen Registriermechanismus und definierte Schnittstellen, um die Funktionalität des Plugins anzusprechen. Wenn das lediglich über Vererbung passieren soll, braucht jedes Plugin ein Pendant im Basiscode von dem es erben kann. - Oder seine Beschreibung war zumindest für mich missverständlich.</p> <p>dedlfix.</p> PlugIn Manager entwickeln Sun, 15 Dec 19 13:50:47 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761709#m1761709 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761709#m1761709 <p>Hallo dedlfix,</p> <blockquote> <p>braucht jedes Plugin ein Pendant im Basiscode</p> </blockquote> <p>Die Betonung liegt auf <strong>ein</strong>. Will man ein OOP-PDK anbieten, muss es genau eine abstrakte Plugin-Klasse geben, und über Eigenschaften/Methoden dieser Klasse kommt das Plugin an das API der Basis-Application heran. Es gibt ggf. mehrere Variationen dieser Basisklasse, die dann aber alle von einer AbstractPlugin-Klasse erben sollten. Oder die Basisklasse stellt ein API mit unterschiedlichen Verbindungspunkten bereit, und unterschiedliche Plugins verbinden sich mit unterschiedlichen Stellen. Das festzulegen ist Sache der Plugin-fähigen Application.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> PlugIn Manager entwickeln Sun, 15 Dec 19 17:48:51 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761724#m1761724 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761724#m1761724 <p>Tach!</p> <blockquote> <p>Die Betonung liegt auf <strong>ein</strong>. Will man ein OOP-PDK anbieten, muss es genau eine abstrakte Plugin-Klasse geben, und über Eigenschaften/Methoden dieser Klasse kommt das Plugin an das API der Basis-Application heran.</p> </blockquote> <p>Das ist mir schon klar, dass man das Plugin-System so designen kann, dass Plugins eine Basisklasse beerben oder ein Interface implementieren. Aber Vererbung ist für eine Plugin-Technik keine Voraussetzung. Meine Kritik an pl bezog sich auf seine (so von mir verstandene) Aussage, dass man Plugins per Vererbung einbindet. "Du hast eine Basiklasse (Kern) und eine Klassenerweiterung (Plugin) [...]" Da ist nicht die Rede von einer Basisklasse für alle Plugins. Die Basisklasse gehört in seiner Aussage nicht zum Plugin, sondern ist das Gegenstück dazu im Kern. Sowas ist kein Plugin sondern eine Erweiterung des Codes um weitere Funktionalität.</p> <p>Wenn der Kern zum Beispiel für drei Funktionalitäten braucht, wie spricht er die denn an, wenn er lediglich die Basisklasse kennt? Ich kann mir da nur vorstellen, dass es drei Basisklassen gibt oder eine Basisklasse mit drei speziellen Methoden. Aber wie gesagt, sowas ist nicht das, was ich als Plugin-System bezeichnen würde.</p> <p>Ein Plugin-System ist für mich im Wesentlichen eine Liste von Hooks, und dazu je eine Liste von Plugins. Diese Liste bildet sich aber erst zur Laufzeit, nachdem das System die zur Verfügung stehenden Plugins gesucht und gefunden hat und die Plugins für die diversen Hooks registriert wurden, für die sie Funktionalität anbieten. Dazu gehört auch, dass für beliebig viele Hooks kein Plugin existiert. In meinem Model ist das Gegenstück zum Plugin der jeweilige Hook. Und dieser Hook ist keine (Basis)klasse sondern ein eine Stelle im Code, die über einen Bezeichner die Pluginverwaltung befragt, ob dafür etwas registriert und auszuführen ist. Da dazu kein Plugin existieren muss, kann der Hook keine abstrakte Basisklasse sein, weil solche ohne implementierende überschreibende Klassen nicht instantiiert werden können.</p> <p>dedlfix.</p> PlugIn Manager entwickeln Sun, 15 Dec 19 17:42:12 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761722#m1761722 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761722#m1761722 <p>moin,</p> <blockquote> <blockquote> <p>moin,</p> <blockquote> <p>Ach dawie gerade von Templates sprechen <a href="https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761671#m1761671" rel="noopener noreferrer">Table Constructor</a></p> </blockquote> <p>Das hat doch mit Templates nichts zu tun.</p> </blockquote> <p>Ok, ok, in Ordnung. Was ist im -<em>Software Ingenieur teschnischen Sinn</em>- ein <em>Template</em>? Das möchte ich gern von <em>„Dir“</em> persönlich wissen. Vermutlich verstehen wir beide unter dem Begriff, ein wenig was anderes, dewegen ist die Frage wichtig.</p> </blockquote> <p>Ein Template ist eine Layout-Datei die vom Programmcode unabhängig ist. So können für HTML::Template erstellte Templates sowohl in c, in Perl als auch in PHP gerendert werden weil es diese TE eben für c, Perl und PHP gibt.</p> <p>Das Template für eine Tabelle sähe z.B. so aus (nur der LOOP-Teil):</p> <pre><code class="block language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>TMPL_LOOP</span> <span class="token attr-name">NAME</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>names<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tr</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>td</span><span class="token punctuation">></span></span> %name% <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>td</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>td</span><span class="token punctuation">></span></span> %vname <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>td</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tr</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>TMPL_LOOP</span><span class="token punctuation">></span></span> </code></pre> <p>Und wie Du sehen kannst gibt es da nichts was auf Perl, PHP oder C hindeutet und das ist ja auch das Ziel, Code von Layout strikt zu trennen. So hatte ich Kunden die haben ihre Shoptemplates selbst erstellt und mussten nur sagen welche Platzhalter da drin sind, damit ich als Programmierer die Werte dafür bereitstelle.</p> <p>Letzteres ist dann auch der Knackpunkt in der Softwareentwicklung: Nicht HTML erzeugen sondern nur noch die Daten in Templates zu rendern.</p> <p>Was das für die Produktivität bedeutet dürfte klar sein. Einmal hinsichtlich Teamarbeit und zum Anderen hinsichtlich Zeitersparnis.</p> <p>Schließlich können Templates aus unterschiedlichen Quellen geladen werden, Dateien, Datenbanken, Netzwerk und in Ausnahmefällen liegt das Template auch mal in der Klassendatei wo man das auch da sauber vom Code trennen kann.</p> <p>Und auch wenn Du Perl nicht magst: Das sind alles Dinge die in Perl sozusagen der Programmieralltag sind. Es ist nie verkehrt mal zu gucken was die Anderen machen und wie sie es machen. Als PHP den Siegeszug im Web antrat, hatten Perlentwickler dem Prinzip von eingebettetem Code längst den Rücken gekehrt und die Entwicklung in Richtung Templateengines vorangetrieben.</p> <p>MFG</p> PlugIn Manager entwickeln Sun, 15 Dec 19 18:10:41 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761725#m1761725 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761725#m1761725 <p>Tach!</p> <blockquote> <p>Ein Template ist eine Layout-Datei die vom Programmcode unabhängig ist. So können für HTML::Template erstellte Templates sowohl in c, in Perl als auch in PHP gerendert werden weil es diese TE eben für c, Perl und PHP gibt.</p> <p>Das Template für eine Tabelle sähe z.B. so aus (nur der LOOP-Teil):</p> <pre><code class="block language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>TMPL_LOOP</span> <span class="token attr-name">NAME</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>names<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tr</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>td</span><span class="token punctuation">></span></span> %name% <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>td</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>td</span><span class="token punctuation">></span></span> %vname <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>td</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tr</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>TMPL_LOOP</span><span class="token punctuation">></span></span> </code></pre> </blockquote> <p>In diesem Template wird für die Logik (im Beispiel die Schleife) eine dritte Sprache verwendet. Das kann man so machen, wenn die Templates aus Gründen unabhängig von einer konkreten bereits vorhandenen Programmiersprache sein müssen. Das ist aber nicht überall zwingende Notwendigkeit, und so kann man durchaus statt der dritten Sprache die Programmiersprache des Systems für diese Logik-Teile verwenden, inklusive bereits vorhandener Unterstützung dafür in der IDE (Syntaxhervorhebung, Debugging).</p> <blockquote> <p>Und wie Du sehen kannst gibt es da nichts was auf Perl, PHP oder C hindeutet und das ist ja auch das Ziel, Code von Layout strikt zu trennen.</p> </blockquote> <p>Die strikte Trennung ist kein allgemeingültiges Ziel sondern nur notwendig in Anwendungsfällen, wo das Template in verschiedenen Systemen unabhängig verwendet werden muss.</p> <blockquote> <p>Was das für die Produktivität bedeutet dürfte klar sein. Einmal hinsichtlich Teamarbeit und zum Anderen hinsichtlich Zeitersparnis.</p> </blockquote> <p>Gegenzurechnen wäre der Aufwand, die dritte Sprache lernen zu müssen. Ob das immer eine Zeitersparnis ergibt, darf je nach Komplexität der dritten Sprache bezweifelt werden.</p> <blockquote> <p>Schließlich können Templates aus unterschiedlichen Quellen geladen werden, Dateien, Datenbanken, Netzwerk und in Ausnahmefällen liegt das Template auch mal in der Klassendatei wo man das auch da sauber vom Code trennen kann.</p> </blockquote> <p>Auch das ist nicht überall Notwendigkeit.</p> <p>dedlfix.</p> PlugIn Manager entwickeln Sun, 15 Dec 19 18:44:41 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761728#m1761728 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761728#m1761728 <p>moin,</p> <blockquote> <p>Ein Template ist eine Layout-Datei die vom Programmcode unabhängig ist. […]</p> </blockquote> <p>Das sind wir uns einig.</p> <blockquote> <p>Das Template für eine Tabelle sähe z.B. so aus (nur der LOOP-Teil): […]</p> </blockquote> <p>Was ist der unterschied zu meinem Komplexerem Template wo du nicht weißt wieviele <code><tr></code>s und <code><td></code>man hat??? Ich hingegen brauch mich um keine Tabellen Templates mehr zu kömmern da mein Template alles schon erledigt.</p> <pre><code class="block language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>table</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>colgroup</span><span class="token punctuation">></span></span> ... <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>colgroup</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>thead</span><span class="token punctuation">></span></span> ... <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>thead</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tbody</span><span class="token punctuation">></span></span> ... <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tbody</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tbody</span><span class="token punctuation">></span></span> ... <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tbody</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tbody</span><span class="token punctuation">></span></span> ... <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tbody</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tfoot</span><span class="token punctuation">></span></span> ... <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tfoot</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>table</span><span class="token punctuation">></span></span> </code></pre> <blockquote> <p>Und wie Du sehen kannst gibt es da nichts was auf Perl, PHP oder C hindeutet […]</p> </blockquote> <p>das ist richtig, aber was ist denn, wenn ich nur für eine Programmiersprache und für ein bestimmtes <em>CMS</em> ein <em>Template</em> erstellen will was gefordert ist. Was dann? <a href="/users/27" class="mention registered-user" rel="noopener noreferrer">@dedlfix</a> hat erwähnt</p> <blockquote> <p>[…] und das ist ja auch das Ziel, Code von Layout strikt zu trennen.</p> </blockquote> <p>Das sind wir uns einig ohne Frage.</p> <blockquote> <p>Letzteres ist dann auch der Knackpunkt in der Softwareentwicklung: Nicht HTML erzeugen sondern nur noch die Daten in Templates zu rendern.</p> </blockquote> <p>bin ich genau bei dir</p> <blockquote> <p>Was das für die Produktivität bedeutet dürfte klar sein. Einmal hinsichtlich Teamarbeit und zum Anderen hinsichtlich Zeitersparnis.</p> </blockquote> <blockquote> <p>Es ist nie verkehrt mal zu gucken was die Anderen machen und wie sie es machen.</p> </blockquote> <p>Da stimme ich dir persönlich voll und ganz zu. Ohne frage.</p> <p>Aber was hat das Schlussentlich mit meinem Template zutun? <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a> hat <em>Helper</em>-Funktionen erwähnt, <a href="/users/27" class="mention registered-user" rel="noopener noreferrer">@dedlfix</a> hat die <em>'extrem'</em> strikte Trennung relativiert, dass man das machen kann aber nicht muss.</p> <p>lgmb</p> PlugIn Manager entwickeln Mon, 16 Dec 19 07:51:32 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761754#m1761754 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761754#m1761754 <p>moin,</p> <blockquote> <blockquote> <p>Ein Template ist eine Layout-Datei die vom Programmcode unabhängig ist. […]</p> </blockquote> <p>Das sind wir uns einig.</p> <blockquote> <p>Das Template für eine Tabelle sähe z.B. so aus (nur der LOOP-Teil): […]</p> </blockquote> <p>Was ist der unterschied zu meinem Komplexerem Template wo du nicht weißt wieviele <code><tr></code>s und <code><td></code>man hat???</p> </blockquote> <p>Siehe mein Beispiel mit <TMPL_LOOP>. Da erzeugt die TE <a href="https://rolfrost.de/routes.htm" rel="nofollow noopener noreferrer">Tabellen mit beliebig vielen Zeilen</a> und das praktische daran ist, daß eine Datenbankabfage genau diese Datenstruktur liefert welche die TE zum Rendern braucht. So wird die Ergebnismenge 1:1 der TE übergeben.</p> <p>Und dann denke mal an Kundenwünsche und Skalierbarkeit. Stell Dir vor ein Kunde möchte in seiner Tabelle zusätzliche Spalten oder Spalten ausblenden. Sowas hast Du über ein Template in wenigen Minuten erledigt und wie ich schon schrieb, sowas kann der Kunde ggf. auch selber machen.</p> <p>Des Weiteren gibt es auch Überlegungen hnisichtlich systemübergreifender Datenstrukturen. Und siehe da, auch für JavaScript gibt es Templateengines, die mit denselben Datenstrukturen rendern wie HTMLTemplate. So übergibst Du das Ergebnis einer Datenbankabfrage ganz einfach als JSON in die Response für einen AJAXRequest <a href="https://rolfrost.de/basket.htm" rel="nofollow noopener noreferrer">wie diese DEMO</a> zeigt.</p> <p>MFG</p> Progressive Enhancement Mon, 16 Dec 19 08:50:47 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761757#m1761757 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761757#m1761757 <p>PS</p> <blockquote> <p>Des Weiteren gibt es auch Überlegungen hnisichtlich systemübergreifender Datenstrukturen. Und siehe da, auch für JavaScript gibt es Templateengines, die mit denselben Datenstrukturen rendern wie HTMLTemplate. So übergibst Du das Ergebnis einer Datenbankabfrage ganz einfach als JSON in die Response für einen AJAXRequest <a href="https://rolfrost.de/basket.htm" rel="nofollow noopener noreferrer">wie diese DEMO</a> zeigt.</p> </blockquote> <p>Von Progressive Enhancement ist hier gelegentlich die Rede. Praktisch geht es darum, eine bestehende Anwendung die auf Submit basiert anwenderfreundlicher zu machen. Und auch hier zeigt es sich als sehr vorteilhaft wenn die darzustellenden Daten über ein Template gerendert werden.</p> <p>So wird bei einem native Submit das Template serverseitig gerendert, nach der Erweiterung auf JavaScript hingegen wird das Template im Browser gerendert. I.d.R. erfordert eine solcher Erweiterung nur eine einzige Zeile serverseitig, denn die Daten die zu rendern sind, liegen ja bereits vor. D.h., daß diese Daten anstatt sie serverseitig zu rendern nu noch zu serialisieren sind für eine Response mit dem Enctype application/json.</p> <p>Damit haben wir serverseitig wie clientseitig genau dieselbe Datenstruktur und: Auch dasselbe Template!</p> <p>MFG</p> PlugIn Manager entwickeln Mon, 16 Dec 19 14:37:02 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761786#m1761786 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761786#m1761786 <p>moin,</p> <blockquote> <p>Siehe mein Beispiel mit <TMPL_LOOP>. Da erzeugt die TE <a href="https://rolfrost.de/routes.htm" rel="nofollow noopener noreferrer">Tabellen mit beliebig vielen Zeilen</a> und das praktische daran ist, daß eine Datenbankabfage genau diese Datenstruktur liefert welche die TE zum Rendern braucht. So wird die Ergebnismenge 1:1 der TE übergeben.</p> </blockquote> <p>Ich rede nicht von <em>TE</em> (Template Engine) sondern von einem einfachen <em>Template</em>. Feiner Unterschied! Wenn ich eine <em>TE</em> mit diesem <em>Code</em> vorstellen würde, dann wäre deine <em>„Kritik“</em>, meiner Meinung nach, völlig berechtigt.</p> <p>Meine <em>Template</em> kann wahlweise eine ganze Tabelle in Zeitlichen abständen befüllt werden, ohne jegliche Kopplung. Man muss nur entsprechende externe Klassen befüllen eben, auserhalb das <em>T</em>:</p> <pre><code class="block language-php"><span class="token variable">$ta</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableAttributs</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'id'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'class'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tcol</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableColum</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'id'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'class'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'1'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tset</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableSettings</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'id'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'class'</span><span class="token punctuation">,</span> <span class="token constant">null</span><span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token variable">$tcol</span><span class="token punctuation">,</span> <span class="token variable">$tcol</span><span class="token punctuation">,</span> <span class="token variable">$tcol</span><span class="token punctuation">,</span> <span class="token variable">$tcol</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tc</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableCell</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'foobar'</span><span class="token punctuation">,</span> <span class="token variable">$ta</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tr</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableRow</span><span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token variable">$tc</span><span class="token punctuation">,</span> <span class="token variable">$tc</span><span class="token punctuation">,</span> <span class="token variable">$tc</span><span class="token punctuation">,</span> <span class="token variable">$tc</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$ts</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableSection</span><span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token variable">$tr</span><span class="token punctuation">,</span> <span class="token variable">$tr</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$ta</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$t</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableConstructor</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'Foo Bar'</span><span class="token punctuation">,</span> <span class="token variable">$tset</span><span class="token punctuation">,</span> <span class="token variable">$ts</span><span class="token punctuation">,</span> <span class="token variable">$ts</span><span class="token punctuation">,</span> <span class="token variable">$ts</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>geht auch so</p> <pre><code class="block language-php"><span class="token keyword">echo</span> <span class="token keyword">new</span> <span class="token class-name">TableConstructor</span><span class="token punctuation">(</span> <span class="token constant">null</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">TableSection</span><span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token keyword">new</span> <span class="token class-name">TableRow</span><span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token keyword">new</span> <span class="token class-name">TableCell</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'foobar'</span> <span class="token punctuation">)</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Ergebnis:</p> <pre><code class="block language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>table</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tbody</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tr</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>td</span><span class="token punctuation">></span></span>foobar<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>td</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tr</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tbody</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>table</span><span class="token punctuation">></span></span> </code></pre> <p>mit den selben Template das ich vorgestellt habe. Dann hast du alles in einem rutsch. Aber is noch nicht ausgereift.</p> <p>Neben bei erwähnt, ich schreibe zukünftig <em>TE</em>'s die ich dann vorstellen werde und da kannst du sehr gern Kritik üben die von mir gewünscht ist. Is ja n <em>Forum</em>.</p> <p>lgmb</p> Progressive Enhancement Mon, 16 Dec 19 09:59:11 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761760#m1761760 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761760#m1761760 <p>Und <a href="https://rolfrost.de/routespe.htm" rel="nofollow noopener noreferrer">hier ist die Demo</a>, Serverseitig habe ich dazu nur die Kontrollstruktur erweitert:</p> <pre><code class="block language-php"> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">param</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'showroutes'</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token constant">STASH</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'native'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">param</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'xhr'</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token constant">CONTENT</span> <span class="token operator">=</span> <span class="token function">json_encode</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token constant">STASH</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>wie lange würdest Du mit Deinem Tabellenerzeuger dafür benötigen?</p> <p>MFG</p> Progressive Enhancement Mon, 16 Dec 19 14:31:20 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761785#m1761785 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761785#m1761785 <p>Hallo pl,</p> <p>das ist natürlich ganz praktisch, wenn man auf diese Weise zwischen JS-enabled und JS-free umschalten kann. Da zahlt es sich dann aus, dass die TE an sich sehr kompakt ist und wenig Code braucht. Die kann man dann relativ leicht doppelt implementieren.</p> <p>Sowas sollte man sich aber gut überlegen und möglichst nach einem fertigen Produkt suchen. Deine TE ist sehr einfach gestrickt. Die Regexe sehen so aus, als wären sie bei „komplexer“ Logik überfordert.</p> <p>Dieses Template</p> <pre><code class="block">@if_foo@ foo! foo! @else@ tralala @endif@ @if_bar@ barabarabar @else@ flöt @endif@ </code></pre> <p>sollte deine greedy if/else regex <code>.replace(/@if_(\w+)@(.*?)@else@(.*?)@endif@/gm</code> bereits in den digitalen Wahnsinn treiben.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> PlugIn Manager entwickeln Mon, 16 Dec 19 15:14:48 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761787#m1761787 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761787#m1761787 <p>Mitnichten kritisiere ich Deinen Code. Ganz im Gegenteil! Es ist jedoch so, daß man auch einst (vor 20 Jahren) in Perl Libraries entwickelte die genau das tun was Du heute mit Deinem Code beabsichtigst. Nur darauf wollte ich hinweisen. So haben auch wir Perlentwickler in unseren Anwendungen jahrzehntelang Code mitgeschleppt ohne diesen zu nutzen. Und es ist genau diese Erfahrung die mich dazu brachte ein eigenes Framework zu entwickeln.</p> <p>Beispielsweise gab es eine Methode <code>start_html()</code> für Instanzen der Perlklasse <code>CGI</code>. Von dieser Funktion ist in meinem FW nur der Name geblieben als eine Methode von Instanzen meiner Perl- oder PHPklassen. Schließlich wird diese Methode zum Aufbau einer jeden Response vom Enctype <code>text/html</code> benötigt.</p> <p>Im Gegensatz zu <code>CGI::start_html()</code> erzeugt meine Methode jedoch kein HTML sondern rendert ein Template. Und siehe da, es ist völlig egal, ob die Methode <code>start_html()</code> die Instanz einer PHPklasse oder die Instanz einer Perlklasse ist, das Template ist dasselbe.</p> <p>Aber letztendlich zählt nur das was man selber tut. MFG</p> PlugIn Manager entwickeln Mon, 16 Dec 19 15:15:20 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761788#m1761788 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761788#m1761788 <p>Hallo MB,</p> <p>es ist letztlich egal, ob Du das Template in PHP oder mit Mitteln einer Template-Engine schreibst. Wichtig ist die Trennung zwischen Business- und Ausgabelogik, und die hast Du.</p> <p>Ob Du tatsächlich spezifische Klassen für Table, TableRow, TableCell etc brauchst, dann kann man diskutieren. Eventuell führt das ins over-engineering. Ein OOP-Template muss zwei Dinge können:</p> <ul> <li>sich an den Datenstrukturen des Business- oder Viewmodels entlanghangeln</li> <li>einige HTML Bausteine ausgeben können: Elemente ohne Inhalt (<img>), Elemente mit leerem Inhalt (<div />, Elemente mit Inhalt (<form>, </form>) und Inhalt hineinsetzen, Attribute an Elemente kleben sowie Text ausgeben. Korrekter Kontextwechsel inbegriffen.</li> </ul> <p>D.h. letztlich läuft es auf die Grundbausteine der EDV hinaus: Sequenz, Alternative und Iteration.</p> <p>Das führt dann dazu, dass Du einen Objektbaum aus Template-Objekten aufbaust, der deine Ausgabe beschreibt, und dann die render-Methode der Baumwurzel aufrufst. Der Rest entwickelt sich dann von selbst. Das ist aber nicht unbedingt effizient. PHP muss die Klassen laden, du musst sie instanziieren, erst dann kannst Du ausgeben. Sowas ist gut, wenn man den geladenen Baum mehrfach verwenden kann, aber genau das geht in PHP ja nicht. Für jeden neuen Web-Request wird der Speicher geputzt.</p> <p>Deswegen ist ein in PHP programmiertes Template, das Du bei Bedarf einfach mit include einbindest, die bessere Lösung.</p> <p>Ich hab mal gegoogelt - guck mal was Ian Burris macht. Der bettet es sogar in eine Klasse ein und das includete Template hantiert dann auf $this->... herum. Kann man machen, muss man nicht. Es muss nur eine Konvention geben, was der includete Code vorzufinden erwartet.</p> <p>Ein anderes Beispiel für diese Idee ist Smarty. Da gibt's zwar eine eigene Templatesprache, aber Smarty "kompiliert" das beim ersten Verwenden in PHP und führt dann dieses PHP aus. Das Smarty-Objekt bekommt ein Array mit Daten-Elementen, die dann im Template zur Verfügung stehen. Damit ist das Template strikt vom Rest des Codes getrennt und kann auf nichts zugreifen, was ihm nicht erlaubt ist. Gerade, wenn Templates von Dritten gebaut werden, kann das interessant sein.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> PlugIn Manager entwickeln Mon, 16 Dec 19 15:25:43 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761789#m1761789 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761789#m1761789 <p>moin,</p> <blockquote> <p>Mitnichten kritisiere ich Deinen Code. […]</p> </blockquote> <p>Das habe ich damn falsch verstanden und ich entschulige mich persönlich und in aller Form für die Zurechtweisung.</p> <p>lgmb</p> PlugIn Manager entwickeln Mon, 16 Dec 19 15:34:09 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761790#m1761790 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761790#m1761790 <p>moin,</p> <blockquote> <p>Ob Du tatsächlich spezifische Klassen für Table, TableRow, TableCell etc brauchst, dann kann man diskutieren. Eventuell führt das ins over-engineering.</p> </blockquote> <p>ich führchte. Es ist ja zum Lern Zweck und um mich zu präsentieren</p> <blockquote> <p>PHP muss die Klassen laden, du musst sie instanziieren, erst dann kannst Du ausgeben.</p> </blockquote> <p>Ich überlegte ob es sinnvoll ist das ganze zu cachen</p> <blockquote> <p>Sowas ist gut, wenn man den geladenen Baum mehrfach verwenden kann, aber genau das geht in PHP ja nicht. Für jeden neuen Web-Request wird der Speicher geputzt.</p> </blockquote> <p>auf das gecachte zugreifen? Dann spart man sich auch das 1000-fache laden <em>PHP</em> Klassen.</p> <p>lgmb</p> PlugIn Manager entwickeln Mon, 16 Dec 19 15:44:09 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761791#m1761791 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761791#m1761791 <p>Hallo MB,</p> <p>da bin ich nicht weit genug drin, um sagen zu können, ob man instanziierte Objektbäume cachen kann. Ich hätte da meine Zweifel.</p> <p>Wenn es geht, musst Du auf jeden Fall darauf achten, dass die Runtime-Daten, also das, was Du zum Ausgeben brauchst, nur auf dem Stack landet (also als Parameter weitergeht) und nicht im Template-Objekt. Denn wenn es gecached werden kann, wird es für hunderte Requests vieler verschiedener User genutzt.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> PlugIn Manager entwickeln Mon, 16 Dec 19 17:17:02 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761792#m1761792 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761792#m1761792 <blockquote> <blockquote> <p>Ob Du tatsächlich spezifische Klassen für Table, TableRow, TableCell etc brauchst, dann kann man diskutieren. Eventuell führt das ins over-engineering.</p> </blockquote> <p>ich führchte. Es ist ja zum Lern Zweck und um mich zu präsentieren</p> </blockquote> <p>Ich habe mal eine ähnliche Templating-Engine geschrieben. Ich habe aber nicht für jeden Elementtypen eine eigene Klasse angelegt, sondern nur eine Klasse <code>Element</code> und ein paar abgeleitete Klassen für Spezialfälle. Für die einzelnen Elementtypen habe ich dann einzelne Factory-Funktionen geschrieben. Das ist viel Code, aber dafür eine simple Architektur. Wenn es dir hilft: <a href="https://github.com/Teein/Html" rel="noopener noreferrer">https://github.com/Teein/Html</a></p> <blockquote> <blockquote> <p>PHP muss die Klassen laden, du musst sie instanziieren, erst dann kannst Du ausgeben.</p> </blockquote> <p>Ich überlegte ob es sinnvoll ist das ganze zu cachen</p> </blockquote> <p>Absolut, aber Caching ist mitunter sehr schwierig zu implementieren.</p> PlugIn Manager entwickeln Mon, 16 Dec 19 23:05:12 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761803#m1761803 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761803#m1761803 <p>moin,</p> <blockquote> <blockquote> <p>Ach dawie gerade von Templates sprechen <a href="https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761671#m1761671" rel="noopener noreferrer">Table Constructor</a></p> </blockquote> <p>Ach grad gelesen, das Perlmodul <code>CGI.pm</code> aus dem Jahre 1997 kann auch Tabellen und beliebige HTML-Elemente erzeugen. Ganz ähnlich wie Du das machst. Hast Du die Idee von da?</p> </blockquote> <p>Ach schön, aber nein nicht konkret. Ich hab meine eigenen grauen Zellen angestrengt. Die Idee und Konzepte habe ich aus vielerleih Ereignissen gezogen: Hier im Forum <em>(auch bei dir in deinen Beträgen)</em>, im Tutorium, in Lehrbücher etc.. Die konkrete Umsetzung ist in meinem Denkstübchen entstanden mit <em>UML</em>: <em>CD</em>.</p> <p>lgmb</p> PlugIn Manager entwickeln Tue, 17 Dec 19 07:32:48 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761806#m1761806 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761806#m1761806 <p>Beim Lesen der Beiträge hier kommen mir auch viele Ideen </p> PlugIn Manager entwickeln Wed, 18 Dec 19 14:27:24 Z https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761883#m1761883 https://forum.selfhtml.org/self/2019/dec/13/plugin-manager-entwickeln/1761883#m1761883 <p>Tach!</p> <blockquote> <p>Es gäbe noch, neben der Möglichkeit der Klassenerweiterung/Vererbung die Möglichkeit Code durch Traits zu erweitern bzw. zu spezialisieren.</p> </blockquote> <p>Auch das wird im allgemeinen nicht mit dem Begriff Plugin bezeichnet.</p> <p>Plugins erweitern ein fertiges Programm um optionale Dinge. Was du in diesem Thread beschreibst, sind Erweiterungen des Codes.</p> <p>dedlfix.</p>