


Erstellen eines benutzerdefinierten Formularfeldtyps in Joomla anhand des Modal Select-Beispiels
Nov 17, 2024 am 10:18 AMVerwendung des ModalSelect-Formularfeldtyps in Joomla 5, um das Finden des richtigen Produkts aus Tausenden zu vereinfachen, indem bei der Entwicklung einer Erweiterung in einem modalen Fenster nach Kategorie, Hersteller und Suche gefiltert wird.
Einführung
Bei der Arbeit mit Kunden gibt es Aufgaben auf verschiedenen Ebenen: Jemand braucht eine einfache Website mit 5-6 Seiten. Jemand ben?tigt einen gro?en Warenkatalog oder einen Online-Shop mit Integrationen in Drittsysteme über die REST-API. Jemand anderes ben?tigt nicht standardm??ige Funktionen, für die es keine g?ngigen L?sungen gibt.
Joomla eignet sich gut für die Entwicklung und erm?glicht die Erstellung leicht zu wartenden Codes. Wenn die Anforderung dem CMS-Kern folgt, gibt es für alle diese F?lle eine Antwort.
Um ein gro?es Projekt abzuschlie?en, müssen wir es in kleinere Aufgaben aufteilen, und ich m?chte in diesem Artikel über die L?sung einer dieser Aufgaben sprechen.
Ausgangsdaten
Kunden haben bereits einen Produktkatalog auf einer der beliebten Komponenten des Online-Shops für Joomla (JoomShopping) erstellt. Sie k?nnen die Parameter des Produkts ausw?hlen, es in den Warenkorb legen und einen Kauf t?tigen. Alles ist wie immer. Jetzt müssen Sie jedoch die M?glichkeit hinzufügen, ein grafisches Layout für Produkte zu erstellen. Ihr Produkt ist beispielsweise eine Tasse oder ein T-Shirt. Und vor dem Kauf k?nnen Sie zum Produktdesigner gehen, Ihr Logo oder Foto hochladen, einen Text schreiben und dieses Layout wird der Bestellung im Online-Shop beigefügt. Nach der Bezahlung geht das Layout direkt in die Produktion, wo das Bild und der Text auf deine Tasse aufgebracht und an die Adresse verschickt werden.
Da die Implementierung dieser Funktionalit?t recht zeitaufw?ndig ist, wird sie als separate Produktdesigner-Komponente erstellt. Und es werden bereits Plugins für Datenanbieter erstellt, die es Ihnen erm?glichen, mit der einen oder anderen E-Commerce-Komponente zu arbeiten.
Eine der kleinen, angewandten Aufgaben besteht darin, Verbindungen zwischen den Waren der Online-Shop-Komponente und den Waren in der Produktdesigner-Komponente herzustellen. Dies sollte für Content-Manager, die in Zukunft an den Inhalten arbeiten, bequem und intuitiv sein. Daher reicht es nicht aus, nur ein Textfeld zu erstellen, in dem die ID-Nummer des gewünschten Produkts angegeben wird. M?glicherweise gibt es in einem Online-Shop nur ein paar Dutzend Produkte, und dann ist die Auswahl eines Produkts für die Kommunikation nicht sehr schwierig. Bei Tausenden von Produkten ist die Funktionalit?t zum Suchen und Filtern von Produkten nach Parametern wichtig. Wenn Sie die Produktliste nach Kategorie oder Hersteller filtern oder unter Hunderten anderen nach Namen suchen k?nnen, wird Ihre Arbeit viel schneller und einfacher.
Sehen Sie sich das Video an
Dieses Feld ?hnelt sehr der Arbeit der Editor-Button-Plugins (Gruppe editors-xtd), bei denen die Daten zur Auswahl im modalen Fenster angezeigt werden: ein Link zum Artikel, ein Kurzcode für das Modul usw.
Eine kleine Theorie
Im Joomla-Administratorbereich gibt es verschiedene Felder, die mit Daten aus anderen Komponenten gefüllt werden müssen: Geben Sie den Artikel, den Menüpunkt, den Kontakt, das Produkt usw. an. Normalerweise sind solche Felder als Dropdown-Liste mit Auswahloptionen konzipiert , k?nnen sie als Eingabetyp="Text" mit einer Datenliste gestaltet werden, es gibt aber auch praktische Felder, die eine Liste der gewünschten Entit?ten anzeigen, mit Filterung, Suche und Paginierung. Als Datenquelle k?nnen nicht nur Quellen innerhalb der Site (verschiedene Komponenten, Plugins) fungieren, sondern auch über die REST-API verfügbare Dienste von Drittanbietern: CRM, Lieferdienste, externe Datenbanken, andere Joomla-Sites usw.
Wir alle haben diese Felder in Aktion gesehen, als wir einen Artikel in einem Menüpunkt wie ?Artikel – Einzelner Artikel“, ?Kontakte – Einzelner Kontakt“ oder beim Erstellen eines Alias ????des Menüpunkts – ?Systemlinks – Menü“ – ausgew?hlt haben Artikelalias". Erinnern wir uns jedoch daran, wie sie aussehen.
Ein modales Artikelauswahlfenster.
Ein modales Einzelkontaktauswahlfenster.
Die M?glichkeiten des modalen Auswahlfelds in Joomla
Schauen wir uns diese Felder genauer an – was genau sie Ihnen erm?glichen. Irgendwo tief im Inneren verstehen wir, dass die Hauptaufgabe dieses Feldes darin besteht, die ID der ausgew?hlten Entit?t abzurufen und diese ID in ein Textfeld einzufügen. Aber auf dem Bildschirm sehen wir etwas anderes – statt einer ID-Nummer sehen wir den Titel des Artikels oder Kontakts. Es ist sch?n und praktisch. Sie müssen sich den Namen des Artikels mit der ID 1452704 nicht merken. Au?erdem zeigt das Video deutlich, dass die Schaltfl?che ?L?schen“ angezeigt wird, wenn das Feld bereits einen Wert enth?lt. Dadurch wird der Wert des Felds zurückgesetzt und Sie k?nnen erneut auf die Schaltfl?che ?Ausw?hlen“ klicken.
In manchen F?llen haben wir die M?glichkeit einen ausgew?hlten Entit?tstyp zu erstellen – Artikel, Kontakt usw.direkt beim Erstellen eines Menüpunkts. Diese Schaltfl?che funktioniert unter Berücksichtigung der ACL – Trennung der Zugriffsrechte in Joomla.
Stellen Sie sich vor, Sie erstellen eine Website und erstellen eine ?Kontakte“-Seite. Wenn Sie nicht viele Unternehmenszweige mit einer komplexen Struktur haben, dann ist dies nur der übliche Joomla-Artikel in der Kategorie ?Nicht kategorisiert“. Und es verfügt bereits über alle Kontakte in Form von Text oder Variablen. In der Antike musste man zuerst den Artikel erstellen und dann zu den Menüpunkten gehen und einen Menüpunkt dafür erstellen. Das müssen Sie jetzt nicht tun.
Und wenn das Feld bereits einen Wert hat, ist es in manchen F?llen m?glich, die ausgew?hlte Entit?t (Artikel, Menüpunkt usw.) direkt beim Erstellen eines Menüpunkts zu bearbeiten.
Mithilfe des Auswahlfelds im modalen Fenster k?nnen wir also:
- ausw?hlen
- erstellen
- Bearbeiten
- klar
Das ist es, was ich vor Augen habe. Aber in den Tiefen von Joomla gibt es auch einen merkwürdigen urlCheckin-Parameter, der es Ihnen erm?glicht, den ausgew?hlten Wert an die im Feld angegebene URL zu senden. Es ist erw?hnenswert, dass sich diese Funktionalit?t in Joomla seit geraumer Zeit schrittweise weiterentwickelt. Ein separater universeller Feldtyp, der für Ihre Bedürfnisse verwendet werden kann, erschien jedoch nur in Joomla 5. Dies ist nicht einmal in Joomla 4 der Fall.
Wie sind die Felder des Formularkonstruktors der Joomla-Admin-Panel-Oberfl?che angeordnet?
Zuvor hie? dieser Konstruktor JForm. Ich gehe davon aus, dass nicht alle meine Leser über ein solches Entwicklungstool wie eine IDE – Entwicklungsumgebung – a la PHP Storm oder VS Code verfügen, daher werde ich versuchen, zus?tzliche Richtlinien für die Navigation in der Codebasis zu geben.
In Joomla ist die Logik von der Ansicht (der eigentlichen HTML-Ausgabe) getrennt, daher werden wir sie an mehreren Stellen gleichzeitig untersuchen.
Logic ist die Form-Klasse
Logic ist die Form-Klasse. In Joomla 5 befinden sich die Form-Klassendateien in libraries/src/Form. Wir untersuchen diese Dateien, um die Logik selbst zu verstehen, was mit den Daten passiert und wie man damit arbeitet.
Kurz gesagt, der Formularkonstruktor empf?ngt XML mit einer Beschreibung der Felder. liest Daten (Feldtyp, benutzerdefinierte Feldklasse aus dem Attribut addfieldprefix, falls vorhanden usw.), l?dt die erforderliche Feldklasse mit FormHelper. Wenn das Feld einige Regeln zum Filtern der Ausgabedaten enth?lt – die FormRule-Klasse wird verwendet – denken Sie an die Joomla-Felder vom Typ Dateiliste, in denen Sie Filterparameter angeben und beispielsweise nur PHP- oder nur CSS-Dateien ausw?hlen k?nnen.
Joomla Form-Feldklassendateien befinden sich in libraries/src/Form/Field. Es gibt, gelinde gesagt, viele davon. Dies ist das Baumaterial des Admin-Panels und manchmal auch des Frontends.
Klassendateien beschreiben Klasseneigenschaften wie $type, $layout und andere, die für den Betrieb notwendig sind. Die meisten Felder verfügen über Methoden getInput() – gibt tats?chlich die HTML-Ausgabe des Felds zurück, getLayoutData() – verarbeitet Daten für das Feld vor, bevor es an den Renderer gesendet wird, getLabel() – arbeitet mit der Feldbezeichnung usw.
Wir erinnern uns, dass die Feldklassen die übergeordnete FormField-Klasse erben. In der Klassendatei libraries/src/Form/FormField.php werden die m?glichen Attribute des Feldes beschrieben, die in der Beschreibung in XML verwendet werden k?nnen. Sie haben eine kurze Beschreibung, was es ist und warum.
Untergeordnete Klassen (Erben) haben die M?glichkeit, mit den Methoden der übergeordneten Klasse zu arbeiten und diese bei Bedarf zu überschreiben.
Ansicht (HTML-Ausgabe, Layout) eines Feldes in Joomla 5
Jede Feldklasse verfügt über eine HTML-Ausgabe. Im klassischen MVC funktioniert die Ansicht sofort mit der Datenausgabe, aber in Joomla gibt es eine zus?tzliche Ebene – Layout, mit der Sie Layouts überschreiben k?nnen – eine der wichtigsten Funktionen dieses CMS. Die Kernlayouts sind wird voraussichtlich im Layouts-Ordner im Stammverzeichnis der Site liegen. Sie übergeben ein Array von $displayData mit allen von der Methode getLayoutData() empfangenen Daten. Wir geben in der Klasseneigenschaft $layout an, welches Ausgabelayout verwendet werden soll.
<?php /** * Name of the layout being used to render the field * * @var string * @since 3.7 */ protected $layout = 'joomla.form.field.email';
Diese Art der Aufnahme kommt recht h?ufig vor. In Joomla ist Layout ein durch Punkte getrennter Pfad zur Layout-Datei aus dem Layout-Ordner im Stammverzeichnis der Site. Das hei?t, der Eintrag $layout = 'joomla.form.field.email' bedeutet das Beim Rendern des Feldes werden Layouts verwendet layouts/joomla/form/field/email.php.
<?php use Joomla\CMS\Layout\LayoutHelper; $displayData = [ 'src' => $this->item->image, 'alt' => $this->item->name, ]; echo LayoutHelper::render( 'joomla.html.image', $displayData );
In ?hnlicher Weise wird in diesem Beispiel das Layout layouts/joomla/html/image.php verwendet. Einige Layouts k?nnen im Ordner html der Site-Vorlagen und im Admin-Bereich überschrieben werden.
Wenn wir dementsprechend genau sehen m?chten, welche Daten am Ende in das Layout gelangen und wie diese angezeigt werden, gehen Sie in die Layoutdatei und schauen Sie nach.
Erstellen eines Datenauswahlfelds im Modal Select-Fenster in Joomla 5
Jetzt kehren wir zur Hauptaufgabe des Artikels zurück.
Beispiele sind für uns wichtig, um sie zu studieren (Joomla 5.0.1 zum Zeitpunkt des Schreibens dieses Artikels):
- Die Hauptklasse des Feldes ist libraries/src/Form/Field/ModalSelectField.php
- das modale Auswahlfeld für Joomla-Artikel – administrator/components/com_content/src/Field/Modal/ArticleField.php
- modales Auswahlfeld für den Menütyp – administrator/components/com_menus/src/Field/MenutypeField.php
- modales Auswahlfeld für Menüelemente – administrator/components/com_menus/src/Field/MenutypeField.php
- Ausgabelayout – layouts/joomla/form/field/modal-select.php
Das modale Einzelkontakt-Auswahlfeld von com_contacts zum Zeitpunkt des Schreibens dieses Artikels wurde noch nicht in einen universellen Feldtyp eins konvertiert und liegt nur (in Joomla 5.0.2, als dieser Artikel geschrieben wurde) Administrator /components/com_contact/src/Field/Modal/ContactField.php. Es erbt FormField direkt, nicht ModalSelectField.
Der Aktionsalgorithmus zum Hinzufügen eines eigenen Felds ist wie folgt:
- Erstellen Sie ein XML-Formular mit unserem Feld in einer XML-Datei oder programmgesteuert mit SimpleXMLElement.
- Wenn wir spontan arbeiten, fügen wir mithilfe des Plugins für das onContentPrepareForm-Ereignis XML-Formulare zum gewünschten Formular hinzu (überprüfen Sie vorher $form->getName())
- Erstellen einer Feldklasse.
- Bei Bedarf erstellen wir eine eigene HTML-Ausgabe (Layout) des Feldes. Wir werden dies aus dem Rahmen dieses Artikels herauslassen. Und es funktioniert. ## Feld-XML Das Wichtigste in diesem Code ist das Attribut addfieldprefix, das den Namensraum Ihrer Feldklasse bedeutet. Der Klassenname wird aus addfieldprefix "" type "Field" gebildet. In diesem Fall ist die Feldklasse JoomlaPluginWtproductbuilderProviderjoomshoppingFieldProductlistField.
<?php /** * Name of the layout being used to render the field * * @var string * @since 3.7 */ protected $layout = 'joomla.form.field.email';
HTML-Ausgabe (Layout) des Feldes
Damit alles, was in PHP passiert, klar ist, müssen Sie sich zun?chst das Layout der Feldausgabe ansehen. Es befindet sich in der Datei layouts/joomla/form/field/modal-select.php. Tats?chlich werden 2 Eingabefelder ausgegeben – eines sichtbar, das andere unsichtbar. Der Titel des ausgew?hlten Artikels, Kontakts oder Produkts wird in Form eines Platzhalters – dem Parameter $valueTitle – in das sichtbare Feld eingetragen. Und der zweite ist seine ID – $value. Wenn wir noch nichts ausgew?hlt haben, sollte im Feld ein Satz wie ?Artikel ausw?hlen“ oder ?Produkt ausw?hlen“ stehen. Dies ist eine Sprachkonstante, die wir in das Hint-Attribut im XML-Feld oder in die setup()-Methode der Feldklasse einfügen.
Alle für das Ausgabelayout verfügbaren Parameter (d. h. diejenigen, die programmgesteuert oder in einer XML-Datei verwendet werden k?nnen):
<?php /** * Name of the layout being used to render the field * * @var string * @since 3.7 */ protected $layout = 'joomla.form.field.email';
PHP-Feldklasse
Die Feldklasse befindet sich, wie Sie vielleicht erraten haben, in meinem Plugin. Der Weg dorthin plugins/wtproductbuilder/providerjoomshopping/src/Field/ProductlistField.php. Ich habe das einzelne modale Artikelauswahlfeld als Grundlage genommen und es an meine Bedürfnisse angepasst – Auswahl eines Produkts aus dem JoomShopping-Onlineshop. Wir erweitern die übergeordnete ModalSelectField-Klasse um unsere eigene Klasse.
Zu meinen Aufgaben geh?rt nur die Produktauswahl, Bearbeitung und Erstellung nicht, daher geht es im Text des Artikels nur um die Produktauswahl. Die PHP-Klasse ist klein, ich werde sie vollst?ndig wiedergeben und kommentieren.
<?php use Joomla\CMS\Layout\LayoutHelper; $displayData = [ 'src' => $this->item->image, 'alt' => $this->item->name, ]; echo LayoutHelper::render( 'joomla.html.image', $displayData );
Separat wurde die Methode getValueTitle() eingeführt, die den Namen der ausgew?hlten Entit?t (Produktname, Artikeltitel usw.) anzeigt, wenn diese bereits ausgew?hlt und gespeichert wurde. Das hei?t, wir haben den Menüpunkt bearbeitet, wir berühren das Feld nicht, aber wir m?chten, dass der Titel des Artikels/Produktnamens für die Menschen verst?ndlich ist und nicht nur eine ID. Diese Methode zeigt den gewünschten Titel an.
<field type="productlist" name="product_id" addfieldprefix="Joomla\Plugin\Wtproductbuilder\Providerjoomshopping\Field" label="Field label" hint="Field placeholder" />
In einigen Feldern, in denen komplexere Funktionen erforderlich sind – mehrsprachige Assoziationen usw. – gibt es andere Methoden in der Feldklasse, die die grundlegenden Methoden der FormField-Klasse überschreiben:
- setLayoutData() ist eine Methode zur Vorverarbeitung von Daten vor dem tats?chlichen Rendern des Felds
- getRenderer() – zus?tzliche Parameter für das Rendern usw.
In unserem Fall besteht kein solcher Bedarf, daher verwenden wir sie nicht.
HTML-Ausgabe des Inhalts des modalen Fensters
Wenn Sie auf die Schaltfl?che ?Ausw?hlen“ klicken, ?ffnet sich ein modales Bootstrap-Fenster, in dem sich eine Liste der Produkte im
In meinem Plugin gibt die Methode onAjaxProviderjoomshopping() die HTML-Ausgabe der Produktliste zurück. Dort durchlaufen wir mit ihnen das Array, nehmen das Bild, den Namen und die Ausgabe auf. Der Code ist im Allgemeinen umfangreich, daher werde ich die wichtigsten Fragmente ver?ffentlichen.
Vereinfachtes Schleifencodebeispiel:
<?php extract($displayData); /** * Layout variables * ----------------- * @var string $autocomplete Autocomplete attribute for the field. * @var boolean $autofocus Is autofocus enabled? * @var string $class Classes for the input. * @var string $description Description of the field. * @var boolean $disabled Is this field disabled? * @var string $group Group the field belongs to. <fields> section in form XML. * @var boolean $hidden Is this field hidden in the form? * @var string $hint Placeholder for the field. * @var string $id DOM id of the field. * @var string $label Label of the field. * @var string $labelclass Classes to apply to the label. * @var boolean $multiple Does this field support multiple values? * @var string $name Name of the input field. * @var string $onchange Onchange attribute for the field. * @var string $onclick Onclick attribute for the field. * @var string $pattern Pattern (Reg Ex) of value of the form field. * @var boolean $readonly Is this field read only? * @var boolean $repeat Allows extensions to duplicate elements. * @var boolean $required Is this field required? * @var integer $size Size attribute of the input. * @var boolean $spellcheck Spellcheck state for the form field. * @var string $validate Validation rules to apply. * @var string $value Value attribute of the field. * @var string $dataAttribute Miscellaneous data attributes preprocessed for HTML output * @var array $dataAttributes Miscellaneous data attribute for eg, data-* * @var string $valueTitle * @var array $canDo * @var string[] $urls * @var string[] $modalTitles * @var string[] $buttonIcons */
Zweite. Der Link-Tag-Code muss Datenattribute mit den von uns ben?tigten Daten enthalten. Wir haben dieses Fragment im Beispielcode des Warenausgangszyklus gesehen.
<?php /** * Name of the layout being used to render the field * * @var string * @since 3.7 */ protected $layout = 'joomla.form.field.email';
JavaScript-Verarbeitung. Senden von Daten vom an das Feld im übergeordneten Fenster
Jetzt beginnen wir mit der Arbeit mit JavaScript. W?hrend des Schreibens des Artikels sind Nuancen aufgetaucht, die es uns erm?glichen, über alte und neue Arbeitsweisen zu sprechen.
Wir erinnern uns, dass wir im Laufe der Arbeit die folgenden js-Skripte verbunden haben
- media/system/js/fields/modal-fields.min.js – diese Datei wurde in der Klasse des Artikelauswahlfelds eingebunden. Allerdings k?nnen wir jetzt sagen, dass dies ein Archaismus und eine veraltete Arbeitsmethode ist. Diese Datei wird nicht mehr ben?tigt. Wir haben es in unserem PHP-Kurs auskommentiert.
- media/plg_wtproductbuilder_providerjoomshopping/js/providerjoomshopping.modal.js – unsere eigene js-Datei.
Beginnen wir mit unserem eigenen Javascript. Hier erhalten wir mithilfe der Select-Link-Klasse alle Selektoren und h?ngen den Listener des Klickereignisses an sie.
<?php use Joomla\CMS\Layout\LayoutHelper; $displayData = [ 'src' => $this->item->image, 'alt' => $this->item->name, ]; echo LayoutHelper::render( 'joomla.html.image', $displayData );
Wenn mit ID und Titel alles intuitiv ist, dann ist es mit dem Datenobjekt und der PostMessage für diejenigen, die es gewohnt sind, mit Joomla zu arbeiten, m?glicherweise nicht offensichtlich.
Wie es in Joomla 3 und Joomla 4 war
Zuvor wurde in Joomla 2.5, 3.x und sogar in 4.x der folgende Ansatz verwendet: Im Layout der Feldausgabe haben wir ein Inline-Skript verwendet, um eine Handler-Funktion an das Fenster zu h?ngen, und von < ;iframe> Wir haben es als window.parent[functionName] bezeichnet. Schauen Sie sich diesen Code an
<field type="productlist" name="product_id" addfieldprefix="Joomla\Plugin\Wtproductbuilder\Providerjoomshopping\Field" label="Field label" hint="Field placeholder" />
In diesem Formular wurde der Funktionsname im Datenfunktionsattribut jedes Links in der Liste der Artikel/Kontakte/Menüelemente angegeben. Und die Funktion selbst wurde inline platziert, wobei ihr Name manchmal mit einer zus?tzlichen ID vereinheitlicht wurde. Beispiel: "jSelectArticle_".$this->id.
Die jSelectArticle()-Funktion oder eine ?hnliche Funktion (wir h?tten jSelectProduct()) ist ein Wrapper für die Standardfunktion ?processModalSelect()“ aus der Datei modal-fields.min.js . Es ruft wiederum die Funktion ?processModalParent()“ auf und schlie?t das modale Fenster nach der Ausführung.
Damit diese Funktion funktioniert, musste sie eine Reihe von Parametern angeben: den Typ der Entit?t (Artikel, Kontakt usw.), das Pr?fix des Felds (das sich in der Praxis als ID des HTML-Feldselektors herausstellte) und die tats?chliche ID und Titel – die Parameter, die wir ben?tigen usw.
In einer Funktion wurde alles für alle Gelegenheiten gesammelt. Dort wurden die Daten in unserem Bereich platziert.
Wie es in Joomla 5 wurde
Jetzt, in Joomla 5, wird diese Datei jedoch nicht mehr ben?tigt. Wenn wir das Standardlayout der Feldausgabe verwenden, ist das Asset ?Modal-Content-Select-Field“ damit verbunden und funktioniert auf eine neue Art und Weise.
Jetzt stellt das Joomla 5-Frontend auf die Verwendung von JavaScript postMessages um. Da noch nicht alle alten Erweiterungen bereit sind, auf neue Schienen umzusteigen, wurde das Flag JoomlaExpectingPostMessage implementiert, mit dem Sie veraltete Methoden zum Aufrufen von Ereignissen unterscheiden k?nnen. Es hat einen indirekten Zusammenhang mit der beschriebenen Arbeitsweise, kann aber für jemanden nützlich sein. Dieses Flag wird nach dem vollst?ndigen übergang zu postMessages entfernt.
Jetzt brauchen wir also keine zus?tzlichen Attribute von Links mit dem Namen der aufgerufenen Funktionen. Stattdessen verwenden wir den postMessage-Mechanismus. Dazu müssen wir im Datenobjekt den Parameter messageType gleich joomla:content-select angeben. Warum? Aus Sicht von JavaScript sieht die Arbeit in Joomla wie folgt aus:
- Auf einen Link klicken und Linkattribute abrufen
- Senden einer Nachricht an das übergeordnete Fenster window.parent.postMessage(data)
- Die Datei media/system/js/fields/modal-content-select-field.js ist im übergeordneten Fenster verbunden, wo es einen Listener für das Nachrichtenereignis gibt.
- Es prüft den Nachrichtentyp und wenn es sich um joomla:content-select handelt, werden die Werte in die erforderlichen Felder eingefügt und das modale Fenster wird geschlossen
Beim Studium des Joomla-Kerncodes und der Suche nach einer L?sung bin ich natürlich auf die Funktionen jSelectArticle() und dergleichen gesto?en. Dann stie? ich auf postMessage und beschloss, meinem MessageType einen langen, eindeutigen Namen zu geben. Damit es funktioniert, habe ich meine eigene Verarbeitung geschrieben und die (wie sich herausstellte, veraltete) Funktion ?processModalSelect()“ aufgerufen. Und ich wurde mit der Tatsache konfrontiert, dass sich das modale Fenster überhaupt nicht schlie?en wollte, obwohl die Daten korrekt in die Felder eingefügt wurden. Weitere Suchvorg?nge führten zun?chst zum richtigen Ereignistyp und dann zur Entfernung unn?tiger Skripte und zur Vereinfachung des gesamten Codes.
Zusammenfassung
Joomla stellt dem Entwickler einen umfangreichen Satz an Tools zur Verfügung, mit denen er Daten aus Drittquellen bearbeiten und abrufen und in Ihrem Code verwenden kann. Die Arbeit mit JForm-Feldern ist für einen Entwickler wichtig, wenn er eigene Erweiterungen erstellt, insbesondere wenn eine Aufgabe gel?st werden muss, die über den typischen Rahmen hinausgeht. Natürlich ist ein solches modales Fenster und die Auswahl der Daten darin ein eher Sonderfall, aber auf diese Weise k?nnen Sie sowohl beliebige andere JForm-Felder überschreiben als auch eigene Typen mit Ihrer eigenen UX-Logik erstellen.
Ressourcen der Joomla-Community
- https://joomla.org/
- Dieser Artikel im Joomla Community Magazine
Das obige ist der detaillierte Inhalt vonErstellen eines benutzerdefinierten Formularfeldtyps in Joomla anhand des Modal Select-Beispiels. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen

