在目录部分 (Opencart) 获取登录的用户名

Get logged Username on Catalog Section (Opencart)

有人知道如何在目录部分获取登录用户名 admin 吗?我试过注入会话,但没有用。已经尝试获取用户 ID,但仍然无法正常工作。我需要在 addOrderHistory 方法上添加登录用户名。我正在使用 Opencart 2.3.0.2

附加信息:Opencart 2.3.0.2 从目录中的控制器 api 调用方法 addOrderHistory,问题是我无法在目录中获取管理员用户 ID,因为它具有分隔符 session/function

admin 和 catalog 是分开的。如果您想在目录(前端)中获取管理员的用户 ID,请在您的控制器文件中使用:

$this->user = new Cart\User($this->registry);
$user_id = $this->user->getId(); // Returns null  or user ID

更多信息: https://forum.opencart.com/viewtopic.php?f=202&t=207563

默认情况下,admin User class 不会在前端实例化,所以这里有几个选项。

选项 1:直接从会话中获取管理员 user_id。如果此人是已登录的管理员用户,您只需要知道 user_id and/or,这是最简单的事情。管理员的 user_id 存储为会话变量,并且可以作为 $this->session->data['user_id'] 全局访问。当然它可能不存在,所以你需要检查。

if (isset($this->session->data['user_id'])) {
    $user_id = $this->session->data['user_id'];
}

选项 2:您实际要求的是获取 用户名。为此,您需要实例化 User class 并将 $registry 对象作为参数传递给构造函数。如果您使用 PHP 5.4 或更高版本,您可以执行此操作并通过将新创建的对象包装在括号中直接调用它的方法,如图 here:

$username = (new Cart\User($this->registry))->getUsername();

在 PHP 的早期版本中,您可以以传统方式实例化 class 并调用它的方法:

$this->user = new Cart\User($this->registry);
$username   = $this->user->getUsername();
$user_id    = $this->user->getId();
$user_group = $this->user->getGroupId();

您可以在控制器或模型中的任何位置即时执行此操作,但如果您认为需要经常访问前端的 User 方法,最好的位置是 catalog/controller/startup/startup.php 并使用 registry class 注册它,这使得它可以在全球范围内访问:

$this->registry->set('user', new Cart\User($this->registry));

然后你可以随时随地在商店前端调用它,比如:

$this->user->getUsername();

一个非常重要的警告 这里涉及到您希望从您的 addOrderHistory() 方法中获取此数据题。您需要记住,此方法可能会作为回调的一部分被多种支付方式调用——例如 Paypal Standard。在这种情况下,方法是 not 由客户的浏览器会话调用,因此即使是管理员正在签出,也不会被能够访问管理员的会话。如果您绝对需要获取有关正在结帐的管理员的数据,则需要在 addOrder() 方法中执行此操作,因为它总是直接从浏览器会话中调用。

更新 — 通过 api 获取管理员用户名: 如果您通过 API,Opencart 使用 catalog/controller/api/login.php 创建一个新会话。由于此 api 会话在默认情况下对您的管理会话一无所知,因此您需要在其中添加 user_id 才能使我上面描述的方法起作用。查看该文件,您会看到如下一行(启动 api 会话):

$this->session->start('api', $session_id_new);

您需要修改内容以捕获您的用户 ID。像这样:

// store user_id from admin session
$user_id = $this->session->data['user_id'];
// start the api session
this->session->start('api', $session_id_new);
// add admin user_id to your api session
$this->session->data['user_id'] = $user_id;

现在您的管理员 user_id 是 api 会话的一部分,因此您可以继续实例化用户 class,如上所述。