Zum Inhalt springen

Typoscript Condition - eigene PHP Umgebungsvariable abfragen

Erstellt am 11. Dezember 2008 · 7 Antworten · letzte Antwort am 3. März 2009

Tags: Frage

andimohr ·

Ich setze die newloginbox und Intranet SSO ein.

Durch das SSO ist ein Logout im Intranet nicht möglich, also möchte ich den für SSO Anwender in der Newloginbox ein anderes Template verwenden, in dem der Logout Button nicht angezeigt wird.

In der SSO Intranet klasse tx_wwscssointranet_sv1 setze ich eine "eigene" Umgebunsvariable:

putenv("cv_intranet_benutzer_sso=1");

Nun habe ich eine Condition in meinem TS gebaut die im Fall cv_intranet_benutzer_sso=1 ein anderes Template verwenden soll, das sieht etwa so aus:

[??? cv_intranet_benutzer_sso=1]
 temp.newloginboxConf {
   10 < plugin.tx_newloginbox_pi1 
   10.templateFile = fileadmin/templates/newloginbox_startseite.html
 }
[else]
temp.newloginboxConf {
   10 < plugin.tx_newloginbox_pi1 
   10.templateFile = fileadmin/templates/newloginbox.html
}
[global]

In einer PHP Datei die ich unmittelbar vor dem Plugin in die Seite eingebunden habe kann ich mit getenv("cv_intranet_benutzer_sso"); ganz Prima die Variable abfrage.

Ich habe aber schon eine halbe milliarde Versuche unternommen die Variable in der TS Condition abzufrage, leider ohne Erfolg - den Cache habe ich stets gelöscht:

[globalVar = _GET|tx_wwscssointranet_sv1|cv_intranet_benutzer_sso > 0]
[globalVar = _GET|tx_wwscssointranet_sv1|cv_intranet_benutzer_sso = 1 ]
[globalVar = IENV:cv_intranet_benutzer_sso = 1 ]
[globalVar = ENV:cv_intranet_benutzer_sso = 1]
[globalString = IENV:cv_intranet_benutzer_sso = 1]
[globalString = ENV:cv_intranet_benutzer_sso = 1]
[cv_intranet_benutzer_sso=1]

Es tut nicht 😢

Was mache ich falsch? Kann TypoScript keine PHP Umgebungsvariablen verwenden, die ich "selbst" setze? Oder bin ich nur strunzdoof?

Mir wäre schon sehr geholfen, wenn ich wüsste wie ich ein Typo3 Plugin in meiner PHP Datei Parametrisieren und an den $content anhängen kann. Ich Google aber schon seit Stunden im Kreis herum.

Kann mir jenmand dabei zur Hand gehen? Das sollte etwa so aussehen:

$ssostatus = getenv("cv_intranet_benutzer_sso");

If ($ssostatus == 1) {
  // Template ohne Button Abmelden
  $templateFile = "fileadmin/templates/newloginbox_sso.html;
} Else {
  // Template ohne Button Abmelden
  $templateFile = "fileadmin/templates/newloginbox.html;
}

??? ->plugin.tx_newloginbox_pi1.templateFile = $templateFile;
??? ->plugin.tx_newloginbox_pi1 
$content .= ??? <- newloginbox
andimohr ·

Ich habe das Problem noch nicht lösen können, aber in TS ausgeben lässt sich die Umgebungsvariable:

20 = TEXT
20.data = getenv:cv_intranet_benutzer_sso

In einer Kondition lässt sich die Umgebungsvariable aber ums verrecken nicht einbinden (siehe oben)... auch die folgende Variante ignoriert Typo beflissentlich:

[getenv:cv_intranet_benutzer_sso = 1]
[globalVar = getenv:cv_intranet_benutzer_sso = 1]
[globalString = getenv:cv_intranet_benutzer_sso = 1]

Ich habe sogar eine Userfunction gebastelt: selbst wenn die Funktion nichts anderes macht als return true reagiert dir Kondition nicht... was mache ich falsch???

Hier ist die Kondition:

temp.newloginboxConf = COA

