Zum Inhalt springen

Hook für comments (callUserFunction) - Marker werden nur einmal ausgeführt

Erstellt am 24. Februar 2010 · 7 Antworten · letzte Antwort am 6. September 2010

Tags: Frage

hannemac ·

Hallo liebes Forum,

ich habe einen Hook für die Extension comments geschrieben.

In der Datei EXT:comments/pi1/class.tx_comments_pi1.php werden die Hooks in der Funktion comments_getComments() eingebunden:

<?php
// Call hook for custom markers
if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['comments']['comments_getComments'])) {
	foreach($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['comments']['comments_getComments'] as $userFunc) {
		$params = array(
			'pObj' => &$this,
			'template' => $template,
			'markers' => $markerArray,
			'row' => $row,
		);
		if (is_array($tempMarkers = t3lib_div::callUserFunction($userFunc, $params, $this))) {
			$markerArray = $tempMarkers;
		}
	}
}
?>

Ich habe zu diesem Zweck eine Extention erstellt "ch_extendcomments".

Die hierzu gehörige Datein haben folgenden Inhalt:

EXT:ch_extendcomments/pi1/class.tx_ch_extendcomments_pi1.php:

<?php
require_once(PATH_tslib . 'class.tslib_pibase.php');

class tx_ch_extendcomments_pi1 extends tslib_pibase
{
	var $prefixId      = 'tx_ch_extendcomments_pi1';
	var $scriptRelPath = 'pi1/class.tx_ch_extendcomments_pi1.php';
	var $extKey        = 'ch_extendcomments';
	var $pi_checkCHash = true;
	var $cachePath = 'typo3temp/ch_extendcomments/';

	function comments_getComments($params, &$Obj)
	{
		$markerArray = $params['markers'];
		$row = $params['row'];
		$markerArray['###UID###'] = $row['uid'];
		return $markerArray;
	}
}
?>

EXT:ch_extendcomments/ext_localconf.php:

<?php
if (!defined ('TYPO3_MODE'))
	die ('Access denied.');

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['comments']['comments_getComments'][] = 'tx_ch_extendcomments_pi1->comments_getComments';
?>

EXT:ch_extendcomments/ext_tables.php:

<?php
require_once(t3lib_extMgm::extPath('ch_extendcomments').'pi1/class.tx_ch_extendcomments_pi1.php');
?>

Den Marker ###UID### füge ich im comments Template ein und fülle damit einen Anker <a name="comment-###UID###"></a>.

Leere ich nun den Cache und rufe einen tt_news Artikel auf werden die Marker richtig gesetzt.
Gucke ich mir jetzt einen weiteren Artikel an, steht ###UID### im Quelltext. D.h. der erste Aufruf funktioniert, danach wird der Marker nicht mehr gefüllt.

Leider komme ich an dieser Stelle nicht weiter. Ich habe schon andere Hooks geschrieben die jedoch nicht auf dem Prinzip callUserFunktion sondern auf dem getUserObj Prinzip basieren, dabei sind solche Probleme nicht aufgetreten.

Ich hoffe jemand von euch weiß hier weiter.[/b]

jenses ·

Das Problem wird wohl sein, daß du deinen Hook als Plugin-Klasse umgesetzt hast, und dieses Plugin gecached wird.

Ich habe den comments_getComments selbst schon mal genutzt, der funktioniert erwartungsgemäß einwandfrei.

hannemac ·

Ich habe bei der Extension Erstellung im kickstarter die Möglichkeit eine Kategorie auszuwählen, ich denke aber nicht, dass es daran liegt.

Welchen Weg muss ich bei der Programmierung denn gehen, damit ich keine "Plugin-Klasse" umsetzte?

Viele Grüße

Christian

hannemac ·

Ich habe meinen Programmcode um die meines Wissens relevanten Befehle erweitert, leider ohne Erfolg:

class.tx_chextendcomments_pi1.php

<?php
class tx_chextendcomments_pi1 extends tslib_pibase {
	var $prefixId      = 'tx_chextendcomments_pi1';		// Same as class name
	var $scriptRelPath = 'pi1/class.tx_chextendcomments_pi1.php';	// Path to this script relative to the extension dir.
	var $extKey        = 'ch_extendcomments';	// The extension key.
	
	/**
	 * The main method of the PlugIn
	 *
	 * @param	string		$content: The PlugIn content
	 * @param	array		$conf: The PlugIn configuration
	 * @return	The content that is displayed on the website
	 */
	function main($content, $conf)	{
		$this->conf = $conf;
		$this->pi_USER_INT_obj = 1;

		return 1;
	}

	function comments_getComments($params, &$Obj)
	{
		$markerArray = $params['markers'];
		$row = $params['row'];

		$markerArray['###UID###'] = $row['uid'];

		return $markerArray;
	}	
}



if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/ch_extendcomments/pi1/class.tx_chextendcomments_pi1.php'])	{
	include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/ch_extendcomments/pi1/class.tx_chextendcomments_pi1.php']);
}
?>

ext_localconf.php

<?php
if (!defined ('TYPO3_MODE')) {
 	die ('Access denied.');
}

t3lib_extMgm::addPItoST43($_EXTKEY, 'pi1/class.tx_chextendcomments_pi1.php', '_pi1', '', 0);
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['comments']['comments_getComments'][] = 'tx_chextendcomments_pi1->comments_getComments';
?>

Leider ohne Erfolg, im ersten aufgerufenen Artikel wird der Marker in allen Kommentaren erfolgreich gesetzt. In allen anderen Artikeln bleibt ###UID### im Quelltext stehen.

jenses ·
hannemac schrieb

Ich habe meinen Programmcode um die meines Wissens relevanten Befehle erweitert, leider ohne Erfolg

Auf jeden Fall cachest du erfolgreich die Ausgabe deines Plugins,
das ist ja schon mal was 😃
Wie gesagt, sorg dafür, daß nichts gecached wird, dann gehts auch.

hannemac ·

Das verstehe ich jetzt nicht so ganz. Alle Parameter die man auf "nicht cachen" stellen kann, habe ich auf "nicht cachen" gestellt.

einmal in der ext_localconf.php

<?php
t3lib_extMgm::addPItoST43($_EXTKEY, 'pi1/class.tx_chextendcomments_pi1.php', '_pi1', '', 0);
?>

Die 0 am Ende besagt ja cached = 0, also nicht cachen.

Weiter in der pi1 Klasse

<?php
$this->pi_USER_INT_obj = 1;
?>

USER_INT bedeutet auch "nicht cachen". Für einen konstruktiven Hinweis wäre ich sehr dankbar.

sefoo ·

Da ich an dem selben Problem sass, und hier noch keine Antwort gefunden wurde...

MM. nach liegt das beschriebene Verhalten nur an der Zeile in ext_localconf.php.
Diese sollte folgendermassen lauten:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['comments']['comments_getComments'][] = 'EXT:myextension/class.tx_myextension_pi1.php:tx_myextension_pi1->my_function';

Dann gibt es auch keine Probleme mit dem Caching....

Viele Grüsse,
Sebastian