Felder in Formularen ausblenden, wenn Checkbox nicht angewählt wurde

  • Hallo,


    ohne es böse zu meinen: Du solltest Dich wirklich mit den Grundlagen beschäftigen. Typescript ist für mich auch immer wieder herausfordernd, aber Du kannst keinen Motor vom Auto wechseln, wenn Du zwischendurch andere Parteien fragen musst, was im Werkzeugfach eigentlich für Schraubenschlüssel liegen. Das geht nach hinten los und dann entsteht relativ fix ein XY Problem. 

  • Du solltest Dich wirklich mit den Grundlagen beschäftigen.

    Das mache ich doch die ganze Zeit, und dabei kommen immer wieder Fragen. Nachdem ich dann schon mehrfach in Google und auch hier gesucht habe, finde ich keine Antwort die mir Hilft. Darum frage ich halt immer diese Sachen.

    So einfach ist das. Ich wiederhole mich gerne nochmal: Ich habe keine einzige Stunde irgendwelche IT-Geschichten in der Schule oder im Studium gehabt. Alles was ich weiß, habe ich mir selbst beigebracht. Dass es da natürlich immer wieder Fragen gibt, ist doch auch wohl klar und logisch. Und da es sich dabei auch um WoltLab dreht, weil ja das verwendete dann in der WoltLab Suite Core mit eingebunden werden soll, frage ich natürlich auch hier nach.

    Ich bin aber kein Spezialist und verstehe auch leider nicht immer alles was hier geschrieben wird, darum frage ich da nochmal nach.

    Und ganz ehrlich, Grundlagen sind das nicht. Das ist für mich schon höheres Niveau. Ihr denkt vielleicht immer aus sicht eines gelernten IT-Fachmanns.... oder eines Software-Informatikers. Da mag das alles Grundlagen und selbstverständlcihes Wissen sein. Für mich ist das alles definitiv NICHT grundlegendes Wissen.


    Wenn Ihr mir einen Tipp geben könnte, wo ich vielleicht ein gutes Buch zum Selbst-Studium her bekomme oder wo ich dieses "Grund"-Wissen sonst erlernen kann, dann bitte her mit den Infos... Ich will es ja erlernen. Aber die Frage ist halt, wie...

  • Aus sicht eines gelernten IT-Fachmanns.... oder eines Software-Informatikers

    ein gutes Buch zum Selbst-Studium her bekomme oder wo ich dieses "Grund"-Wissen sonst erlernen kann, dann bitte her mit den Infos

    Also ich habe absolut nichts in die Richtung gelernt und auch kein Buch dafür benutzt.

    Aber ich sehe hier einen klaren Fall von: Nötig wäre hier erstmal das Lernen zu lernen.

    Google (für Problemlösung & Tutorials), ChatGPT (kannst alles fragen, sogar sehr spezifisch), Dokumentationen (von WoltLab), Code selbst lesen und verstehen (siehe WoltLabs Repositories auf GitHub oder Fremdplugins).

    Und erst wenn alles scheitert, dann sollte man hier Fragen stellen. Verständnis habe ich z. B. auch wenn jemand nur kleine Anpassungen selbst durchführen möchte, aber da sind wir hier ja schon lange drüber.

    Managed Webhosting, hochwertige Plugins und individuelle Auftragsarbeiten:

    Julian-Pfeil.de

  • Google (für Problemlösung & Tutorials)

    Hab ich schon probiert, aber das nützt mir nix, weil es nicht speziell für den Bereich etwas gibt, wofür ich es brauche.

    ChatGPT (kannst alles fragen, sogar sehr spezifisch)

    Habe ich auch schon mal gefragt, aber auch da kommen Antworten die nicht gerade verständlich sind oder einfach nicht anwendbar sind. Vielleicht Frage ich aber da auch nicht richtig, gut möglich.

    Dokumentationen (von WoltLab), Code selbst lesen und verstehen (siehe WoltLabs Repositories auf GitHub oder Fremdplugins).

    Habe ich auch probiert... und komme damit auch nicht klar.

    Und erst wenn alles scheitert,

    Das ist bei mir leider so gewesen....

    dann sollte man hier Fragen stellen.

    habe ich hier ja dann gemacht.

  • Da brauchen wir eigentlich gar nicht weiter diskutieren.

    Beides wäre im Doc oder per Google herauszufinden. Das sagt doch schon alles:

    Siehe auch schon meine vorherige Antwort, wie leicht es für mich war die Antwort zu googeln. Und auch hier im Forum wurden 95% der Fragen schon gestellt und sind über die Suche zu finden.

    Wenn du wirklich alles probiert hast, dann schreibe am besten, was du schon probiert hast und ganz spezifisch, was es noch als Problem gibt. Dann probiere doch TypeScript selbst gemäß Doku zu kompilieren und wenn es dabei ein Problem gibt, erkläre was du gemacht hast und woran es hakt.

    Managed Webhosting, hochwertige Plugins und individuelle Auftragsarbeiten:

    Julian-Pfeil.de

    Edited once, last by Julian Pfeil (May 1, 2024 at 4:18 PM).

  • Dann probiere doch TypeScript selbst gemäß Doku zu kompilieren und wenn es dabei ein Problem gibt, erkläre was du gemacht hast und woran es hakt.

    Das wollte ich ja tun, doch vorher wollte ich erstmal Wissen, was welche Zeile vom Code ausführt. Was bringt es mir denn, wenn ich einen Code bekomme und nicht weiß, was dieser macht. Darum habe ich ja auch geschrieben:

    So ganz verstehe ich die Funktion da oben nicht...

    Bevor ich dann blind versuche, irgendwas zu programmieren, sollte man doch wissen wie es funktioniert.

    sehe ich auch so. Beschreibe bitte die spezifischen Probleme, die du noch mit dem WSC hast

    Ich werde jetzt mal TS ausprobieren und bei Problemen die ich nicht Lösen kann, auch nicht mit Hilfe von Google, GitHub, Dokumentation, ChatGPT, etc. hier noch mal Fragen.

    PS: Eine ausführlichere Antwort gibt's kostenlos von mir leider nicht

    Das soll es ja auch nicht. ABer wenigstens einen Hinweis, wo der Fehler ist und einen Hinweis, wie man den Fehler lösen kann, wäre dann toll.

  • Was du machen müsstest, wäre folgendes:
    Du erstellst für jede systemID ein eigenes Selection-Feld für planetID, welches nur angezeigt wird, wenn die jeweilige systemID ausgewählt wurde.
    Dann wird gleichzeitig immer maximal ein Selection-Feld pro planetID angezeigt. Du musst natürlich dann noch einen Data-Handler der Form hinzufügen, damit an did. Action-Class die korrekten Werte übermittelt werden.
    Beachte auch, du kannst nicht die selbe ID/Name für das Feld hier verwenden, nutze daher so etwas wie planetID${systemID}.

    Das habe ich jetzt mal probiert. Allerdings gibt es in diesem Fall folgendes Problem:

    Wenn die ID des Feldes nicht so geschrieben ist, wie die Datenbank-Spalte, wo der Wert eingetragen werden soll, dann kann der FormBuilder natürlich nicht wissen, in welche DB-Spalte er diesen Wert hinterlegen soll.

    Folgendes habe ich aber schon mal ausprobiert, und es scheint zumindest so zu funktionieren, bis auf das Abspeichern:

    Die Data-Klasse SARPlanet:

    Die HelpMeForm:

    Das sieht soweit ganz gut aus. Wie kann ich denn nun, nachdem ich das Speichern gedrückt habe, der FormBuilder den Query zur DB erstellt, den Namen von SelectFormField::create('planetID'.$parentSystemID) so ändern, dass hier dann nur noch planetID übrig bleibt?


    Denn beim Abspeichern kommt folgender Fehler:

    Code
    Original Error
    
    Error Message:
    
    SQLSTATE[42S22]: Column not found: 1054 Unknown column 'planetID1' in 'field list'

    Ist ja auch logisch. Die Spalte heißt ja nur "planetID" .

    Wie kann ich denn in dem großen Datenpaket aus "$this->form" in der Funktion "save()" meiner HelpM;eForm-Klasse den Wert entsprechend anpassen?

    Habt Ihr da eine Idee?

    Im Array ist ja "planetID1" und "planetID2" definitiv nicht korrekt. Da darf nur "planetID" stehen.


    Eine Idee, wie ich das anstellen kann? Oder wie bekomme ich es denn hin, in der create() - Funktion das Feld so zu erstellen, dass immer die ID "planetID" nur vorhanden ist?

    Ich habe schon versucht, die Foreach-Schleife zu versetzen, aber da finde ich keine passende Stelle ohne eine Fehlermeldung.

    Das sind dann immer Format-Fehler, weil halt eine Foreach-Schleife nicht mitten in einem Field im Code verwendet werden kann.

    Warum habe ich das so gemacht mit der ID des Feldes:

    Beachte auch, du kannst nicht die selbe ID/Name für das Feld hier verwenden, nutze daher so etwas wie planetID${systemID}.

    Ich habe auch die Variante mit dem Erstellen eines Javascripts mir angeschaut. Da verstehe ich nicht, wie ich zum Beispiel das JavaScript so ansprechen kann, dass es nur auf meiner Seite mein Auswählen des Systems (mit dem Value "systemID") dann das nächste Feld generiert. Es muss doch dann irgendwie auf meine Klasse zugreifen. Woher erkennt denn der FormBuilder, oder das JS, dass es auf der Seite "HelpMeForm" aktiv sein soll und an der entsprechenden Stelle dann eingreifen soll und ein weiteres Feld generieren soll? Das habe ich noch nicht verstanden. Wo ist der die Verbindung vom JS zur Seite und dem entsprechendem Feld? Wenn mir das noch einer erklären könnte, wie das WSC das erkennt, welches Feld/Formular damit gemeint ist... Das wäre nett.

  • Du verwendest immer noch ein AbstractFormBuilderForm, das solltest du ändern am besten auf eine AbstractPage.
    Der FormBuilder sollte nur noch per JavaScript, in deinem Fall, erstellt werden.

    Wie vorher geschrieben, sollten die Formulare in deiner DatabaseObjectAction erstellt werden. Die du über JavaScript zu einem Dialog machst und dann immer eine Abfrage nach der anderen hast.

    Ich habe schon versucht, die Foreach-Schleife zu versetzen, aber da finde ich keine passende Stelle ohne eine Fehlermeldung.

    PHP: array_map - Manual
    Das könnte dir helfen ;)

    Wenn die ID des Feldes nicht so geschrieben ist, wie die Datenbank-Spalte, wo der Wert eingetragen werden soll, dann kann der FormBuilder natürlich nicht wissen, in welche DB-Spalte er diesen Wert hinterlegen soll.

    Validation and Data - WoltLab Suite Documentation

    Damit kannst du einen anderen Namen z.b. auf einen anderen Mappen oder verändern wie du möchtest.

  • Der FormBuilder sollte nur noch per JavaScript, in deinem Fall, erstellt werden.

    Um ehrlich zu sein, ist mir das etwas zu schwer. Ich habe mich jetzt lange mit dem TS und den JS auseinandergesetzt, kann aber leider nicht durchblicken, was welche Zeile genau macht und wie ich dann zum Beispiel den FormBuilder und das zu erstellende Formular im JS so erstellen kann, dass es auch dann so funktioniert, wie ich es wünsche. Ich sehe da gerade nicht den Vorteil vom JS.

    Wenn ich im JS den gleichen Code verwende wie im AbstractFormBuilder, kann er dann trotzdem nach dem Klick auf einen Select-Form das nächste Feld automatisch mit dem vorher gewählten Value auswählen?

    Soll heißen, lädt das Forumlar bei jedem Klick quasi im Hintergrund neu, wenn ich es mit JS erstelle?

    Weil sonst verstehe ich den Sinn nicht, das gesamte Formular mit JS zu erstellen, statt auf den normalen Weg mit dem AbstractFormBuilder.


    Wie ich schon erwähnte, habe ich nun versucht, das über den AbstractFormBuilder zu realisieren. Das ist für mich erstmal der leichtere Weg. Und ich würde auch gerne es nur hierüber versuchen.


    Dazu habe ich dann eine foreach-Schleife eingebaut, damit ich dort dann die ganzen Formular-Felder komplett erstelle und nur die einblenden lasse, die auch vorher ausgewählt wurden. Hier das Beispiel mit den Planeten:

    Am Ende habe ich mir die Namen der IDs, die ich definitiv löschen muss bzw. eines davon umbenenen muss, in das Array $this->insetIDs gespeichert.

    Das Array hat folgenden Inhalt:

    Code
    Array
    (
        [0] => planet2
        [1] => planet1
    )

    Nun muss ich ja vor dem Speichern der Daten in die Datenbank, die ganzen IDs im Array "$this->unsetIDs" aus den "$parameters" löschen, bis auf der Eintrag wo die "planetx" einen Eintrag bzw. einen Wert hat. Diesen Wert muss ich dann nur umbennen in "planetID". Damit wäre das Problem ja gelöst.

    Nun habe ich folgendes versucht:

    Allerdings werden die Variablen in der Funktion nicht erkannt. Das verstehe ich nicht. Es muss doch die Variable "$unsetID" innerhalb der Foreach-Schleife zur Verfügung stehen, oder nicht?

    Wenn das so wäre, dann muss ja eigentlich die Funktion folgendes machen:

    Erst schaut er nach, ob zum Beispiel der Parameter "$parameters['data']['planet2'] vorhanden ist und der Wert "$parameters['data']['planetID'] nicht vorhanden ist.

    Ist das der Fall, dann würde nun der string "$unsetID" (planet2) bearbeitet. Vorne werden 6 Zeichen weggeschnitten "planet" und somit bleibt nur noch die Zahl übrig. Die Zahl nach "planet" ist auch genau die ID vom Planetensystem = planetID aus der Datenbank.

    Dann schreibe ich den Parameter "$parameter['data']['planetID'] = $id" also = 2 mit in das Array $parameters.

    Danach lösche ich immer den nicht vorhandenen Eintrag mit "planet2" oder auch "planet1" etc.

    Anschließend wird das Array mit den Parametern zurückgegeben. Somit sollte es dann doch funktionieren. Theoretisch...


    ABER: Er erkennt anscheinend nicht die Variable "$umsetID". Die ist nicht in der Funktion gefüllt. Warum? Wie kann ich denn fremde Variablen mit in die Funktion einbinden, sodass ich dann innerhalb der Funktion entsprechende Bearbeitungen machen kann?


    Hier die Fehlermeldung:

  • Du machst es dir zu kompliziert. Du brauchst keine foreach schleife an dem Punkt um einen FormDataProcessor hinzuzufügen.

    Du hast doch Zugang zu dem Wert systemID dieser ist in $parameters['data']['systemID'] gespeichert. Kannst alternative auch $document->getNodeById(…) verwenden.
    Wenn du dies nimmst, kannst du auch die Variabel $this->unsetIDs entfernen die ist auch unnötig an diesem Punkt.

  • Du hast doch Zugang zu dem Wert systemID dieser ist in $parameters['data']['systemID'] gespeichert.

    Stimmt. Vielen Dank. Jetzt hat es auch funktioniert. Hier mal der fertige Code von der HelpMeForm.... ;)

    Hier die aktuellen Data-Klassen:

    SARMoon:

    SARPlanet:


    Vielen Dank für die Hilfe mit den "Umbauen" der Parameters. Geht also auch ohne JS... zum Glück für mich...

    Ist zwar nicht ganz so toll die Lösung, wenn man mehrere Systeme, und hunderte Planeten und tausende Monde hat, da ja diese dann alle irgendwie erst im CreateForm geladen werden, aber Hauptsache es läuft erstmal so.

    Dank an itsmeJAY und an Cyperghost für die unermüdliche Hilfe hier!

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!