[userFunc = usrCheckSsoStatus(checkSsoStatus)]

  temp.newloginboxConf {
  
    10 < plugin.tx_newloginbox_pi1 
    10.templateFile = fileadmin/templates/newloginbox_sso.html
    10 {
      _LOCAL_LANG.default.oLabel_header_status = 
      _LOCAL_LANG.de.oLabel_header_status = 
      _LOCAL_LANG.default.oLabel_msg_status = 
      _LOCAL_LANG.de.oLabel_msg_status =
    }
    15 = TEXT
    15.value = SSO(1)&nbsp;
    20 = TEXT
    20.data = getenv:cv_intranet_benutzer_sso
  }

[else]

  temp.newloginboxConf {
  
    10 < plugin.tx_newloginbox_pi1 
    10.templateFile = fileadmin/templates/newloginbox.html
    10._LOCAL_LANG.default.oLabel_header_status = Other Page
    10._LOCAL_LANG.de.oLabel_header_status = Sonstige Seite
    15 = TEXT
    15.value = SSO(3)&nbsp;
    20 = TEXT
    20.data = getenv:cv_intranet_benutzer_sso
  }
  
[global]

...und hier die aktuelle Version der userFunc in der localconf.php:

// Userfunctions
function usrCheckSsoStatus($cmd){
	return true;
  //	switch($cmd){
  //		case "checkSsoStatus":
  //			if (strstr(getenv("cv_intranet_benutzer_sso"),"1")){
  //			return true;
  //		}
  //		break;
  //		case "checkSomethingElse":
		// ....
  //		break;
  //	}
}
andimohr ·
just2b schrieb

userfunctions müssen immer mit user_ beginnen IMO

Vielen Dank für den Hinweis - die userfunction wird nun ausgeführt.

[userFunc = user_checkloginstatus(checkssostatus)]
...
[global]

Ich kann aber "meine" PHP Umgebungsvariable offensichtlich in der localconf.php nicht verwenden:

// Die Funtion Funktioniert und liefert erwartetes Ergebnis:
function user_checkloginstatus($cmd){
  switch($cmd) {
    case "checkssostatus":
      if (!isset($test)) {
        return true;
      }
    break;
  }
}

// Die Funktion tut noch immer:
function user_checkloginstatus($cmd){
  $test = 1;
  switch($cmd) {
    case "checkssostatus":
      if ($test==1) {
        return true;
      }
    break;
  }
}

// Die Umgebungsvariable ist empty!
function user_checkloginstatus($cmd){
  $test = getenv("cv_intranet_benutzer_sso");
  switch($cmd) {
    case "checkssostatus":
      if (empty($test)) {
        return true;
      }
    break;
  }
}

Ich kann die Umgebungsvariable aber doch mit TS und PHP im FE anzeigen!
Was muss "man" mit PHP Umgebungsvariablen tun damit sie in TS Konditionen oder in "Typo3 Internen Vorgängen" ausgewertet werden?
- Muss die PHP Umgebungsvariable speziell daklariert werden?
- Muss die Umgebungsvariable mit Verweis auf die Klasse referenziert werden?
- Oder bin ich Opfer eines Typo3 - Logik Fehlers: kann auf die Umgebungsvariable nicht zugegriffen werden aufgrund der Tatsache wo and wann die TS Konditionen ausgeführt werden?

Hier ist ein Ausschnitt aus der Typo3 Klasse in der die PHP Variable gesetzt wird:

...
  class tx_wwscssointranet_sv1 extends tx_sv_authbase {
    var $prefixId = 'tx_wwscssointranet_sv1';    // Same as class name
    var $scriptRelPath = 'sv1/class.tx_wwscssointranet_sv1.php';  // Path to this script relative to the extension dir.
    var $extKey = 'wwsc_sso_intranet';  // The extension key.
...
    function getRemoteUserName() {
      if (array_key_exists('REMOTE_USER', $_SERVER))  {
         $username = $_SERVER['REMOTE_USER'];
         if (array_key_exists('SERVER_SOFTWARE', $_SERVER)) {
           $parts = explode('/', $_SERVER['SERVER_SOFTWARE']);
           if (strcasecmp($parts[0], 'Microsoft-IIS') == 0) {
            if (!strstr($_SERVER['REMOTE_USER'], '\\')) {
               return false;
             }
            list($domain, $username) = 
              explode('\\', $_SERVER['REMOTE_USER']);
           }
         }
-->      putenv("cv_intranet_benutzer_sso=1");
         return $username;
       }
-->      putenv("cv_intranet_benutzer_sso=0");
      return false;
    }
  }
  
