向 Prestashop 1.6 中的特定客户发送带有 BO link 的邮件给管理员

Send a mail to Admin with a BO link to specific customer in Prestashop 1.6

在 Prestashop 1.6 中,我必须从 FrontController 向商店管理员发送邮件。

这部分工作正常,但我在将 link 添加到特定客户的管理页面时遇到了问题。

我唯一想念的是管理目录的名称。我将能够解析和连接 PS_ADMIN_DIR 常量,但它在 FrontController 中不可用。

我有点卡在这里了。

这是代码:

$admin_customer_link = 
    _PS_BASE_URL_
    .__PS_BASE_URI__
    /* Missing the Administration directory name here */
    .$this->context->link->getAdminLink('AdminCustomers', false)
    ."&id_customer=".(int)$customer->id."&viewcustomer";

我得到的输出:

http://127.0.0.1:8080/prestashop/index.php?controller=AdminCustomers&id_customer=2&viewcustomer

我需要的输出:

http://127.0.0.1:8080/prestashop/administration/index.php?controller=AdminCustomers&id_customer=2&viewcustomer

如有任何帮助,我们将不胜感激。

没有(标准的)方法可以从前端控制器知道管理文件夹,否则所有的安全措施都会冲进马桶:)。

你可以做的是从模块 'configuration' 或安装它时检索管理文件夹,并将其保存在某个地方,目前我建议进入数据库,但也许有更安全的模式.

类似于:

public function install()
{
    // your stuff
    $current_dir = $_SERVER['PHP_SELF']; // this give you the current dir (administration folder included)
    $administration_folder = /* Clean your string with a string replace or preg */
    Configuration::updateValue('PS_MYMOD_ADMIN_DIR', $administration_folder);
    return true;
}

然后在您的前端控制器中通过以下方式检索它:

$adminfolder = Configuration::get('PS_MYMOD_ADMIN_DIR');

但是我希望您知道您正在通过电子邮件制造安全漏洞...

希望对您有所帮助

由于从前端使用管理目录名称并在电子邮件中向管理发送 link 出于安全目的并不是一个好主意,我选择以另一种方式实现。

我没有通过电子邮件将管理客户的页面 link 发送给网站管理员,而是创建了一个新的客户线程和消息。之后,我给客户服务发了一封电子邮件。因此,当他们登录后台时,他们会看到一条新通知,将他们引导至特定用户。

这是代码:

ModuleFrontController

// Create a new Customer Thread
$ct = new CustomerThread();
if (isset($customer->id)) {
     $ct->id_customer = (int)$customer->id;
}
$ct->id_shop = (int)$this->context->shop->id;
$ct->id_contact = $contact->id;
$ct->id_lang = (int)$this->context->language->id;
$ct->email = $customer->email;
$ct->status = 'open';
$ct->token = Tools::passwdGen(12);
$ct->add();

// Add a new message to the Customer Thread
if ($ct->id) {
    $cm = new CustomerMessage();
    $cm->id_customer_thread = $ct->id;
    $cm->message = $message;
    $cm->ip_address = (int)ip2long(Tools::getRemoteAddr());
    $cm->user_agent = $_SERVER['HTTP_USER_AGENT'];
    $cm->add();
}

希望对遇到同样情况的人有所帮助。