1. Dashboard
  2. Articles
  3. Forum
  • Login or register
  • Search
This Thread
  • Everywhere
  • This Thread
  • This Forum
  • Articles
  • Pages
  • Forum
  • More Options
  1. webEdition Forum
  2. Forum
  3. Deutschsprachiges Support Forum
  4. webEdition Administrationsoberfläche
  5. webEdition Module
  6. DB- / Objektmodul

Feld eines Objekts im Frontend ändern

  • schmitter
  • January 19, 2024 at 5:20 PM
1st Official Post
  • schmitter
    Student
    Reactions Received
    6
    Posts
    62
    • January 19, 2024 at 5:20 PM
    • #1

    Hallo zusammen,

    gibt es aktuell eine elegante (PHP-)Lösung, um einen Feldwert eines Objekts aus dem Frontend zu ändern, ohne dass man mit we:write und einem Formular arbeiten muss?

    Vielen Dank und viele Grüße

    Thomas

  • schmitter
    Student
    Reactions Received
    6
    Posts
    62
    • January 21, 2024 at 5:40 PM
    • #2

    Selbst mit we:write habe ich Probleme. Das Objekt wird angelegt - ändern kann ich es aber dann nicht mehr über das Frontend.

    Code
    <we:sessionStart />            
    
    <we:ifVar match="Abschicken" name="Abschicken" operator="equal" type="post">
        <we:write type="object" formname="anmeldung" publish="true" searchable="true" classid="4" onduplicate="overwrite" forceedit="true"  />
    </we:ifVar>
    
    <we:form type="object" id="self" name="anmeldung" method="post" classid="4" parentid="168">                    
        <we:userInput type="textinput" name="Bezeichnung" />                    
        <we:userInput type="hidden" name="System" value="1" />
        <we:userInput type="hidden" name="Typ" value="1" />
        <we:userInput type="textinput" name="Teilnehmer" />
        <we:userInput type="hidden" name="Status" value="1" />
        <input type="submit" class="btn btn-primary" name="Abschicken" value="Abschicken">                    
    </we:form>    
    Display More

    Im Quellcode wird die ID des Objekts im Formular gesetzt.

    Code
    <input type="hidden" name="we_editObject_ID" value="220">

    Hat jemand einen Tipp, woran das hängen könnte?

  • schmitter
    Student
    Reactions Received
    6
    Posts
    62
    • January 21, 2024 at 9:08 PM
    • #3

    Und wo ich schonmal bei den Fragen bin ;) : Hat jemand auch noch einen Tipp, wie ich mehrere Objekte auf erzeugen kann, ohne dass ich jedes Mal das Formular abschicken muss?

  • Finn
    Administrator
    Reactions Received
    12
    Posts
    295
    • January 23, 2024 at 11:30 AM
    • Official Post
    • #4

    Ich lege mehrere Objekte über PHP an.

    Bzw. ich verarbeite die Formulardaten mit PHP und sende diese dann Backendseitig als einzelne Form Requests an ein we:write Template.

    https://www.wg-werbeagentur.de

    • Next Official Post
  • schmitter
    Student
    Reactions Received
    6
    Posts
    62
    • January 23, 2024 at 2:38 PM
    • #5

    Servus Finn,

    Danke schonmal für die Info, dass es geht und wie du das machst. Funktioniert das dann auch, dass du damit die Objekte bearbeiten / ändern kannst? Vor dem Problem stehe ich nämlich noch - selbst mit einem normalen Formular funktioniert das nämlich nach mehrmaligen Ausprobieren nicht. Ich habe deswegen einen Eintrag in die Bugbase gemacht.

    Und dann ist mir beim Durchforsten der beiden Foren aufgefallen, dass es da ja bereits einen Vorschlag für das Feature gibt. Ist das schon in der Bugbase drin?

    Greetz

    Thomas

  • Finn
    Administrator
    Reactions Received
    12
    Posts
    295
    • January 23, 2024 at 6:10 PM
    • Official Post
    • #6

    Moin Thomas,

    was den aktuellen Stand angeht kann ich gerade nichts zu sagen aber was für mich super funktioniert, auch für Änderungen:

    (Template welches neue Objekte schreibt oder bestehende Ändert, basierend darauf, ob eine ID mitgeliefert wird oder nicht.)

    Achtung! Je nachdem wie dein Dokument aufrufbar ist, braucht es hier zusätzliche Sicherheitsabfragen!

    PHP
    <?php 
    $GLOBALS['objectNewID'] = 0;
    $classID = $_POST['classID']; 
    $GLOBALS['objectNewID'] = $_POST['we_editObject_ID']; // Kann eventuell weg fallen...
    $dataChanged = false;
    $idForCheck = $GLOBALS['objectNewID'];
    
    /**
    * Wenn eine ID vorhanden ist, schreiben wir das Objekt mit PHP, falls nicht mit we:write
    **/
    ?>
    
    <we:ifVar match="0" name="we_editObject_ID" type="post">
        <we:comment>Hier wird ein neues Objekt geschrieben</we:comment>
    
        <we:write type="object" publish="true" classid="$classID" onduplicate="overwrite" onpredefinedname="appendto" forceedit="true" protected="false" searchable="true"  />
        
        <we:ifWritten type="object">
            <we:setVar from="request" to="global" namefrom="we_editObject_ID" nameto="objectNewID" />
        </we:ifWritten>
    
        <we:else />
    
        <we:object id="\$objectNewID" >
            <we:comment>Inhalte für einen Vergleich laden. Stimmt der aktuelle Content mit dem neuen Überein, wird kein Log geschrieben.</we:comment>
            <we:field name="Content" type="text" to="global" nameto="Content" />
        </we:object>
    
        <we:comment>Hier wird ein vorhandenes Objekt überschrieben</we:comment>
        <?php
    
        if(isset($_POST['we_ui_we_global_form']['Content']) && $_POST['we_ui_we_global_form']['Content'] === $GLOBALS['Content']){
            $dataChanged = true;
        }
    
        $object = new we_contents_objectFile();
        $object->initByID($GLOBALS['objectNewID']);
    
        foreach ($_POST['we_ui_we_global_form'] as $key => $content) {
            // check if the value is int or string, if int, convert to int -> we need it after POST 
            if (is_numeric($content)) $content = (int)$content;
    
            // get the type of the field
            $type = gettype($content);
    
    
            // set the content based on the type
            if ($type == 'integer')
                $object->setElementI($key, $content); // setElementS() for string, setElementI() for integer and setElementB() for binary
            elseif ($type == 'boolean')
                $object->setElementB($key, $content); // setElementS() for string, setElementI() for integer and setElementB() for binary
            else
                $object->setElementS($key, $content); // setElementS() for string, setElementI() for integer and setElementB() for binary
        }
        $object->we_publish();
        ?>
    </we:ifVar>
    
    <?php
    echo $GLOBALS['objectNewID']; 
    return;
    ?>
    Display More


    Funktion welches das Formular erstellt und sendet. (Bei mir Teil einer Objektklasse, welche die entsprechenden Funktionen bereitstellt.)

    Wenn mehrere Objekte erstellt werden sollen, dann kann diese Funktion mehrfach aufgerufen werden. Der Return Wert ist dann die ID des geschriebenen Objekts.

    Code
    public function createFormular(int $id, array $content, int $classID, string $url){
    
            foreach ($content as $key => $value) {
                $content['we_ui_we_global_form'][$key] = $value;
                unset($content[$key]);
            }
    
            $content["classID"] = $classID;
            $content['edit_object'] = 1;
            $content['we_editObject_ID'] = $id;
    
            $content = http_build_query($content);
    
            $options = array(
                'http' => array(
                    'header'  => "Content-type: application/x-www-form-urlencoded",
                    'method'  => 'POST',
                    'content' => $content,
                ),
            );
    
            $context = stream_context_create( $options );
            $result = file_get_contents( $url, false, $context );
            return $result;
        }
    Display More

    Mal als kleine Anregung. Man kann damit wilde Konstukte bauen, glaub mir :saint: :saint: :saint:

    https://www.wg-werbeagentur.de

    • Previous Official Post
    • Next Official Post
  • schmitter
    Student
    Reactions Received
    6
    Posts
    62
    • January 23, 2024 at 6:18 PM
    • #7

    Danke dir Finn, das werde ich ausprobieren!

  • Finn
    Administrator
    Reactions Received
    12
    Posts
    295
    • January 23, 2024 at 6:23 PM
    • Official Post
    • #8

    Wenn du Fragen hast, sag bescheid! Was die createFormular Funktion macht, ist ein Formular in der Syntax zu erstellen, wie es auch ein Frontend Formular tut.

    Wichtig ist, dass das $content Array die Feldnamen des Objekts beinhaltet. Die url ist dann die empfangende Seite mit dem Template darüber. Das kann verschlankt werden. Die content Abfrage und den Vergleich etc. brauchst du für die Grundfunktionalität nicht undbedigt, ich schreibe danach noch ein Log Objekt, deswegen der Vergleich ob sich was verändert hat.

    https://www.wg-werbeagentur.de

    • Previous Official Post
    • Next Official Post
  • schmitter
    Student
    Reactions Received
    6
    Posts
    62
    • January 23, 2024 at 6:32 PM
    • #9

    Das werde ich - vielen Dank für die Hilfe schonmal. :thumbup:

  • schmitter
    Student
    Reactions Received
    6
    Posts
    62
    • January 26, 2024 at 5:18 PM
    • #10

    Sodele. Es konnte geklärt werden, warum die Objekte nicht geändert werden konnten. Nachdem ich das Objekt mit we:write erstellt hatte, habe ich es in wE geöffnet, um zu prüfen ob auch alle Werte übernommen wurden.

    Dann habe ich eine Änderung im Frontend angestoßen, die aber nicht übernommen wurde. Der Grund war, dass das Objekt noch im Backend von wE offen war. Ist das Objekt geschlossen, werden die Werte ohne Probleme übernommen. [https://qa.webedition.org/view.php?id=14212]

    Finn: Ich bin leider immer noch nicht dazu gekommen, deine Lösung auszuprobieren :whistling:

  • Revilo
    Beginner
    Reactions Received
    1
    Posts
    23
    • April 2, 2025 at 12:13 PM
    • #11

    Hallo zusammen,

    ich hänge mich hier mal mit dran.

    Ich möchte, dass Nutzer über das Frontend nachträglich Objekte bearbeiten können.
    Mit we:write bin ich leider nicht weitergekommen, aber mit deinem Code Finn habe ich es hinbekommen, dass Änderungen am Objekt gespeichert werden.

    Nun ist nur noch die Problematik, dass Bilder nicht hochgeladen/gespeichert & in das Objekt eingetragen werden, wenn diese geändert werden. Das wird wohl vom we:write Befehl mit übernommen, wie ich in den Core-Dateien gesehen habe.

    Upload-Feld im Formular:

    Code
    <we:ifNotFieldEmpty name="Bild2" type="img">
    	<we:field type="img" name="Bild2" to="global" nameto="setBild2"/>
    	<we:field type="img" name="Bild2" thumbnail="editmode" class="me2" />
    <we:else/>
    	<we:setVar to="global" nameto="setBild2" value=""/>
    </we:ifNotFieldEmpty>
    
    <we:userInput type="img" name="Bild2" parentid="644" inputclass="form-control" keepratio="true" width="1920" height="960" value="\$setBild2" />

    Habt ihr eine Idee wie ich das erreichen kann?

    Viele Grüße
    Oliver

    Nachtrag:
    Ich habe die Upload-Felder im Formular mal entfernt und dann hat es auch problemlos mit we:write geklappt.
    Ist der Aufbau des <we:userInput type="img"> falsch?
    Feldnamen etc. sind genau so, wie beim Formular für das Erstellen des Objekts. Da klappt es problemlos.

    Edited once, last by Revilo (April 2, 2025 at 12:23 PM).

  • Finn
    Administrator
    Reactions Received
    12
    Posts
    295
    • April 2, 2025 at 12:34 PM
    • Official Post
    • #12

    Welche Art der Formularübertragung nutzt du?
    Wichtig ist, dass die Daten als post mit enctype="multipart/form-data" übertragen werden, wenn Binarys dabei sind.

    https://www.wg-werbeagentur.de

    • Previous Official Post
  • Revilo
    Beginner
    Reactions Received
    1
    Posts
    23
    • April 2, 2025 at 1:10 PM
    • #13

    enctype="multipart/form-data" ist gesetzt.

    Dem userInput type="img" ein Value zu übergeben war natürlich Quatsch.

    we:write beachtet das scheinbar eh und überschreibt den Wert im Gegensatz zu z.B. Textfeldern nicht, wenn er leer übermittelt wird.

    Wenn ich keine Datei auswähle, klappt das Speichern der Änderungen im Objekt nun wunderbar mit we:write. Wenn im Objekt keine Datei hinterlegt ist und ich eine nachträglich auswähle und über das Formular hochlade, klappt es auch mit we:write.

    Es klappt nur nicht, wenn im Objekt bereits eine Datei hinterlegt ist und ich diese überschreiben will. Ist das so gewollt? Vermutlich werde ich das im Frontend einfach anpassen müssen und zuerst eine "Bild löschen" Funktion bieten, bevor ein neues Bild hochgeladen werden darf.

    Anbei noch der write-Befehl:

    Code
    <we:write type="object" formname="memberEditObject" classid="1" onduplicate="overwrite" onpredefinedname="overwrite" forceedit="true" name="\$Name" />

    Edited 2 times, last by Revilo (April 2, 2025 at 1:18 PM).

Participate now!

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

Register Yourself Login

Donations

200.00 EUR

Donate now
  1. Privacy Policy
  2. Legal Notice
Powered by WoltLab Suite™