...
  
  if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/wwsc_sso_intranet/sv1/class.tx_wwscssointranet_sv1.php'])  {
    include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/wwsc_sso_intranet/sv1/class.tx_wwscssointranet_sv1.php']);
  }
...
andimohr ·

Ich habe mein Problem durch penetrantes herumexperimentieren folgendermassen gelöst:

Ich setze Templavoila und eine ausgelagerte maintemplate.ts.php ein. Dort habe ich in der PAGE Sektion folgendes eingebaut:

page = PAGE
page {
  typeNum = 0
  10 = USER
  10.userFunc = tx_templavoila_pi1->main_page
...
  20 = COA 
  20 {
    6 = TEXT
    6.data = getenv:cv_intranet_benutzer_sso
  }
...
}

Nun kann ich mithilfe meiner userfunction auch auf die PHP Umgebungsvariable zugreifen. Ob ich auch in TS mit Conditions auf die Umgepungsvariable Zugreifen kann weiss ich nicht... ich habe jetzt leider keine Zeit mehr für diese Experimente, komme aber vielleicht später noch mal darauf zurück.

Ich denke das verschachteln innerhalb des COA ist nicht nötig - aber es funktioniert bei mir so und ich will nicht weiter herumprobieren. Ich vermute meine - rein zufällig entdeckte - "Lösung" hat was damit zu tun, dass die Variable hier in Bezug zu einem User oder zur Seite gesetzt wird...

...keine Ahnung :o .

Es wäre 8-) , wenn hier jemand dazu noch Stellung beziehen könnte, der ganz Grundlegend was von Typo3 versteht.

Weil mein Problem durch diese - vielleicht unorthodoxe - herangehensweise gelöst zu sein scheint werde ich diesen Thread als gelöst markieren.

Übrigens wird in meiner Seite der TEXT nicht angezeigt, das ist aber purer Zufall. Wer sich genötigt fühlt das auszuprobieren sollte das "Object 6" im "COA 20" mit einem html tag "Wrappen" das per Style auf display:none setzt - oder er kennt sich besser aus als ich und weiss, wie man die Umgebunsvariable auf unsichtbare weise in der PAGE Sektion "instanziieren" kann.

Viel Erfolg @all
:o

steffenk ·

Hi,

Wenn Du IENV:VARNAME benutzt, wird t3lib_div::getIndpEnv benutzt. Dort werden nur vordefinierte Werte abgefragt.
Um andere Werte abzufragen fehlt eine Kleinigkeit im core, schau Dir mal t3lib_matchcondition an, dort die Funktion getGP_ENV_TSFE. Mit getGlobal liesse sich die Var auslesen, es fehlt in der switch/case ein default.

Mach einen Bugtrackereintrag und ich kümmer mich darum 😉

yokohama ·

hallo zusammen 🙂

sorry, dass ich diesen thread wieder "aufwärme", aber ich interessiere mich brennend für genau dieses thema!

ich schreibe mit einem PHP-script mittels $GLOBALS['XY'] eine globale variable und müsste diese nun in einer condition auswerten (verschiedene inhalte).

soweit ich steffenk hier verstanden habe, müsste ich dafür in der datei t3lib_matchcondition.php die funktion getGP_ENV_TSFE anpassen.
das habe ich auch gemacht, leider ohne wirklichen erfolg.

case 'USERGLOBALS':
        $val = $GLOBALS[$k];
	break;
default:
	$val = $GLOBALS[$k];

(doppelt, nur zum testen)

mein testcode im TS sieht derzeit so aus:

[globalVar = USERGLOBALS:myVar|arrayElement = 14]
page.3 = TEXT
page.3.value = [1]
[else]
page.3 = TEXT
page.3.value = [0]
[global]

da ich leider noch relativ frisch im thema TYPO3 bin, arbeite ich eher nach dem trial and error prinzip...

wenn mir jemand einen hinweis zur lösung des problems geben könnte wäre ich sehr dankbar! 🙂