Zum Inhalt springen

cObj->IMAGE über Backend Hook – almost there(?)

Erstellt am 17. Januar 2011 · 2 Antworten · letzte Antwort am 19. Januar 2011

Tags: Frage

iwyg ·

Kurzer Abriss um was es geht: in meiner Extension können Bilddatensätze und Galerien angelegt werden, die wiederum die Bilddatensätze enthalten können, Die Galerien werden dann über ein FE Plugin in die Seite eingebunden. Die Galerien werden im FE aber nicht ausgegeben sondern nur die entsprechenden Links die über den eID Mechanismus einen JSON-String zurück liefern, der dann Clientseitig verarbeitet wird. Dafür ist es aber notwending, dass die Bilder beim Speichern bereits skaliert werden. Daher greife ich per hook in den Speichervorgang ein:

<?php
require_once(PATH_t3lib . 'class.t3lib_page.php');
require_once(PATH_tslib . 'class.tslib_fe.php');
require_once(PATH_tslib . 'class.tslib_pibase.php');
require_once(PATH_tslib . 'class.tslib_content.php');
require_once(PATH_t3lib . 'class.t3lib_stdgraphic.php');
require_once(PATH_tslib . 'class.tslib_gifbuilder.php');
require_once(PATH_t3lib . 'class.t3lib_timetrack.php');
require_once(PATH_t3lib . 'class.t3lib_tsparser_ext.php');
require_once(t3lib_extMgm::extPath('tarvslider') . 'pi1/class.tx_tarvslider_pi1.php');
/**
 * @param	$status		is 'new' or 'update' 	
 * @param	$table		tablename
 * @param	$id		tablerow id
 * @param	$fieldArray	array:updated tablefields
 * @param       $pObj           tcemain
 */

class tx_tarvslider_tcemainprocdm {

function processDatamap_afterDatabaseOperations($status, $table, $id, $fieldArray, &$pObj) {
        $id = ($status == 'new') ? $pObj->substNEWwithIDs[$id] : $id;

            switch ($table){
                case 'tx_tarvslider_gal':
                    # ...
                    break;
                case 'tt_content':
                    $pid = $pObj->checkValue_currentRecord['pid'];
                    $this->updateCurrentImageSet($pObj,$id,$pid);
                    break;
            }
    }
...
}

t3lib_div::makeInstance(tx_tarvslider_tcemainprocdm);
?>

Danach wird in updateCurrentImageSet erst einmal ein FEuser und cObj instanziiert:

<?php
...
/**
 * @param       $pObj           tcemain
 * @param	$id		tablerow id
 * @param	$pid	        page id
 * 
 */
    function updateCurrentImageSet($pObj,$id,$pid) {
                # new plugin obejct
                $pi1_Obj = t3lib_div::makeInstance('tx_tarvslider_pi1');
                # creating TSFE and cObj
                $pi1_Obj->cObj = $this->loadFeUserSession($pid,'tx_tarvslider_pi1');

                if ($pi1_Obj->cObj->data->uid != $id && $pi1_Obj->cObj->data->uid != $pid){
                    # putting cObj-data width data from currentRecord
                    $data = $pObj->checkValue_currentRecord;
                    $pi1_Obj->cObj->data = $data;
                }
                # init fe plugin 
                $pi1_Obj->init($this->conf);
                # run through all images associated with current record and scale them if neccessary
                $pi1_Obj->updateImageSize($id);
    }
?>

In updateImageSize soll/wird dann mit

<?php
$this->cObj->IMG_RESOURCE($file);
?>

das Bild ggf. skaliert.

updateImageSize hab ich auch in der main Funktion des FE-Plugins, damit ich den Aufruf über ein "echtes" cObj debuggen kann, das klappt einwandfrei.

Aufgerufen über Den BE hook scheitert der Aufruf kurz vor Aufrufen der ImageMagick Funktion im tslib_cObj an:

$GLOBALS['TSFE']->tmpl->fileCache[$hash]['origFile_mtime'] = @filemtime($theImage);	// This is needed by tslib_gifbuilder, ln 100ff in order for the setup-array to create a unique filename hash.

filemtime($theImage) liefert in dem Fall false zurück.

$theImage ist aber in beiden Fällen das gleiche, also "rel/path/tofile/image.jpg"

Hier Stelle ich mir also die Frage, warum filemtime im FE das Bild trotz relativen Pfad validiert und im BE nicht?

An der Stelle komme ich einfach nicht mehr weiter, Vielleicht hat der ein oder andere ja doch einen Passenden Tip.

------

Der Vollständigkeits halber noch die methode, wie der FEuser im BE instanziiert wird:

<?php
/**
 * init TSFE in Backend 
 * FE Plugin configuration is written to $this->conf
 * @param	$pid		page id
 * @param	$extKey	        fe extension name
 * @return      cObj
 */
    function loadFeUserSession($pid,$extKey){                
                if (!is_object($GLOBALS['TT'])) {
                        $GLOBALS['TT'] = t3lib_div::makeInstance(t3lib_timeTrack);
                        $GLOBALS['TT']->start();
                }

                if (!is_object($GLOBALS['TSFE']) && $pid) {
                        # Builds TSFE object
                        $GLOBALS['TSFE'] = t3lib_div::makeInstance('tslib_fe', $GLOBALS['TYPO3_CONF_VARS'],$pid,0,0,0,0,0,0);
                        # Builds sub objects
                        $GLOBALS['TSFE']->tmpl = t3lib_div::makeInstance('t3lib_tsparser_ext');
                        $GLOBALS['TSFE']->sys_page = t3lib_div::makeInstance('t3lib_pageSelect');
                        # init template
                        $GLOBALS['TSFE']->tmpl->tt_track = 0;// Do not log time-performance information
                        $GLOBALS['TSFE']->tmpl->init();

                        $rootLine = $GLOBALS['TSFE']->sys_page->getRootLine($pid);
                        # This generates the constants/config + hierarchy info for the template.
                        $GLOBALS['TSFE']->tmpl->runThroughTemplates($rootLine,$template_uid);

                        $GLOBALS['TSFE']->tmpl->generateConfig();
                        $GLOBALS['TSFE']->tmpl->loaded=1;

                        # Get config array and other init from pagegen
                        $GLOBALS['TSFE']->getConfigArray();
                        $GLOBALS['TSFE']->linkVars = ''.$GLOBALS['TSFE']->config['config']['linkVars'];

                        if ($GLOBALS['TSFE']->config['config']['simulateStaticDocuments_pEnc_onlyP']) {
                            foreach (t3lib_div::trimExplode(',',$GLOBALS['TSFE']->config['config']['simulateStaticDocuments_pEnc_onlyP'],1) as $temp_p) {
                                $GLOBALS['TSFE']->pEncAllowedParamNames[$temp_p]=1;
                            }
                        }

            $this->conf = $GLOBALS['TSFE']->tmpl->setup['plugin.'][$extKey . '.'];
            # cObj
            $GLOBALS['TSFE']->newCObj();                                 
        }
           return $GLOBALS['TSFE']->cObj;
     }
?>
iwyg ·

Ach es ist zum heulen o.O

Die Lösung des Problems liegt wohl darin tslib_cObj vorzugaukeln, es würde vom root der Seite aufgerufen und nicht von root/typo3/, dann sollte filemtime die Datei auch mit relativen Pfad auflösen können.

Angeblich gibt es da API Funktionen für, die ich noch nicht gefunden habe.
Also heißt es weiter graben >.<

iwyg ·

Monolog, Teil 3.
Es ist so unglaublich simpel, dass es schon wirklich peinlich ist.
Wichtig ist nur, vor Aufruf der cObject Funktionen ins richtige Verzeichnis zu wechseln und danach einfach wieder zurück.

An dieser Stelle: danke fürs zuhören.