Seite 1 von 2

Fehler beim Speichern der Vorlage

Verfasst: Mo 13. Feb 2012, 13:09
von blickfang
Hallo,

wir haben einen kleinen eigenen Hook geschrieben, der geo-Daten vor dem veröffentlichen eines Objekts hinzufügt. Das funtkioniert wunderbar. Nun bekommen wir jedoch immer beim Speichern einer Vorlage die Meldung "Fehler beim Speichern der Vorlage". Die Vorlage wird aber trotzdem gespeichert - die Meldung nervt - woher kommt das ?

Wenn wir unseren sutomHook entfernen kommt die Meldung immer noch. Nur wenn die gesamten Hooks unter Einstellungen => allgemeine deaktiviert werden kommt die Fehlermeldung nicht mehr? Bug im System?

Dankbar für jegliche Hinweise!

Re: Fehler beim Speichern der Vorlage

Verfasst: Mo 13. Feb 2012, 15:42
von mokraemer
welche Version?

Re: Fehler beim Speichern der Vorlage

Verfasst: Mo 13. Feb 2012, 17:23
von blickfang
6.2.6.0

Re: Fehler beim Speichern der Vorlage

Verfasst: Mo 13. Feb 2012, 20:01
von mokraemer
ähm...
wie habt ihr denn sichergestellt das Euer Hook nur auf Objekte wirkt?
Der Hook wird auch beim Speichern einer Vorlage angesprochen - du mußt also vorher unterscheiden um welchem Dokumenttyp es sich handelt.

Re: Fehler beim Speichern der Vorlage

Verfasst: Di 14. Feb 2012, 09:25
von blickfang
hm, bislang wurden nur die Bojekt-Klassen abgeprüft und wenn dasObjekt eine bestimmten Kklasse angehört, dann tue etwas. Wenn nicht, dann tue nichts.
Am Hook selbst sollte es ja aber eigentlich nicht liegen, oder? Das komische ist ja, wenn wir die Datei für den custom Hook koemplett entfernen, hooks aber aktiv lassen, bekommen wir auch einen Fehler beim Speichern von Templates. Werden hooks grundsätzlich deaktiviert - kein Fehler

der Hook in Kürze:

Code: Alles auswählen

function weCustomHook_prePublish($param) {
	$object = $param[0];
	$type = get_class($object);
	switch($type){
		case 'we_objectFile':
		  do_something();
		break;
		default:
		  do_nothing();
	}
}

Re: Fehler beim Speichern der Vorlage

Verfasst: Di 14. Feb 2012, 12:32
von mokraemer
hmm. ok, schau ich mir mal an.

Re: Fehler beim Speichern der Vorlage

Verfasst: Di 14. Feb 2012, 12:42
von mokraemer
Also ich hab das gerade mal bei mir ausprobiert, Hooks an, aber kein Hook in irgendeinem Verzeichnis, weder Apps noch custom-Hooks, da gab es keine Fehler.

Die Auswertung des Hooks ist auch recht simpel:

Code: Alles auswählen

$this->errStr='';
...
//execute custom Hook
...
return ($this->errStr == '');
Der Hook gibt also genau dann Fehler zurück wenn im Err-Str. was steht.

Re: Fehler beim Speichern der Vorlage

Verfasst: Di 14. Feb 2012, 13:49
von blickfang
habe den hook nach Deinem Beispiel nun so erweitert:

Code: Alles auswählen

function weCustomHook_prePublish($param) {
   $object = $param[0];

   $object->errStr = '';

   $type = get_class($object);
   switch($type){
      case 'we_objectFile':
        do_something();
      break;
      default:
        do_nothing();
   }

   return ($object->errStr == '');

}
Bei Speichern eines Objekts alles gut, beim Speichern eines Dokuments oder einer Vorlage => Meldung: Fehler bem Speichern; gespeichert wird aber trotzdem weiterhin korrekt... was ihm nicht paßt schreibt er aber nicht im errStr.

Re: Fehler beim Speichern der Vorlage

Verfasst: Di 14. Feb 2012, 19:08
von mokraemer
Sorry, da hab ich mich falsch ausgedrückt!
Der Hook selbst hat keinen Rückgabewert. Nur falls etwas im errStr steht, der dem Hook-Handler zugeordnet ist (wie gesagt schau dir preSave-Hook an), wird nicht gespeichert und der Fehler ausgegeben.

Re: Fehler beim Speichern der Vorlage

Verfasst: Mi 15. Feb 2012, 10:47
von blickfang
hatte schon versucht mir den Error mit dem hookHandler errStr auszugeben - allerdings steht da leider nix drin..
Wenn ein Objekt gespeichert wird kommt keine Fehlermeldung, wenn ein Dokument oder eine Vorlage gespeichert wird wird ein Fehler ausgeworfen, aber kein Error-Text/Info dazu - nur "Fehler beim Speicher der Vorlage...".

Re: Fehler beim Speichern der Vorlage

