Objekte mit php erstellen

Fragen zum Erstellen von Templates für webEdition.
ThomasGoebe

Re: Objekte mit php erstellen

Beitragvon ThomasGoebe » So 9. Okt 2022, 23:24

@Sascha

Schön, dass es in der Doku dazu Einträge gibt. Aber der Code von Haydi war auch mal in einer Doku. Vermutlich in der we:devedge. Beide, die we:devedge und die we:doku sind aber als nicht offziell und auch als nicht verbindlich anzusehen. Denn die Entscheidung, was wie funktionieren soll oder nicht treffen Entwickler, die das dann wiederum nicht oder nur rudimentär dokumentieren (soll ja die Community machen). Damit kannst Du Dich nie darauf verlassen, das solche Konstrukte mit dem nächsten Update noch funktionieren.
Daher galt mal der Satz: die Entwickler sorgen dafür, dass we:tags auch nach Updates noch funktionieren. Es muss also alles mit we:tags umgesetzt werden. Was damt nicht geht und mit PHP "rangeflickt" wird, geschieht auf eigene Gefahr.
Daran hat sich m.W. bis heute nichts geändert.
Es ist also seitens webEdition nicht vorgesehen, mit PHP Objekte oder Dokumente zu erstellen oder zu bearbeiten. Es ist egal, was in einer Community Doku steht, denn die wird so bei Updates nicht berücksichtigt und auch von den Entwicklern in der Regel nicht aktualisiert. Die von Dir verlinkten Beispiele sind natürlich genau die Ausnahme, denn da hat ein Entwickler die Funktion dokumentiert. Wer sollte das auch sonst tun, wenn Entwickler zeitgleich Entscheider und Umsetzer sind?

WBTMagnum
webEdition Partner
webEdition Partner
Beiträge: 1825
Registriert: Di 7. Mär 2006, 16:50
Wohnort: Wien
Kontaktdaten:

Re: Objekte mit php erstellen

Beitragvon WBTMagnum » Mo 10. Okt 2022, 09:45

@Thomas:
Ich sehe das aus so, dass die Situation nicht ideal ist. Wir können aber auch nicht erwarten, dass das Entwicklungs-Team alles übernimmt. Doku schreiben ist ein riesen Projekt, dass auch entsprechende Koordination erfordert.

Meiner Ansicht nach mangelt vor Allem am "empowerment" der Community. Hier braucht es gute Einstiegspunkte und niederschwellige Möglichkeiten zur Mitarbeit ("Wie kann ich ... Doku schreiben, Fehler melden, etc.").

Aber wir driften etwas ab vom eigentlichen Thema ;-)

Liebe Grüße,
Sascha

Benutzeravatar
Finn
Senior Member
Beiträge: 285
Registriert: Mo 3. Apr 2017, 13:37
Wohnort: Bremen
Kontaktdaten:

Re: Objekte mit php erstellen

Beitragvon Finn » Mo 17. Okt 2022, 14:52

haydi hat geschrieben: Do 27. Jan 2022, 10:00 Holaaa,

okay, hier mal ein php-Schnipselchen :-)

Code: Alles auswählen

	// in DB abspeichern
	$obj = new we_objectFile();
	$obj->we_new(); // wir legen ein neues an
	$obj->TableID = 1; // die Table-ID 
	$obj->setRootDirID(true);
	$obj->resetParentID();
	$obj->restoreDefaults();
	$obj->Text = date('Y-m-d_H-i-s').'-'.time(); // objektname, damit ist er unique 
	$obj->Path = $obj->getParentPath().(($obj->getParentPath() != "/") ? "/" : "").$obj->Text;
	$obj->setElement('timestamp', time()); // braucht's natürlich nicht... ich hab das ganz gerne
	$obj->setElement('tabellenfeld', 'tabelleninhalt'); // alle tabellenspalten können nun mit dem gewünschten wert gefüllt werden	
	$obj->setElement('tabellenfeld2', 'tabelleninhalt2');
	if (!$obj->we_publish()) {
		t_e('upsi, da hat was nicht geklappt);
	}
hoffe, das hilft :-)

liebe grüße
haydi
Hier für WE 9.x darf gerne erweitert werden: https://documentation.webedition.org/en ... t-data.php
Finn Thorwarth
WG Werbeagentur
https://www.wg-werbeagentur.de

