CObject im Backend

Wer häufiger mal Module für das TYPO3-Backend entwickelt, hat sich sicherlich auch schonmal daran gestoßen, dass es im Backend keinen Zugriff auf das cObject gibt, wie man es beispielsweise aus dem Frontend kennt.

$this->cObj->HMENU($this->conf['menu']);

Im Folgendem beschreibe ich kurz, wie man ein Objekt der Klasse tslib_cObj im Backend erstellt.

Zunächst braucht man eine Klasse tx_makeCObj, welche wie folgt aussieht:

define('PATH_tslib', PATH_site.'typo3/sysext/cms/tslib/');

class tx_makecObj{
	function createCObj($pid = 1){
		require_once(PATH_site.'typo3/sysext/cms/tslib/class.tslib_fe.php');
		require_once(PATH_site.'t3lib/class.t3lib_userauth.php');
		require_once(PATH_site.'typo3/sysext/cms/tslib/class.tslib_feuserauth.php');
		require_once(PATH_site.'t3lib/class.t3lib_cs.php');
		require_once(PATH_site.'typo3/sysext/cms/tslib/class.tslib_content.php') ;
		require_once(PATH_site.'t3lib/class.t3lib_tstemplate.php');
		require_once(PATH_site.'t3lib/class.t3lib_page.php');
		require_once(PATH_site.'t3lib/class.t3lib_timetrack.php');

		// Finds the TSFE classname
		$TSFEclassName = t3lib_div::makeInstanceClassName('tslib_fe');

		// Create the TSFE class.
		$GLOBALS['TSFE'] = new $TSFEclassName($GLOBALS['TYPO3_CONF_VARS'], $pid, '0', 0, '','','','');

		$temp_TTclassName = t3lib_div::makeInstanceClassName('t3lib_timeTrack');
		$GLOBALS['TT'] = new $temp_TTclassName();
		$GLOBALS['TT']->start();

		$GLOBALS['TSFE']->config['config']['language']=$_GET['L'];

		// Fire all the required function to get the typo3 FE all set up.
		$GLOBALS['TSFE']->id = $pid;
		$GLOBALS['TSFE']->connectToMySQL();

		// Prevent mysql debug messages from messing up the output
		$sqlDebug = $GLOBALS['TYPO3_DB']->debugOutput;
		$GLOBALS['TYPO3_DB']->debugOutput = false;

		$GLOBALS['TSFE']->initLLVars();
		$GLOBALS['TSFE']->initFEuser();

		// Look up the page
		$GLOBALS['TSFE']->sys_page = t3lib_div::makeInstance('t3lib_pageSelect');
		$GLOBALS['TSFE']->sys_page->init($GLOBALS['TSFE']->showHiddenPage);

		// If the page is not found (if the page is a sysfolder, etc), then return no URL, preventing any further processing which would result in an error page.
		$page = $GLOBALS['TSFE']->sys_page->getPage($pid);

		if (count($page) == 0) {
			$GLOBALS['TYPO3_DB']->debugOutput = $sqlDebug;
			return false;
		}

		// If the page is a shortcut, look up the page to which the shortcut references, and do the same check as above.
		if ($page['doktype']==4 && count($GLOBALS['TSFE']->getPageShortcut($page['shortcut'],$page['shortcut_mode'],$page['uid'])) == 0) {
			$GLOBALS['TYPO3_DB']->debugOutput = $sqlDebug;
			return false;
		}

		// Spacer pages and sysfolders result in a page not found page too...
		if ($page['doktype'] == 199 || $page['doktype'] == 254) {
			$GLOBALS['TYPO3_DB']->debugOutput = $sqlDebug;
			return false;
		}

		$GLOBALS['TSFE']->getPageAndRootline();
		$GLOBALS['TSFE']->initTemplate();
		$GLOBALS['TSFE']->forceTemplateParsing = 1;

		// Find the root template
		$GLOBALS['TSFE']->tmpl->start($GLOBALS['TSFE']->rootLine);

		// Fill the pSetup from the same variables from the same location as where tslib_fe->getConfigArray will get them, so they can be checked before this function is called
		$GLOBALS['TSFE']->sPre = $GLOBALS['TSFE']->tmpl->setup['types.'][$GLOBALS['TSFE']->type];	 // toplevel - objArrayName
		$GLOBALS['TSFE']->pSetup = $GLOBALS['TSFE']->tmpl->setup[$GLOBALS['TSFE']->sPre.'.'];

		// If there is no root template found, there is no point in continuing which would result in a 'template not found' page and then call exit php. Then there would be no clickmenu at all.
		// And the same applies if pSetup is empty, which would result in a "The page is not configured" message.
		if (!$GLOBALS['TSFE']->tmpl->loaded || ($GLOBALS['TSFE']->tmpl->loaded && !$GLOBALS['TSFE']->pSetup)) {
			$GLOBALS['TYPO3_DB']->debugOutput = $sqlDebug;
			return false;
		}

		$GLOBALS['TSFE']->getConfigArray();
		$GLOBALS['TSFE']->getCompressedTCarray();

		$GLOBALS['TSFE']->inituserGroups();
		$GLOBALS['TSFE']->connectToDB();
		$GLOBALS['TSFE']->determineId();

		return $GLOBALS['TSFE']->newCObj();
	}
}

Mit dieser Klasse kann man nun sehr einfach ein Objekt der Klasse cObj im Backend erzeugen und verwenden. Voraussetzung der Methode ist allerdings die Übergabe einer pid, welche im Frontend existiert. Das in der jeweiligen Seite vorliegende TypoScript ist verantwortlich für den resultierenden Code im Backend.
Hier ein Beispiel, um ein Menü zu erzeugen.

 	$TS = array();
 	$TS['special'] = "directory";
	$TS['special.']['value'] = $this->destinationRoot;
	$TS['1'] = "TMENU";
	$TS['1.']['NO'] = "1";
	$TS['1.']['NO.']['ATagTitle.']['field'] = "uid";

 	$cObj = &$this->createCObj();
	$menu = $cObj->HMENU($TS);

