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

  • hannemac hannemac
    T3PO
    0 x
    15 Beiträge
    0 Hilfreiche Beiträge
    24. 02. 2010, 15:04

    Hallo liebes Forum,

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

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

    1. <?php
    2. // Call hook for custom markers
    3. if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['comments']['comments_getComments'])) {
    4. foreach($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['comments']['comments_getComments'] as $userFunc) {
    5. $params = array(
    6. 'pObj' => &$this,
    7. 'template' => $template,
    8. 'markers' => $markerArray,
    9. 'row' => $row,
    10. );
    11. if (is_array($tempMarkers = t3lib_div::callUserFunction($userFunc, $params, $this))) {
    12. $markerArray = $tempMarkers;
    13. }
    14. }
    15. }
    16. ?>

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

    Die hierzu gehörige Datein haben folgenden Inhalt:

    [b]EXT:ch_extendcomments/pi1/class.tx_ch_extendcomments_pi1.php:[/b]

    1. <?php
    2. require_once(PATH_tslib . 'class.tslib_pibase.php');
    3.  
    4. class tx_ch_extendcomments_pi1 extends tslib_pibase
    5. {
    6. var $prefixId = 'tx_ch_extendcomments_pi1';
    7. var $scriptRelPath = 'pi1/class.tx_ch_extendcomments_pi1.php';
    8. var $extKey = 'ch_extendcomments';
    9. var $pi_checkCHash = true;
    10. var $cachePath = 'typo3temp/ch_extendcomments/';
    11.  
    12. function comments_getComments($params, &$Obj)
    13. {
    14. $markerArray = $params['markers'];
    15. $row = $params['row'];
    16. $markerArray['###UID###'] = $row['uid'];
    17. return $markerArray;
    18. }
    19. }
    20. ?>

    [b]EXT:ch_extendcomments/ext_localconf.php:[/b]

    1. <?php
    2. if (!defined ('TYPO3_MODE'))
    3. die ('Access denied.');
    4.  
    5. $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['comments']['comments_getComments'][] = 'tx_ch_extendcomments_pi1->comments_getComments';
    6. ?>

    [b]EXT:ch_extendcomments/ext_tables.php:[/b]

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

    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]


  • 1
  • jenses jenses
    Flash Gordon
    0 x
    3087 Beiträge
    106 Hilfreiche Beiträge
    25. 02. 2010, 07:45

    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.

  • ammannd ammannd
    Leonidas
    0 x
    150 Beiträge
    0 Hilfreiche Beiträge
    25. 02. 2010, 10:39

    sieht mir auch ganz nach cache aus!

  • hannemac hannemac
    T3PO
    0 x
    15 Beiträge
    0 Hilfreiche Beiträge
    25. 02. 2010, 20:36

    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 hannemac
    T3PO
    0 x
    15 Beiträge
    0 Hilfreiche Beiträge
    25. 02. 2010, 23:04

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

    [b]class.tx_chextendcomments_pi1.php[/b]

    1. <?php
    2. class tx_chextendcomments_pi1 extends tslib_pibase {
    3. var $prefixId = 'tx_chextendcomments_pi1'; // Same as class name
    4. var $scriptRelPath = 'pi1/class.tx_chextendcomments_pi1.php'; // Path to this script relative to the extension dir.
    5. var $extKey = 'ch_extendcomments'; // The extension key.
    6.  
    7. /**
    8. * The main method of the PlugIn
    9. *
    10. * @param string $content: The PlugIn content
    11. * @param array $conf: The PlugIn configuration
    12. * @return The content that is displayed on the website
    13. */
    14. function main($content, $conf) {
    15. $this->conf = $conf;
    16. $this->pi_USER_INT_obj = 1;
    17.  
    18. return 1;
    19. }
    20.  
    21. function comments_getComments($params, &$Obj)
    22. {
    23. $markerArray = $params['markers'];
    24. $row = $params['row'];
    25.  
    26. $markerArray['###UID###'] = $row['uid'];
    27.  
    28. return $markerArray;
    29. }
    30. }
    31.  
    32.  
    33.  
    34. if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/ch_extendcomments/pi1/class.tx_chextendcomments_pi1.php']) {
    35. include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/ch_extendcomments/pi1/class.tx_chextendcomments_pi1.php']);
    36. }
    37. ?>

    [b]ext_localconf.php[/b]

    1. <?php
    2. if (!defined ('TYPO3_MODE')) {
    3. die ('Access denied.');
    4. }
    5.  
    6. t3lib_extMgm::addPItoST43($_EXTKEY, 'pi1/class.tx_chextendcomments_pi1.php', '_pi1', '', 0);
    7. $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['comments']['comments_getComments'][] = 'tx_chextendcomments_pi1->comments_getComments';
    8. ?>

    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 jenses
    Flash Gordon
    0 x
    3087 Beiträge
    106 Hilfreiche Beiträge
    26. 02. 2010, 08:18

    [quote="hannemac"]
    Ich habe meinen Programmcode um die meines Wissens relevanten Befehle erweitert, leider ohne Erfolg
    [/quote]

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

  • hannemac hannemac
    T3PO
    0 x
    15 Beiträge
    0 Hilfreiche Beiträge
    26. 02. 2010, 09:07

    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

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

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

    Weiter in der pi1 Klasse

    1. <?php
    2. $this->pi_USER_INT_obj = 1;
    3. ?>

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

  • sefoo sefoo
    T3PO
    0 x
    9 Beiträge
    0 Hilfreiche Beiträge
    06. 09. 2010, 20:16

    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:

    1. $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

  • 1