Benutzeravatar
Finn
Senior Member
Beiträge: 285
Registriert: Mo 3. Apr 2017, 13:37
Wohnort: Bremen
Kontaktdaten:

Re: Objekte mit php erstellen

Beitragvon Finn » Mo 7. Nov 2022, 16:39

Moin Marc,
könntest du den Code zum Erstellen eines Objekts über PHP noch einmal skizzieren?

Ich komme nicht darauf, wie ich die Klasse zuweise.

Ich weiß, we:write sollte genutzt werden, aber wenn man Objekte mit einem JS Framework schreiben möchte, ist die Lösung über ein we:form nicht richtig praktikabel.
Finn Thorwarth
WG Werbeagentur
https://www.wg-werbeagentur.de

mokraemer
Senior Member
Beiträge: 3619
Registriert: So 8. Aug 2010, 01:23
Wohnort: Mainz

Re: Objekte mit php erstellen

Beitragvon mokraemer » Mo 7. Nov 2022, 21:41

@Finn: wir haben ja fast alles bereits da. we:form, we:input und dann we:write. Die Funktion setzt nur voraus, das es einmal an den Server abgeschickt wird. Wie wäre es sich, zu überlegen, was logisch wäre um das nun von WE mit Tags schreiben zu lassen? Dann würden diese Schnippsel, die bei einem Update kaputt gehen auch aufhören. Das ist ja etwas, was viel gefragt und benutzt ist. Man könnte bspw.

Code: Alles auswählen

<we:document type="object" class="17" [id="123"]>
<we:documentEntry name="feld" value="test"/>
<we:documentEntry name="feldX" valueFromRequest="feldName"/>
</we:document>
<we:write type="object"/>
Machen - ist jetzt mal ein Einfall von 2 Minuten nachdenken.
=> Sind die Tagnamen sinnvoll? Trägt das generell? hab ich was vergessen? Ich hoffe das man den type in Entry nicht braucht, weil der sich eigentlich aus dem Namen ergeben sollte (https://qa.webedition.org/view.php?id=13787).

Und btw. überall wo noch

Code: Alles auswählen

$obj = new we_objectFile();
steht, wird auch iwann entfernt - das ist alter Kode - der wirft auch schon seit WE 9 deprecated Notices!

Also, wäre das nicht der Zeitpunkt endlich hier mal was zu machen - oder soll das immer bei dem PHP Kode bleiben, der dann inkompatibel wird?
webEdition-Kern-Entwickler

ThomasGoebe

Re: Objekte mit php erstellen

Beitragvon ThomasGoebe » Di 8. Nov 2022, 01:45

@Marc: an sich ist der Ansatz ok.
Aber ich persönlich wünsche mir eher eine PHP API.

Beispiel: einmal im Monat lädt ein Kunde per FTP Semianrdaten aus einer Filemaker Datenbank hoch. Diese werden dann in Objekte umgewandelt. Es gibt da ein Filemaker internes eindeutiges Kennzeichen, anhand dessen wird gprüft, ob ein Update oder ein Insert erfolgen muss.

Die CSV Datei enthält mehr als 40 Spalten, teilweise müssen Datenfelder zusammengelegt und in das Objekt geschrieben werden. Teilweise müssen Felder je nach CSV Wert angepasst werden. Dazu dann auch multiobjekte (Seminarleiter) anlegen, Objektverknüpfungen (Seminarort) erkennen.
Mit PHP ist das relativ einfach, mit we:tags wäre sehr viel Arbeit nötig, um erst globale/lokale Variablen zu erstellen, diese dann in den we:tag zu schreiben und anschließend zu schreiben.

Bei meinem Fall müssen am Ende auch alle Beiträge, die nicht angefasst wurden, geparkt werden. (Was nicht geht, da sie dann nicht mehr in Listviews auftauchen die ich aber beim Import brauche... daher muss es ein Feld im Objekt sein, welches als "geparkt" Status dient) oder wenn das Datum mehr als x Jahre in der Vergangenheit liegt, gelöscht werden.

Ich vermute, dass viele, die mit PHP Objekte erstellen bzw. manipulieren wollen, ähnliche Szenarien haben.

Benutzeravatar
haydi
Senior Member
Beiträge: 645
Registriert: Do 1. Jan 1970, 02:00
Wohnort: Hirschberg
Kontaktdaten:

Re: Objekte mit php erstellen

Beitragvon haydi » Di 8. Nov 2022, 08:08

Hallo Marc,

wir werden ja dieses Mal bei den Intensivtagen auch über Feature-Requests sprechen. :-)
Ich werde dieses Thema in den Workshop mitnehmen.