ToversionAPHP-basiertApieffektiv, useUrl-basiertversionsforclarityAndaseFrouting, separateversionedCodetoAvoidConflicts, DeprecateoldversionswithClearcommunication, und considercustomheadsonlywaNno.

TosecurelyHandleAuthenticationAuthorizationInphp, folge theSteps: 1.Alwayshashpasswordswithpassword_hash () und password_verify (), usePreeParedStatementStopreventsQlinjapitca und StoreuserDatain $ _SessionArtelogin.2.ImplementscaChescescesc

Phpdoesnothaveabuilt-inWeakmapbutoffersWeakreferenceForsimilarFunction.1.WeakreferenceAllowsholdingReferences WithoutPreventingGAGECollection

ProzeduralandObject-orientedProgramming (OOP) inPhpdifferS sisideftribitionInstructure, Wiederverwendbarkeit und datahandling.1.ProceduralProgrammingusSfunctions-organisierte Folgesequentiell, optableForsmallscripts.

Um Datei -Uploads in PHP sicher zu verarbeiten, besteht der Kern darin, Dateitypen zu überprüfen, Dateien umzubenennen und die Berechtigungen zu beschr?nken. 1. Verwenden Sie Finfo_File (), um den realen MIME -Typ zu überprüfen, und nur bestimmte Typen wie Bild/JPEG sind zul?ssig. 2. Verwenden Sie Uniqid (), um zuf?llige Dateinamen zu generieren und sie im Root-Verzeichnis ohne Web zu speichern. 3.. Begrenzen Sie die Dateigr??e durch Php.ini- und HTML -Formulare und setzen Sie die Verzeichnisberechtigungen auf 0755; 4. Verwenden Sie Clamav, um Malware zu scannen, um die Sicherheit zu verbessern. Diese Schritte verhindern effektiv Sicherheitslücken und stellen sicher, dass der Upload -Prozess des Datei -Uploads sicher und zuverl?ssig ist.

