[TYPO3-german] globales (nicht pi-Var) autoCacheFields

christian oettinger christian.oettinger at gmx.de
Sat Feb 2 00:18:45 CET 2008


Am Ende doch mit einer User-func. Die ist eigentlich gedacht mehr zu 
leisten, als sie hier tut und vermutlich könnte man mein Problem auch 
mit einer Typoscript-DB-Abfrage lösen, aber jetzt läuft es und ich bin 
glücklich.
Dank an Peter Niederlag für Hilfe und Tips und an Peter Klein für die 
Ur-Vorlage der User-func.

Example 2 unten ist meine jetzige TS-Konfiguration:


---------- complete USER script oe_itemArrayProcFunc.php with example 
configurations: ----------



<?php
/***************************************************************
*  Copyright notice
*
*  (c) 1999-2005 Kasper Skaarhoj (kasperYYYY at typo3.com)
*  All rights reserved
*
*  This script is part of the TYPO3 project. The TYPO3 project is
*  free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  The GNU General Public License can be found at
*  http://www.gnu.org/copyleft/gpl.html.
*  A copy is found in the textfile GPL.txt and important notices to the 
license
*  from the author is found in LICENSE.txt distributed with these scripts.
*
*
*  This script is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
/**
  * This is an example of how to manipulate menu item arrays.
  * Used in the "testsite" package
  *
  * $Id: example_itemArrayProcFunc.php 639 2005-04-13 23:12:04Z mundaun $
  * Revised for TYPO3 3.6 June/2003 by Kasper Skaarhoj
  * XHTML compliant
  *
  * @author	Kasper Skaarhoj <kasperYYYY at typo3.com>
  *
  * Modified by Christian Oettinger. christian.oettinger at gmx.de
  * Modifications based on the script menuFunc.inc by Peter Klein. (all 
the names!)
  * For me it runs with typo3 4.0.4 XXXXX. But please note:
  * I am not too deep into typo3 and do not know if this is as compatible as
  * it should be regarding the core and extensions! Use at your own risk!
  */