In der Realität ist natürlich häufig ein Drop-Down-Menü oder ähnliches gefragt. Aber jetzt hat man ja ein cObject und die Mittel von TypoScript sind ja quasi grenzenlos. 🙂

Hinterlasse einen Kommentar

7 Kommentare auf "CObject im Backend"

Benachrichtige mich zu:
avatar

Sortiert nach:   neuste | älteste | beste Bewertung
trackback
9 Jahre 2 Monate her

CObject im Backend verwenden…

Wer häufiger mal Module für das TYPO3-Backend entwicklet, hat sich sicherlich auch schonmal daran gestoßen, dass es im Backend keinen Zugriff auf das cObject gibt, wie man es beispielsweise aus dem Frontend kennt. $this->cObj->HMENU($this->conf[‚me…

Iljitsch
Gast
8 Jahre 9 Monate her

So leicht ist es leider nicht – zum einen ist „return $GLOBALS[‘TSFE’]->newCObj();“ unpraktikabel da die Funktion „newCObj()“ garnix zurück gibt. Zum anderen ist das cObj unbrauchbar wenn es darum geht mit Workspaces oder Versioning zu arbeiten.
Viele Grüße

Alexander Reiß
Gast
8 Jahre 9 Monate her

Guten Tag,
ich habe die CLASSE tx_makecObj in meine index.php Datei meines Backend EXT kopiert.

Wie kann ich jetzt aus meiner CLASSE
>> class tx_ext_name_module1 extends t3lib_SCbase <> $cObj = tx_makecObj::createCObj(); <> Call to a member function IMAGE() on a non-object in <IMAGE($img)

hat da einer ne Idee?

Alexander Reiß
Gast
8 Jahre 9 Monate her

Guten Tag,
ich habe die CLASSE tx_makecObj in meine index.php Datei meines Backend EXT kopiert.

Wie kann ich jetzt aus meiner CLASSE

class tx_ext_name_module1 extends t3lib_SCbase

darauf Zugriefen?

$cObj = tx_makecObj::createCObj();

scheint nicht richtig zu sein
Fehlermeldung:
Call to a member function IMAGE() on a non-object in

Mir geht es darum folgenden Code ans laufen zu bringen
$img = array();
$img[‚file‘] = $pfad;
$img[‚file.‘][‚maxW‘] = 100;// WEITE
$img[‚file.‘][‚maxH‘] = 100;// Höhe
$cObj->IMAGE($img)

hat da einer ne Idee?

Hauke
Gast
Hauke
8 Jahre 2 Monate her

Die Klasse bringt es bei mir auch nicht. Nur non-object…

skipjack
Gast
skipjack
7 Jahre 3 Monate her
Danke für den Code, leider funktionierte die Klasse nicht direkt. Ich hab ein paar Korrekturen gemacht. Hier mal das vollständige zur Zeit (TYPO3 4.3.3, PHP 5.3.2) funktionierende Beispiel: createCObj(); // http://www.typo3-scout.de/2008/05/28/cobject-im-backend/ define('PATH_tslib', PATH_site.'typo3/sysext/cms/tslib/'); class tx_makecObj { function &createCObj($pid = 875) { require_once (PATH_site.'typo3/sysext/cms/tslib/class.tslib_fe.php'); require_once (PATH_site.'t3lib/class.t3lib_userauth.php'); require_once (PATH_site.'typo3/sysext/cms/tslib/class.tslib_feuserauth.php'); require_once (PATH_site.'t3lib/class.t3lib_cs.php'); require_once (PATH_site.'typo3/sysext/cms/tslib/class.tslib_content.php'); require_once (PATH_site.'t3lib/class.t3lib_tstemplate.php'); require_once (PATH_site.'t3lib/class.t3lib_page.php'); require_once (PATH_site.'t3lib/class.t3lib_timetrack.php'); // Finds the TSFE classname // $TSFEclassName = t3lib_div::makeInstance('tslib_fe'); // Create the TSFE class. // $GLOBALS['TSFE'] = new $TSFEclassName($GLOBALS['TYPO3_CONF_VARS'], $pid, '0', 0, '','','',''); $GLOBALS['TSFE'] = t3lib_div::makeInstance('tslib_fe', $GLOBALS['TYPO3_CONF_VARS'], $pid, '0', 0, '','','',''); // $temp_TTclassName = t3lib_div::makeInstance('t3lib_timeTrack'); // $GLOBALS['TT'] = new $temp_TTclassName(); $GLOBALS['TT'] = t3lib_div::makeInstance('t3lib_timeTrack');… Read more »
skipjack
Gast
skipjack
7 Jahre 3 Monate her

Für die jenigen die das „TYPO3 CachingFramework“ nutzen,

muss als erstes das TimeTrack Objekt erstellt werden und dann das Frontend Rendering Objekt also:

$GLOBALS[‚TT‘] = t3lib_div::makeInstance(‚t3lib_timeTrack‘);
$GLOBALS[‚TT‘]->start();

$GLOBALS[‚TSFE‘] = t3lib_div::makeInstance(‚tslib_fe‘, $GLOBALS[‚TYPO3_CONF_VARS‘], $pid, ‚0‘, 0, “,“,“,“);

wpDiscuz
Weitere Beiträge zum Thema
Unser neuester Magento-Shop ist online: Sanetta
Usability auf Landingpages Teil 3
Zend-TwoLevels-Cache speichert Einträge unbegrenzt
Formulare optimieren und Conversion-Rate steigern