@Thomas: Aus meiner Sicht... bevor wir es zu kompliziert machen, fände ich eine "einfache" Umsetzung wie es Marc vorschlägt mit we-Tags erstmal für gegeben und toll. Es dürfte sehr viele Fälle abdecken.
Was du dir vorstellst - PHP API wäre evtl. ein weiterer/eigener Feature-Request? Und das mit dem geparkten Zustand wieder ein eigener vermute ich. Vielleicht magst du es in die Bug-Base jeweils eintragen, falls noch nicht geschehen?

Sonnige Grüße
Haydi
Heidi Wetzel
Internet-Applikationen & Webseiten-Erstellung
https://www.heidi-wetzel.de

mokraemer
Senior Member
Beiträge: 3619
Registriert: So 8. Aug 2010, 01:23
Wohnort: Mainz

Re: Objekte mit php erstellen

Beitragvon mokraemer » Di 8. Nov 2022, 15:29

@Thomas: du nennst das PHP-Api - aber das Tag ist eigentlich genau das. Wenn du das kompliziert nennst, wird es mit einer API auch nicht einfacher, denn auch da muß man alles vorsehen, was möglich ist.
Die PHP-Variante des Tags wäre ja schlicht we_tag('xxxx',[]); und das ist dann genau die PHP-API.
Ich denke was du eher meinst, ist das man nicht procedural, sondern über PHP-Objekte zugreift. Aber auch da muß man alles auf der API erst mal definieren.
webEdition-Kern-Entwickler

ThomasGoebe

Re: Objekte mit php erstellen

Beitragvon ThomasGoebe » Di 8. Nov 2022, 16:00

@Marc: klar, kann ich die tags dann auch mit php schreiben. Aber das hat leider auch schon mal ein größeres update gebraucht, als mal der syntax geändert wurde.

Wenn ich mal Deine ersten Tag Ideen als Beispiel nehme:

Code: Alles auswählen

<?php
	$data = get_data_from_csv();
?>
<we:document type="object" class="17" [id="123"]>
<?php
	we_tag('document', ['type' => 'object', 'class' => '17', 'id' => '123']);
	we_tag('documentEntry', ['name' => 'Briefanrede', 'value' => (empty($data['titel']) ? '' : $data['titel'].' ')  .$data['vorname'].' '.$data['nachname']]);
	we_tag('documentEntry', ['name' => 'Vorname', 'value' => $data['vorname']]);
	we_tag('documentEntry', ['name' => 'Nachname', 'value' => $data['nachname']]);
?>
<we:write type="object"/>
dann ist die zweite Lösung für mich besser zu lesen und zu schreiben, vielleicht sogar mit chainable methoden...

Code: Alles auswählen

<?php
	$data = get_data_from_csv();
	$object = new we_object( ['class' => '17', 'id' => '123'] );
	$object->set('Briefanrede', (empty($data['titel']) ? '' : $data['titel'].' ')  . $data['vorname'].' '.$data['nachname'])
		->set('Vorname', $data['vorname'])
		->set('Nachname', $data['nachname'])
		->publish();
?>
Aber klar, das ist Geschmacksache. Ich denke einfach, dass alle die mit PHP Objekte und Dokumente manipulieren wollen oder müssen da durchaus komplexere Anforderungen haben werden. Und das dann alles mit we:tags abzubilden, wenn es doch sowieso die "internen" Methoden auf dem Objekt gibt und der Tag das nur übersetzt, ist unnötige Arbeit und auch noch ein minimales Performance Thema. Sicher nicht dramatisch, aber wenn ich wie bei einem Projekte tausende Artikel einmal in der Woche aus eine Warenwirtschaft abgleichen muss, dann spielt das durchaus eine Rolle.

ThomasGoebe

Re: Objekte mit php erstellen

Beitragvon ThomasGoebe » Di 8. Nov 2022, 16:34

Nachtrag: da ich die Daten eh alle mit PHP vorbereiten muss (in meinem speziellen Fällen), wäre es richtig schön, wenn folgendes ginge:

Code: Alles auswählen

<?php
	$data = get_data_from_csv();
	// Daten vorbereiten
	try {
		$object = new we_object( $data );
		echo "objekt angelegt, ID: ".$object->id;
	} catch (Exception $e) {
		echo 'Exception abgefangen: ',  $e->getMessage(), "\n";
		// hier evtl. aussagekräftige fehler wie Pflichtfeld nicht gesetzt, Datenformat falsch usw.
	}
?>
Und das könnte natürlich mit einem we:tag gehen:

Code: Alles auswählen

<we:write type="object" data="\$globales_array" />
Aber dann müssen auch Feldes des Typs Objekt und Multiobjekt sowie Bilder, PDFs, Links etc. damit füllbar sein.

Felder, die nicht übergeben werden und bisher leer sind (bei neuen Objekten) aber in der Klasse einen default wert haben, erhalten diesen Wert. Sonst werden bestehende Daten nicht angetastet wenn keine neuen im array geliefert werden.
Und für die, die das brauchen kann es dann auch ganz viele we:document / we:documentEntry Tags geben, die intern nur ein Array aufbauen (ähnlich den condition Tags, die im Grunde ja auch "nur" einen String zusammenbauen, was auch selbst mit PHP geht).

mokraemer
Senior Member
Beiträge: 3619
Registriert: So 8. Aug 2010, 01:23
Wohnort: Mainz

Re: Objekte mit php erstellen

Beitragvon mokraemer » Di 8. Nov 2022, 22:00

Die Condition-Tags könnten schlauer sein, wenn vorgesehen gewesen wäre, das sie den Kontext kennen. Aber man kann die Condition zusammensetzen ohne das dieses Tag weiß ob es für ein Objekt oder ein Dokument verwendet würde. Und wenn wir auf die Textrepräsentation verzichten würden, dann wäre es durchaus möglich zumindest das Problem teilweise zu heilen.

Zurück zu deinem API Thema. Ich würde erst gerne mal überlegen wie es sinnvoll mit Boardmitteln abbildbar wäre. Und die Tags sind nun mal die API von WE. Tags sind per se nicht direkt Objekt-Orientiert. Aber für viele Fälle wäre das schon mal ein möglicher/sinnvoller Ansatz. Die Variante mit dem Array erscheint im ersten Moment sinnvoll/nett. In der Praxis wirst du zuerst das Array dann bereinigen um es anschließend dann zu übergeben. Da macht eine for-Schleife mit der Möglichkeit die Daten direkt zu manipulieren mehr Sinn und es ist "1 Zeile mehr". Ob die Funktion dann einzeln eine Exception wirft wäre dann auch wurscht.

Bspw. wäre das in php denkbar:

Code: Alles auswählen

$obj=new we_tag_document('object',$classID);
$obj->load(12);
foreach($data as $key=>$val){
	match($key){
		'Name' => $obj->set($key,'test '.$val),
		default=> $obj->set($key,$val)
	};
}
$obj->publish();
Aber auch ein

Code: Alles auswählen

<we:document type="object" class="12" id="127"><we:documentAction type="park"/></we:document>
wäre so unelegant eben nicht.

Aber all das macht nur Sinn, wenn es jemanden gibt der das aufschreibt. Wenn das nicht dokumentiert wird, macht das alles keinen Sinn.
webEdition-Kern-Entwickler

ThomasGoebe

Re: Objekte mit php erstellen

Beitragvon ThomasGoebe » Mi 9. Nov 2022, 00:19

@Marc: das sind gut Ansätze. Solltet ihr mal bei der Konferenz besprechen.
Zum Thema aufschreiben: wE ist ja nicht das erste System mit diesen Fragen. Warum nicht an den anderen orientieren? Ich finde die reine PHP Lösung bei processwire sowohl gut gelöst als auch gut dokumentiert: https://processwire.com/api/ref/page/#p ... nipulation
Eine page ist dort eben alles, also ein Objekt oder ein Dokument. Da könnte man sich ein paar Methoden abschauen und ähnlich dokumentieren. Im kleinen Teil kann ich da helfen.

Wenn es aber we:tags braucht, dann bin ich irgendwie raus. Allein da die richtigen Namen zu überlegen wird ja schon eine längere Diskussion.

ThomasGoebe