/**
  * This function reads the data of a given table with given pid (both 
set in setup, see below)
  * and manipulates $menuArr to give out a Menu Part with a definable 
pi-Var, maybe from another
  * pid, maybe even from another table as 'pages'.
  * It is not a complete Content Object, but only a Menu Object, so you 
can combine "ordinary"
  * menus and (e.g. as submenus) the menus provided by this script. See 
complete TypoScript examples below:
  *
  * EXAMPLE 1:page.15.1 is an "ordinary" menu. Page.15.2 is altered by 
tis script to create a menu from
  * chosen records.
  *
  * ------ Begin Example Typoscript configuration 1: -------------
  *
  * includeLibs.oemenuitems = fileadmin/scripts/oe_itemArrayProcFunc.php
  *
  * page.15.2 = TMENU
  * page.15.2 {
  *    fontColor = #ffffff
  *    expAll = 0
  *    itemArrayProcFunc = user_itemArrayProcFuncTest
  *    itemArrayProcFunc.userFunc.oe_table = {$oe_menu_table}
  *
  *    # bit tricky to explain: The typolink below creates a GET variable to
  *    # choose whi record shall be shown. The name if that GET variable 
is set
  *    # inside of typolink by the line additionalParams.wrap
  *    # In the script we need that name again for NO/ACT-behaviour so here
  *    # we pass the parts of that name to the script. This is done for 
a Standard
  *    # Showuid-Variabel here. Example:
  *    # additionalParams.wrap= &table_whichpi[showUid]=|
  *    # itemArrayProcFunc.userFunc.oe_getvar_part1 = table_whichpi
  *    # itemArrayProcFunc.userFunc.oe_getvar_part2 = showUid
  *
  *    itemArrayProcFunc.userFunc.oe_getvar_part1 = tx_oecertificates_pi1
  *    itemArrayProcFunc.userFunc.oe_getvar_part2 = showUid
  *    itemArrayProcFunc.userFunc.select.pidInList = {$certificatesfolder}
  *    itemArrayProcFunc.userFunc.select.orderBy = sorting
  *
  *    NO {
  *       doNotLinkIt = 1
  *       ATagBeforeWrap = 1
  *       linkWrap = |
  *       stdWrap {
  *          data = field:name
  *          typolink {
  *             wrap = <SPAN class="dritteebene"> | </SPAN><BR>
  *             ATagBeforeWrap = 1
  *             parameter.data = TSFE:id
  *             additionalParams.field= uid
  *             additionalParams.wrap= &tx_oecertificates_pi1[showUid]=|
  *             useCacheHash = 1
  *             maxWidth = 40
  *          }
  *       }
  *      #stdWrap.data = debug:data
  *   }
  *
  *   ACT < .NO
  *   ACT = 1
  *   ACT {
  *       stdWrap {
  *          typolink {
  *          wrap = <SPAN class="womanist3"> |</SPAN><BR>
  *            #wrap = <SPAN class="womanist3"> |</SPAN><BR>
  *             ATagBeforeWrap = 1
  *         }
  *       }
  *    }
  * }
  *
  * ------ End Example Typoscript configuration 1 -------------
  *
  *
  * EXAMPLE 2: GMENU giving out a submenu form another pid (in my eyes 
beats built-in
  * OverrideId, for the possibility of choosing your variable and 
advanced caching-configurations)
  *
  *
  * ------ Begin Example Typoscript configuration 2: -------------

  *
  * includeLibs.oemenuitems = fileadmin/scripts/oe_itemArrayProcFunc.php

  *
  * page.15.25.1 = GMENU
  * page.15.25.1 {
  *    expAll = 0
  *    itemArrayProcFunc = user_itemArrayProcFuncTest
  *    itemArrayProcFunc.userFunc {
  *    	 oe_table = pages
  *
  *       # the follwoing two are a bit tricky to explain: The typolink 
below
  *       # creates a GET variable to choose which record shall be shown.
  *       # The name if that GET variable is set inside of typolink
  *       #  by the line additionalParams.wrap. In the script we
  *       # need that name again for NO/ACT-behaviour so here we pass
  *       # the parts of that name to the script. This is done for a
  *       # pi-Variable here, so easily used in the script. Example:
  *       # additionalParams.wrap= &table_whichpi[showUid]=|
  *       # itemArrayProcFunc.userFunc.oe_getvar_part1 = table_whichpi
  *       # itemArrayProcFunc.userFunc.oe_getvar_part2 = showUid
  *

  *    	 oe_getvar_part1 = tx_oeaimphotos_pi1
  *       oe_getvar_part2 = cat
  *
  *       select {
  *        	pidInList = 5
  *          orderBy = sorting
  *      }
  *    }
  *
  *    NO {
  *       wrap = <li>|</li>
  *       XY = 198,16
  *       backColor = #cecac3
  *       noLink = 1
  *       allStdWrap.typolink {
  *          data = field:name
  *             parameter.data = TSFE:id
  *             additionalParams.field= uid
  *             additionalParams.wrap= &tx_oeaimphotos_pi1[cat]=|
  *             useCacheHash = 1
  *       }
  *       10 = TEXT
  *       10 {
  *      	text.field = title
  * 		    fontFile =
  * 		    ... as usual
  *       }
  *    }
  *    ACT {
  *       noLink = 1
  *       ... as usual
  *    }
  *
  *    # for debug of the menu array:
  *    #stdWrap.data = debug:data
  * }
  * ------ End Example Typoscript configuration 2 -------------
  *
  *
  * Configuration:
  *
  *     itemArrayProcFunc.userFunc.oe_table = {$menu_table}
  *  is used to define, on which table the menu will be based. This is 
vital:
  *  if you configure your Setup to use tis script but Do not choose a 
table, script is terminated.
  *
  *     itemArrayProcFunc.userFunc.oe_getvar_part1
  *     itemArrayProcFunc.userFunc.oe_getvar_part2
  *  bit tricky to explain: The typplink below creates a GET variable to
  *  choose whi record shall be shown. The name if that GET variable is set
  *  inside of typolink by the line additionalParams.wrap
  *  In the script we need that name again for NO/ACT-behaviour so here
  *  we pass the parts of that name to the script. In the end it is simple.
  *  It's just your additionalParams.wrap split in two parts. Example:
  *  additionalParams.wrap= &table_whichpi[showUid]=|
  *  itemArrayProcFunc.userFunc.oe_getvar_part1 = table_whichpi
  *  itemArrayProcFunc.userFunc.oe_getvar_part2 = showUid

  *
  *  itemArrayProcFunc.userFunc.select.pidInList = {$certificatesfolder}
  *  starting point: points to the folder, where the records lie.
  *  though not tested you should be able to combine it with 
userFunc.select.recursive
  *
  *    stdWrap.data = field:name
  *  is used to define, which field of the above table is used to render 
the menu.
  *
  *    itemArrayProcFunc.userFunc.select.orderBy = sorting
  *  Like this of course only possible if you use manual ordernig in 
your extension.
  *  Otherwise the field sorting does not exist and it will not work.
  *
  *
  * @param	array		The $menuArr array which simply is a num-array of page 
records which goes into the menu.
  * @param	array		TypoScript configuration for the function. Notice that 
the property "parentObj" is a reference to the parent (calling) object 
(the tslib_Xmenu class instantiated)
  * @return	array		The modified $menuArr array
  */
