FE 用户会话在开发人员工具设备模式下不可用

FE user session not available in developer tools device mode

我们对 typo3(版本 6.2)进行了扩展。 在某一点,我们进行了 ajax 调用,我们希望在其中保存一些值。 为了检查用户是否登录,我们使用

$GLOBALS['TSFE']->fe_user->user['userid']

两个测试用户的用户 ID 大于 0。调用的(已编辑)php 如下所示:

<?php
$var = $GLOBALS['TSFE']->fe_user->user['userid'];
if($var > 0) {
    echo "var = ".$var."\n";
    echo "var > 0 - logged in!";
}else{
    echo "var = ".$var."\n";
    echo "var < 1 - not logged in.";
}
?>

我们的问题是,当我们查看page-source时,我们可以从if-condition中看到内容:

var = 1 (or: var = 2)
var > 0 - logged in!

当我们查看控制台(F12)时,我们可以看到else-condition的内容:

var = 
var < 1 - not logged in.

此处变量为空? Apacheerror.log给出通知:

 Trying to get property of non-object in .....

谁能解释一下这是怎么回事?如果是非对象,变量怎么设置为1(或2)?

TYPO3 中的前端用户会话(除非在安装工具中进行了不同的配置)绑定到用户代理。如果您将浏览器控制台设置为另一种设备(例如 iPhone),则浏览器控制台会使用不同的用户代理:

因此用户会话不再适用。

出于开发目的或如果您意识到风险(会话劫持),您可以在安装工具中更改此设置:

A) 如果您使用的代码与 raw PHP 文件中显示的一样,它将无法正常工作$GLOBALS['TSFE'] 对象 NOT 已初始化 - 您没有指定如何处理 AJAX 请求,但 Trying to get property of non-object in ... 清楚地表明了这一点。如果您要提高开发日志级别,您会看到一条通知
Notice: Undefined index: TSFE in /your/path/to/script.php

您应该创建一个前端插件,并通过自定义 typeNum(首选)或使用 eID 机制来处理它eID 在某些情况下可能 更快(更好的性能),但您将有更多的工作要做,因为您仍然需要初始化 TSFE 部件。

B) 如果用户未登录,则 var $GLOBALS['TSFE']->fe_user->userfalse 否则为 Array,您不需要检查用户 ID。

C) 如果你想检查整数值并且你不确定索引是否存在你应该使用
intval($GLOBALS['TSFE']->fe_user->user['uid']) 改为

D) TSFE有一个属性判断FE用户是否登录:

if ($GLOBALS['TSFE']->loginUser) {
    echo "User IS logged";
} else {
    echo "User is NOT logged";
}