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>
Alles anzeigen
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;
?>
Alles anzeigen
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;
}
Alles anzeigen
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
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!