function user_itemArrayProcFuncTest($menuArr,$conf)	{
	$lConf = $conf["userFunc."];
$get_vars=t3lib_div::_GET();

$getvar_part1 = $lConf['oe_getvar_part1'];
$getvar_part2 = $lConf['oe_getvar_part2'];
	$oe_actual_record = $get_vars[$getvar_part1][$getvar_part2];
	if ($conf['demoItemStates'])	{		// Used in the example of item states
		reset($menuArr);
		$c=0;
		$teststates=explode(',','NO,ACT,IFSUB,CUR,USR,SPC,USERDEF1,USERDEF2');
		while(list($k,$v)=each($menuArr))	{
			$menuArr[$k]['ITEM_STATE']=$teststates[$c];
			$menuArr[$k]['title'].= ($teststates[$c] ? ' ['.$teststates[$c].']' : 
'');

			$c++;
		}
	} else {	// used in the fake menu item example!		
		if ($lConf['oe_table']) {		// if table is set,
	
			$oe_this_page=$GLOBALS['TSFE']->id;
			#t3lib_div::debug ($lConf);
		
			$menuArr = array(); // resetting the array
			
			$res = 
$GLOBALS['TSFE']->cObj->exec_getQuery($lConf["oe_table"],$lConf["select."]);
			if ($error = $GLOBALS['TYPO3_DB']->sql_error()) {
				$GLOBALS['TT']->setTSlogMessage($error,3);
			} else {
				$GLOBALS['TT']->setTSlogMessage('NUMROWS: 
'.$GLOBALS['TYPO3_DB']->sql_num_rows($res));
				while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
					
					//$row['_OVERRIDE_HREF'] = 'index.php?id='.$oe_this_page;										
					//$row['_ADD_GETVARS'] = '&'.$lConf["oe_table"].'='.$row['uid'];

					if ($row['uid'] == $oe_actual_record) {
						$row['ITEM_STATE'] = 'ACT';
					} else {
						$row['ITEM_STATE'] = 'NO';
					}
					$menuArr[] = $row;

				}
			}
			
		} else {					
								
				die ('user_itemArrayProcFuncTest: you have not set a table. This is 
vital. '.
				 	'Please use itemArrayProcFunc.userFunc.oe_table inside NO in your 
Menu object.');
		}
	}
	#t3lib_div::debug ($menuArr);
	return $menuArr;
}

/**
  * Used in the menu item state example of the "testsite" package at 
page-path "/Intro/TypoScript examples/Menu object examples/Menu state test/"
  *
  * @param	array		The menu item array, $this->I (in the parent object)
  * @param	array		TypoScript configuration for the function. Notice that 
the property "parentObj" is a reference to the parent (calling) object 
(the tslib_Xmenu class instantiated)
  * @return	array		The processed $I array returned (and stored in 
$this->I of the parent object again)
  * @see tslib_menu::userProcess(), tslib_tmenu::writeMenu(), 
tslib_gmenu::writeMenu()
  */
function user_IProcFuncTest($I,$conf)	{
	$itemRow = $conf['parentObj']->menuArr[$I['key']];

		// Setting the document status content to the value of the page title 
on mouse over
	$I['linkHREF']['onMouseover'].='extraRollover(\''.rawurlencode($itemRow['title']).'\');';
	$conf['parentObj']->I = $I;
	$conf['parentObj']->setATagParts();
	$I = $conf['parentObj']->I;
	if ($I['parts']['ATag_begin'])	$I['parts']['ATag_begin']=$I['A1'];

	if ($conf['debug'])	{
			// Outputting for debug example:
		echo 'ITEM: <h2>'.htmlspecialchars($itemRow['uid'].': 
'.$itemRow['title']).'</h2>';
		t3lib_div::debug($itemRow);
		t3lib_div::debug($I);
		echo '<hr />';
	}
		// Returns:
	return $I;
}


?>


More information about the TYPO3-german mailing list