Verfasst: Do 16. Feb 2012, 20:36
von blickfang
auch wenn ich nicht herausbekommen, warum das Template/Dokument Speichern einen Fehler ausgibt - gibt es denn eine Möglichkeit den Fehler gewaltsam zu unterdrücken indem man beim Hook im Fall es kein Objekt betrifft "return true" oder wie auch immer setzt?

Re: Fehler beim Speichern der Vorlage

Verfasst: Fr 17. Feb 2012, 02:49
von mokraemer
Nein, das geht logischerweise nicht. Du wirst den Fehler suchen müssen.

Dein Prepublish-Hook wird sicherlich nicht ausgeführt.

Denn beim Speichern der Vorlage werden zuerst Presave ausgeführt, dann wird alles in die DB gespeichert und die Datei angelegt. Dann wird der Hook Save aufgerufen und zuletzt wird eine neue Version in der Template-Historie erzeugt.

Wenn er bei dir also noch speichert, ist der Hook Save dafür verantwortlich.

Re: Fehler beim Speichern der Vorlage

Verfasst: Fr 17. Feb 2012, 13:38
von blickfang
ich habe alle Sample Hooks weggeworfen - kein Ergebnis.
Dann habe ich eine neue Datei mit einem CustomHook für save angelegt, der aber gar nichts

Code: Alles auswählen

function weCustomHook_save($param) {

}
siehe da - keine Fehlermeldungen mehr beim Speichern von Dokumenten und Vorlagen. Steht das irgendwo geschrieben das es die Funktion unbedingt geben muss?

Re: Fehler beim Speichern der Vorlage

Verfasst: Fr 17. Feb 2012, 18:31
von mokraemer
irgendwas läuft da bei dir durcheinander.
Falls die Datei nicht vorhanden ist, gibt er true zurück.

=> webEdition/we/include/we_hook/class/weHook.class.php
der Aufruf zu dem Hook lautet:

Code: Alles auswählen

			$hook = new weHook('save', '', array($this, 'resave' => $resave));
			$ret = $hook->executeHook();
			//check if doc should be saved
			if($ret === false){
				$this->errMsg = $hook->getErrorString();
				return false;
			}
Und bitte wieso sollte dies false zurückliefern? Irgendwo muß da bei dir was gemacht werden.

Re: Fehler beim Speichern der Vorlage

Verfasst: Fr 17. Feb 2012, 20:44
von blickfang
final haben wir nun alle sampleHook Dateien in customHooks übernommen und der customHook mit prePublish sieht so aus:

Code: Alles auswählen

function weCustomHook_prePublish($param) {
	$hookHandler=$param['hookHandler'];
	
	$object = $param[0];
	$type = get_class($object);

	switch($type){
		case 'we_objectFile':
                 tuelustigesachen();
                break;
               default:
                return true;
	}
	$hookHandler->setErrorString('Fehler beim Hook prePublish');     
}
aktuell werden damit keine Fehler mehr ausgegeben. Einen Aufruf

Code: Alles auswählen

$hook = new weHook('save'....
usw. gibt es in der Datei nicht?! oder hab ich Dich falsch verstanden? Die Datei sieht so aus (sorry für die Code Menge...) - habe noch zwei andere webEdition Projekte geprüft, da ist das 1:1

Code: Alles auswählen


/**
 * class to handle hooks in webEdition and in applications
 */
class weHook {

	protected $action;
	protected $appName;
	protected $param;
	private $file='';
	private $func;
	private $errStr='';

	function __construct($action, $appName='', $param=array()) {
		if (!(defined('EXECUTE_HOOKS') && EXECUTE_HOOKS)) {
			return;
		}
		$this->action = $action;
		$this->appName = $appName;
		$this->param = $param;
		$this->param['hookHandler']=$this;
		$this->findHookFile();
		$this->func='weCustomHook_' . ($appName != ''?$appName . '_':'') . $action;
	}

	function executeHook() {
		if (!(defined('EXECUTE_HOOKS') && EXECUTE_HOOKS)) {
			return true;
		}

		if ($this->action != '' && is_array($this->param) && $this->file != '') {
			include_once($this->file);
			if (function_exists($this->func)) {
				eval($this->func . '($this->param);');
				return ($this->errStr=='');
			}
		}
		return;
	}
	
	/**
	 * get custom hook file
	 *
	 * @param string $action
	 * @param string $appName
	 *
	 * return string
	 */
	function findHookFile() {
		$hookFile = '';

		if ($this->appName != '') {
			$filename = 'weCustomHook_' . $this->appName . '_' . $this->action . '.inc.php';
			// look in app folder
			$hookFile = WE_TOOLS_DIR . $this->appName . '/hook/custom_hooks/' . $filename;
		} else {
			$filename = 'weCustomHook_' . $this->action . '.inc.php';
			// look in we_hook/custom_hooks folder
			$hookFile = WEBEDITION_INCLUDES_DIR . 'we_hook/custom_hooks/' . $filename;
			//no more check for sample hooks - they are overwritten on update
		}
		if (file_exists($hookFile) && is_readable($hookFile)) {
			$this->file=$hookFile;
		}
	}

	function setErrorString($str){
		$this->errStr=$str;
	}
	
	function getErrorString(){
		return $this->errStr;
	}
	
}