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
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
Selbst mit we:write habe ich Probleme. Das Objekt wird angelegt - ändern kann ich es aber dann nicht mehr über das Frontend.
<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.
Hat jemand einen Tipp, woran das hängen könnte?
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?
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.
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
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
$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.
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
![]()
Danke dir Finn, das werde ich ausprobieren!
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.
Das werde ich - vielen Dank für die Hilfe schonmal. ![]()
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 ![]()
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:
<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.
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.
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:
Don’t have an account yet? Register yourself now and be a part of our community!