Re: Objekte mit php erstellen

Beitragvon ThomasGoebe » Mi 9. Nov 2022, 01:12

Lässt mir keine Ruhe:

Hier mal für Objekte, ist doch im Grunde recht einfach und alles schon da.

Code: Alles auswählen

<we:editObject classid="x" id="y" createNew="true|false">
  <we:setVar to="object" nameto="object_name" propertyto="true" value="mein Objekt" />
  <we:setVar to="object" nameto="feldname" value="optional" from="optional" namefrom="optional" />
  <we:save />
  <we:publish />
  <we:unpublish />
  <we:delete />
  <we:setVar to="global" nameto="id" from="object" namefrom="id" propertyfrom="true" />
</we:editObject>
createNew="true|false" legt fest, ob ein neues Objekt angelegt werden soll, wenn keines mit id="y" existiert.
Müssten noch diverse Sachen geklärt werden (multiobjekte, objekt felder, proerpties wie pfade, kategorien etc.), aber kann alles mit we:setVar abgebildet werden.

ThomasGoebe

Re: Objekte mit php erstellen

Beitragvon ThomasGoebe » Mi 9. Nov 2022, 16:06

Und am Ende natürlich mit we:ifWritten die Fehler abfangen:

Code: Alles auswählen

<we:editObject classid="x" id="y" createNew="true|false">
  <we:setVar to="object" nameto="object_name" propertyto="true" value="mein Objekt" />
  <we:setVar to="object" nameto="feldname" value="optional" from="optional" namefrom="optional" />
  <we:save />
  <we:publish />
  <we:unpublish />
  <we:delete />
  <we:setVar to="global" nameto="id" from="object" namefrom="id" propertyfrom="true" />
</we:editObject>
<we:ifWritten>
<we:else />
  <we:ifWriteError error="missingField">
	Wie können jetzt die fehlenden Felder abgefangen und in eine logdatei geschrieben werden?
  </we:ifWriteError>
  Hier weitere Fehlertypen abfangen.
</we:ifWritten>
Für Dokumente dann analog dazu. Bildzuweisungen aber auch links werden etwas komplexer, weil es da ja auch meta daten gibt, braucht dann vielleicht drei setVar Aufrufe für Bilder (einmal die Bild ID, dann alt, dann ggf. metadaten wie copyright).
Für we:block weiss ich nicht, wie das gehen soll.
Offen auch die Frage, wie Varianten geschrieben werden können, Sprachveknüpfungen angegelegt werden können (bei meinem Projekt werden sowohl Objekte in deutsch und englich importiert, die dann miteinander verknüpft werden).
Aber als Ansatz könnt ihr das doch mal so diskutieren.

Benutzeravatar
Finn
Senior Member
Beiträge: 285
Registriert: Mo 3. Apr 2017, 13:37
Wohnort: Bremen
Kontaktdaten:

Re: Objekte mit php erstellen

Beitragvon Finn » Do 10. Nov 2022, 10:14

ThomasGoebe hat geschrieben: Mi 9. Nov 2022, 01:12 Lässt mir keine Ruhe:

Hier mal für Objekte, ist doch im Grunde recht einfach und alles schon da.

Code: Alles auswählen

<we:editObject classid="x" id="y" createNew="true|false">
  <we:setVar to="object" nameto="object_name" propertyto="true" value="mein Objekt" />
  <we:setVar to="object" nameto="feldname" value="optional" from="optional" namefrom="optional" />
  <we:save />
  <we:publish />
  <we:unpublish />
  <we:delete />
  <we:setVar to="global" nameto="id" from="object" namefrom="id" propertyfrom="true" />
</we:editObject>
createNew="true|false" legt fest, ob ein neues Objekt angelegt werden soll, wenn keines mit id="y" existiert.
Müssten noch diverse Sachen geklärt werden (multiobjekte, objekt felder, proerpties wie pfade, kategorien etc.), aber kann alles mit we:setVar abgebildet werden.
Den Ansatz fänd ich ziemlich cool und Hilfreich! Mein Hauptproblem ist tatsächlich oft, dass man immer ein Formular übergeben muss, damit we:write was tut.
Finn Thorwarth
WG Werbeagentur
https://www.wg-werbeagentur.de


Zurück zu „webEdition Templates erstellen (we:Tags)“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 Gäste