In PHP ist der Hauptunterschied zwischen == und == die Strenge der Typprüfung. == Die Konvertierung des Typs wird vor dem Vergleich durchgeführt, beispielsweise 5 == "5" gibt true zurück und === fordert an, dass der Wert und der Typ gleich sind, bevor True zurückgegeben wird, z. B. 5 === "5" gibt false zurück. In den Nutzungsszenarien ist === sicherer und sollte zuerst verwendet werden, und == wird nur verwendet, wenn die Typumwandlung erforderlich ist.

Ja, PHP kann mit NoSQL -Datenbanken wie MongoDB und Redis durch bestimmte Erweiterungen oder Bibliotheken interagieren. Verwenden Sie zun?chst den MongoDBPHP -Treiber (installiert über PECL oder Composer), um Client -Instanzen zu erstellen und Datenbanken und Sammlungen zu betreiben, wobei Sie Insertion, Abfrage, Aggregation und andere Vorg?nge unterstützen. Zweitens verwenden Sie die Predis Library oder PHPREDIS-Erweiterung, um eine Verbindung zu Redis herzustellen, Schlüsselwerteinstellungen und -akquisitionen durchzuführen und PHPREDIS für Hochleistungsszenarien zu empfehlen, w?hrend Predis für die schnelle Bereitstellung bequem ist. Beide sind für Produktionsumgebungen geeignet und gut dokumentiert.

Die Methoden zur Verwendung grundlegender mathematischer Operationen in PHP sind wie folgt: 1. Additionszeichen unterstützen Ganzfaktoren und Floating-Punkt-Zahlen und k?nnen auch für Variablen verwendet werden. String -Nummern werden automatisch konvertiert, aber nicht für Abh?ngigkeiten empfohlen. 2. Subtraktionszeichen verwenden - Zeichen, Variablen sind gleich, und die Typumwandlung ist ebenfalls anwendbar. 3. Multiplikationszeichen verwenden * Zeichen, die für Zahlen und ?hnliche Zeichenfolgen geeignet sind; 4. Division verwendet / Zeichen, die vermeiden müssen, durch Null zu dividieren, und beachten Sie, dass das Ergebnis m?glicherweise schwimmende Punktzahlen sein kann. 5. Die Modulzeichen k?nnen verwendet werden, um ungerade und sogar Zahlen zu beurteilen, und wenn negative Zahlen verarbeitet werden, stimmen die Restzeichen mit der Dividende überein. Der Schlüssel zur korrekten Verwendung dieser Operatoren liegt darin, sicherzustellen, dass die Datentypen klar sind und die Grenzsituation gut behandelt wird.
