Seite 1 von 1

mit Hooks Daten während des Speicherns manipulieren

Verfasst: Do 29. Okt 2009, 13:43
von blickfang
Hallo,

beschäftige mich derzeit zum ersten mal genauer mit den Hooks. Kann man damit Daten eines Dokuments beim Speichern manipulieren (z.B. $we_doc)? Oder lassen sich nur zusätzliche Funktionen bei bestimmten Vorgängen ausführen, die ursprünglichen Eingaben eines Redeakteurs jedoch nicht abfangen?

Re: mit Hooks Daten während des Speicherns manipulieren

Verfasst: Do 29. Okt 2009, 14:06
von we:willRockYou
Die Hooks kommen nach dem (z.B.) Speichern zum Einsatz. D.h. Du kannst die Inhalte von $we_doch nicht einfach so ändern. Jedenfalls würde es keine Auswirkungen auf das Dokument/Objekt haben. Da Du ja aber die ID des Dokuments/Objekts hast, kannst Du das Dokument/Objekt öffnen und manipulieren. Nur ein Abfangen von Fehleingaben des Redakteurs ist so leider nicht möglich.

Die ID des Objekts/Dokuments steht in $we_doc (bzw. in dem Parameter den der Hook empfängt) drin. Wie man ein Objekt/Dokument per PHP manipulieren kann steht z.B. hier: http://documentation.webedition.de/de/w ... a7fbe46fc7 (in den Beispielen unten)

Re: mit Hooks Daten während des Speicherns manipulieren

Verfasst: Do 29. Okt 2009, 14:35
von Dirk Einecke
Hi,

hier auch noch zwei Beispiele zum Verändern von Dokumenten/Objekten:

http://documentation.webedition.de/de/w ... -using-php
http://documentation.webedition.de/de/w ... t-with-php

Dirk

Re: mit Hooks Daten während des Speicherns manipulieren

Verfasst: Do 29. Okt 2009, 15:43
von blickfang
Hi,

das dachte ich mir schon so ähnlich, hatte nur insgeheim gehofft man könne da vielleicht noch vorher dran drehen :|
Ich möchte Email Adressen die von Redakteuren eingegeben werden umschreiben. Nun hat ja aber jedes Template andere Felder, darunter auch we: Blocks.
Wie komme ich denn nun geschickt an den exakten Name der Felder, um über setElement('feldname','value') den Wert nachträglich zu manipulieren?

Wenn ich mir im Hook $we_doc abhole komme ich mit $we_doc['0']->elements an die Inhalte, welche alle offenbar einzelne Arrays sind. Wenn ich im template Einen Block mit name "teaser" habe und darin ein Feld "teaserBlockWidth" finde ich dieses Array in $we_doc.

Code: Alles auswählen

    [teaserBlockWidthblk_teaser__3] => Array
        (
            [id] => 71943
            [bdid] => 0
            [dat] => Hier steht was
            [isbinary] => 0
            [autobr] => 
            [languageid] => 0
            [cid] => 48371
            [type] => txt
            [documenttable] => tblFile
            [table] => we_tblContent
        )
Kann ich dann mit

Code: Alles auswählen

setElement('teaserBlockWidthblk_teaser__3','Hier steht was neues');
dieses Feld updaten?

Re: mit Hooks Daten während des Speicherns manipulieren

Verfasst: Do 29. Okt 2009, 15:55
von we:willRockYou
Das sollte funktionieren. Zur not einfach selbst das Array manipulieren. Mehr macht setElement nämlich auch nicht. :)

Code: Alles auswählen

	function setElement($name,$data,$type="txt",$id=0,$autobr=0){
		$this->elements[$name]["dat"]=$data;
		$this->elements[$name]["type"]=$type;
		if($id) $this->elements[$name]["id"]=$id;
		if($autobr) $this->elements[$name]["autobr"]=$autobr;
	}

Re: mit Hooks Daten während des Speicherns manipulieren

Verfasst: Do 29. Okt 2009, 16:26
von we:willRockYou
Mir kommt da gerade noch ne Idee. Geht es nur um die Verschlüsselung der Mail-Adressen? Z.B Umleitung auf ein Formular oder ersetzung des @?

In dem Fall würde ich die Daten lassen wie Sie sind. Das ist sowieso ratsam. In der DB sollte nach Möglichkeit wirklich immer das stehen was der Redakteur eingegeben hat. Die Umwandlung würde ich bei der Ausgabe in Angriff nehmen.

Master-Template ganz am Anfang:

Code: Alles auswählen

<?php
   ob_start();
?>
Master-Template ganz am Ende:

Code: Alles auswählen

<?php
   function parseMail($mail) {
   	return 'wird verschlüsselt ausgegeben';
   }

   $wholeSite=ob_get_clean();
   if($GLOBALS['we_editmode'] != true) {
      $output=preg_replace(
         "/^((?:(?:(?:[a-zA-Z0-9][\.\-\+_]?)*)[a-zA-Z0-9])+)\@((?:(?:(?:[a-zA-Z0-9][\.\-_]?){0,62})[a-zA-Z0-9])+)\.([a-zA-Z0-9]{1,6})$/eis",
         "parseMail('\\1')",
         $wholeSite
      );
   }
   else
      echo $wholeSite;
?>
Regulärer Ausdruck wurde schon auf einstellige DE-Domains angepasst. ;-)

Re: mit Hooks Daten während des Speicherns manipulieren

Verfasst: Do 29. Okt 2009, 17:01
von blickfang
hatte deine Antwort noch nicht gesehen, bevor ich mein weiteres Problem gepostet hatte, sorry. Auch ne coole Idee, dennoch würde mich interessieren warums nicht geht :?:


Supi, das ist im Prinzip das was ich machen möchte - tut nur leider nicht. Ich bekomme die Felder die ich ändern möchte zwar angezeigt, aber sobald ich $doc->we_save(); und $doc->we_publish(); einbinde fällt das ganze auf die Nase (Seiten lassen sich nith mehr veröffentlichen) - eine wirkliche Ausgabe gibts bei Hooks ja leider keine...

Code: Alles auswählen

	function weCustomHook_publish($we_doc) {
		
		ob_start();
		$contentArray = $we_doc['0']->elements;	
		foreach($contentArray as $key => $value){
			foreach($value as $key2 => $data){
				if($key2 == 'dat'){
					if(strstr($data,'1@1') !== false){
						// @ Zeichen ersetzen - wird noch überarbeitet
						$updateField[$key] = str_replace('1@1','||',$data);
					}	
				}
			}	
		}

		print_r($updateField);

		$docID = $we_doc['0']->ID;
		$doc = new we_webEditionDocument();
		$doc->initByID($docID);

		foreach($updateField as $key => $value){
			$doc->setElement($key, $value);
		}	

		$doc->we_save();
		$doc->we_publish();

		$we_doc = ob_get_contents();
		ob_end_clean();

		mail('meine@domain.de', 'we_doc', $we_doc);
	}
muss ich die we.inc.php und we_classes/we_webEditionDocument.inc.php auch einbinden? Wäre super wenn Ihr mir da nochmal einen Schupps geben könntet.
Danke!

Re: mit Hooks Daten während des Speicherns manipulieren

Verfasst: Do 29. Okt 2009, 20:51
von blickfang
hm, das mit dem output Buffering habe ich nun auch mal versucht: Ergebnis => weiße Seite, dann kommt garnichts mehr. Benötigt der Server hierfür besondere Einstellungen?

Re: mit Hooks Daten während des Speicherns manipulieren

Verfasst: Do 29. Okt 2009, 21:25
von we:willRockYou
Nein. Aber da muss noch ein echo $output; hin. Sorry, hab ich nur schnell zusammenge-c&p'ed. ;)

Re: mit Hooks Daten während des Speicherns manipulieren

Verfasst: Fr 30. Okt 2009, 09:50
von blickfang
ok, das hätte ich auch selbst sehen können...
jetzt gibt er die Seite zwar aus, die Email wird aber dennoch nicht ersetzt

Re: mit Hooks Daten während des Speicherns manipulieren

Verfasst: Fr 30. Okt 2009, 10:17
von we:willRockYou
Grrr. ;) Sorry, wie gesagt, war schnell zusammenkopiert. Der RegExp findet so nur Mails ohne Zeichen aussenrum, also ne Prüfung auf gültige Mail-Adressen. Versuchs mal so:

"/((?:(?:(?:[a-zA-Z0-9][\.\-\+_]?)*)[a-zA-Z0-9])+)\@((?:(?:(?:[a-zA-Z0-9][\.\-_]?){0,62})[a-zA-Z0-9])+)\.([a-zA-Z0-9]{2,6})/eis"

Re: mit Hooks Daten während des Speicherns manipulieren

Verfasst: Fr 30. Okt 2009, 10:56
von blickfang
hm, leider nein, gibt wieder ne weiße Seite..

Re: mit Hooks Daten während des Speicherns manipulieren

Verfasst: Fr 30. Okt 2009, 11:10
von we:willRockYou
Sorry, dann musst Du selbst mal nach nem Regulären Ausdruck für Mails recherchieren, da gibts auch Archive. Der ist eignetlich dafür entworfen die Gültigkeit von Mail-Adressen zu prüfen und ist für Deinen Fall wohl zu "greedy".

Re: mit Hooks Daten während des Speicherns manipulieren

Verfasst: So 1. Nov 2009, 14:28
von blickfang
Hi,
habe nun die Variante mit dem Outputpuffering realisiert. Allerdings funktioniert das mitdem regulären Ausdruck nicht (auch nicht in der einfachsten Form), da tut er einfach garnichts. Ersetzte nun mit einemeinfach str_replace() die Email Adressen @meinedomain.de mit @xxxcralerdomain.de bei der Ausgabe. nach dom:loaded werden diesen dann via javascript wieder zurückgewandelt.

Im Seitenquelltext des Browsers stehen die fake-Adresssen, in der Browseranzeige die korrekten.